Geändert von Bomberpilot (18.12.2014 um 11:31 Uhr)
Hallo,
Dies ist sehr unwahrscheinlich, wenn man sich das Übertragungsprotoll mal angesehen hat.
Die Impulse werden direkt hintereinander gesendet. Alles andere am Ausgang ist nur Möglich wenn zwischengespeichert wird.
Die einzig mögliche Überschneidung bewegt sich im Bereich der Laufzeit-Differenzen des I/O-Ports.
Softwaremässig ist es am Einfachsten eine 1 durch das Port, bzw. eine Variable, zu schieben.
Drumrum braucht es natürlich noch Timeouts, um Störungen zu erkennen und simulierte ISR um in diesem Fall Standardstellungen an die Servos auszugeben.Code:unsigned char Out; void sync(void) { Out = 0x1; Port = 0x00; } ISR_Flanke(void) { Port = Out; Out <<= 1; {
MfG Peter(TOO)
- - - Aktualisiert - - -
Hallo,
Jo, für beide!
Im Prinzip produziert die Schaltung immer zwei Impulse, aber dies überlagern sich.
Die obere Hälft erzeugt z.B. aus der fallenden Flanke von Kanal1 einen Impuls und gleichzeitig erzeugt die untere Hälfte einen aus der steigenden Flanke von Kanal2.
MfG Peter(TOO)
Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?
Genau so läuft derzeit ja auch meine Ausgabe.
Und vermutlich gestaltet auch der Controller im Empfänger die Ausgabe so, sonst würden sich ja Pausen zwischen den Pulsen ergeben. Nur durch direktes Weiterschieben des Bits kann das direkt ohne Pause fabriziert werden.
Wie gesagt, ich werde heute Abend mal die Methode mit 2 Matrixen und 2 INTs testen.
Und wenn das nicht läuft wie ich das gerne hätte die Methode mit den beiden 74##ern.
Wobei mir 2 belegte INTs lieber sind, als 2 zusätliche ICs
Gruß Basti
Was mach ich falsch, das lauter wirre Zahlen bei rauskommen?
Erst mal nur ein INT der Kanäle 1,3,5...
Code:$regfile "m32def.dat"$baud = 9600 $crystal = 16000000 $framesize = 32 $swstack = 32 $hwstack = 64 Config Porta.0 = Output Config Timer0 = Timer , Prescale = 256 'Läuft etwa alle 4 ms über Config Int0 = Rising On Int0 Int0_isr On Timer0 T0_ovf Dim Ch_cnt As Byte Dim Sig(3) As Byte Enable Int0 Enable Timer0 Start Timer0 Enable Interrupts Do Waitms 200 Print Sig(1) ; "," ; Sig(2) ; "," ; Sig(3) Loop End Int0_isr: If Ch_cnt > 0 Then Sig(ch_cnt) = Timer0 'Bei erster Flanke soll erst mal nur der Timer auf 0 gestellt werden, bei weiteren dann Wert gespeichert werden Timer0 = 0 'Timer auf 0 stellen Incr Ch_cnt 'Kanal Zähler erhöhen If Ch_cnt = 3 Then Config Int0 = Falling 'Wenn alle 3 Pulse durch sind, INT0 auf fallende Flanke setzen für letzten Puls Return T0_ovf: Config Int0 = Rising 'Wieder auf steigende Flanke Ch_cnt = 0 'Kanalzähler auf 0 'um auf dem Oszi einen Überlauf des Timers zu sehen Porta.0 = 1 Waitus 25 Porta.0 = 0 Return
Geändert von Bomberpilot (18.12.2014 um 19:05 Uhr)
Bei 2 Interrupts kann man ICP und den analogen Komparator (Vergleich mit 1,1 V Ref intern) nutzen. Auf den beiden Pins kann man die ICP Funktion nutzen, und damit wenigstens die Messung unabhängig von Latenzzeiten machen, ggf. auch ganz ohne Interrupts.
Hab gestern noch 2 Stunden probiert, irgendwie bekomm ich nur sinnlose Werte raus :-/
Wie viel würde es denn wohl etwa an Ressourcen bringen, auf C umzusteigen?
Gruß Basti
Bevor Du da die Flinte ins Korn wirfst, guck doch erst mal wo es hängt.Hab gestern noch 2 Stunden probiert, irgendwie bekomm ich nur sinnlose Werte raus
Simulieren heisst hier das Zauberwort.
Auch ein mit Bascom generiertes Programm sollte sich mit AVR Studio simulieren lassen.
Dann kriegst Du schon raus ob es ein Timing Problem, oder ein Softwarefehler ist.
Niemals! Dann wirds ja nie fertig. Außerdem kann man ne Flinte immer mal gebrauchen...
Ich hoff übers Wochenende, oder dann über die Feiertage findet sich ein bisschen Zeit da noch etwas rumzuprobieren.
Evtl. bekomm ich das Programm ja im AVR Studio Sim zum laufen, muss ich mal schaun.
Gruß Basti
Lesezeichen