Thalhammer
29.08.2014, 12:31
Hallo,
Mein Project besteht zurzeit darin einen Stripe mit TM1829 im LowSpeed Modus(800khz) mithilfe eines Xmega anzusteuern.
Zur Verfügung steht PORTE mit der dortigen Hardware (USART mitr SPI Funktion,16bit Timer mit Compare).
Das Timing wird hier ausführlich beschrieben:
http://www.dmx4you.de/dmx2ledstripe/DMX-2-LED-Stripe.htm
Dort steht das ein Low impuls für eine 0 nur 300ns sekunden lang ist.
Damit bleiben mir grademal 10 takte um den port auf low und wieder auf high zu schalten, was bedeutet das C und neuladen des Timers schonmal rausfällt.
Nehmen wir mal PORTE.PIN1.
Bedeutet wenn ich mir eine funktion schreibe die ungefähr so ausschaut:
ldi r16,0b00000001
sts PORTE_OUTCLR,r16
nop
nop
nop
nop
nop
nop
nop
nop
sts PORTE_OUTSET,r16
Sollte ich doch genau auf meine 10 takte kommen oder ?
STS braucht ja 2 takte und nop 1.
Anschließend hab ich (wieder in c) ja genügend zeit meinen nächsten Timerinterrupt einzustellen.
Natürlich könnte man statt der nops auch was sinnvolleres machen: z.b. bestimmen, ob ich jetzt 300ns oder 800ns (bei einem highbit) warten muss, oder die Zeit bis zum nächsten interrupt berechnen.
Solange man es in asm macht und die 8 takte pause nicht überschreitet is es ja kein problem....
Leider hab ich kein Oszi um das ergebnis zu prüfen.
Stimmt das so oder hab ich da einen Fehler in meiner logik ?
Mein Project besteht zurzeit darin einen Stripe mit TM1829 im LowSpeed Modus(800khz) mithilfe eines Xmega anzusteuern.
Zur Verfügung steht PORTE mit der dortigen Hardware (USART mitr SPI Funktion,16bit Timer mit Compare).
Das Timing wird hier ausführlich beschrieben:
http://www.dmx4you.de/dmx2ledstripe/DMX-2-LED-Stripe.htm
Dort steht das ein Low impuls für eine 0 nur 300ns sekunden lang ist.
Damit bleiben mir grademal 10 takte um den port auf low und wieder auf high zu schalten, was bedeutet das C und neuladen des Timers schonmal rausfällt.
Nehmen wir mal PORTE.PIN1.
Bedeutet wenn ich mir eine funktion schreibe die ungefähr so ausschaut:
ldi r16,0b00000001
sts PORTE_OUTCLR,r16
nop
nop
nop
nop
nop
nop
nop
nop
sts PORTE_OUTSET,r16
Sollte ich doch genau auf meine 10 takte kommen oder ?
STS braucht ja 2 takte und nop 1.
Anschließend hab ich (wieder in c) ja genügend zeit meinen nächsten Timerinterrupt einzustellen.
Natürlich könnte man statt der nops auch was sinnvolleres machen: z.b. bestimmen, ob ich jetzt 300ns oder 800ns (bei einem highbit) warten muss, oder die Zeit bis zum nächsten interrupt berechnen.
Solange man es in asm macht und die 8 takte pause nicht überschreitet is es ja kein problem....
Leider hab ich kein Oszi um das ergebnis zu prüfen.
Stimmt das so oder hab ich da einen Fehler in meiner logik ?