...joar... ich habe ein kleines Problem...
Ich habe einen Tiny44 welcher einfach eine Software PWM für 3 LED (RGB)
zur Verfügung stellt. Leider jedoch muß ich meinen 8Bit Timer ohne
Prescaler laufen lassen, welches den Tiny dann doch recht hart in die
Knie zwingt.
Mit dem Oszi und dem Multimeter nachgemessen, ergaben sich ohne
Prescaler gerade mal ~122Hz an den Pins, bei 8Mhz internem Takt.
Ich finde das schon recht wenig. Könnte jemand kurz über den Code
schauen und sagen ob ich eventuell versuche dem falschen Lösungsansatz
zu folgen?!
Rene K. schrieb:> Mit dem Oszi und dem Multimeter nachgemessen, ergaben sich ohne> Prescaler gerade mal ~122Hz an den Pins, bei 8Mhz internem Takt.
Das klingt jetzt nicht unbedingt falsch - kannst ja mal einen
Taschenrechner nehmen und das durchrechnen =)
Ahhh..... Geistesblitz komme -.-
Ich lasse ja den Timer bis 256 überlaufen UND Runner als PWM Signal bis
256 laufen....
Man man, manchmal sieht man echt den Wald vor lauter Bäumen net mehr -.-
In der GenRandom Funktion sind auch nochmal 2 Delays drinne. Für was
sind die denn gut?
Ich hab ein 32fach PWM mit je 32 Schritten auf dem ATTiny88 (8MHz)
laufen und bekomm pro Ausgang 500Hz PWM Frequenz.
Genug Power hat der µC also.
Gruß Joachim
wenns dann nochmal schneller werden muss eignet sich an der stelle auch
ein wenig asm...
Gerade wenn man mehr als einen PWM Kanal hat kann man das folgendermaßen
machen:
cp counter, pwm1 //carry wird gesetzt wenn counter > pwm1
rol r_tmp //bit0 ist gesetzt wenn counter > pwm1
cp counter, pwm2
rol r_tmp
...
out PORTX, r_tmp //bit0 wenn counter > pwm2, bit1 wenn counter > pwm1
Man braucht also pro Kanal nur noch 1x cp, 1x rol und vermutlich
irgendwo ein paar lds. Dazu kommt noch ein out. Macht 3 + Kanalanzahl*4
Takte
Damit schafft man dann doch einiges.
Dein Compiler macht "unsigned short" wirklich als 8Bit?
Sehr ungewöhnlich.
Laut C-Standard muß "unsigned short" mindestens 16-bittig sein.
Nur "unsigned char" darf 8-bittig sein.
Besser ist aber "uint8_t" zu verwenden.
Peter
Ich habe nun ein Comparematch eingefügt, den Vorteiler auf 8 und somit
noch einige Resourcen offen.
yx<bcx schrieb:> 20ms Delay sollten doch eigentlich nur noch 50 Hz ergeben?>> yx<bcx
Ist für die PWM Erzeugung relativ uninteressant. Da die Frequenz
ausschließlich in der Interruptroutine generiert wird.
Joachim schrieb:> In der GenRandom Funktion sind auch nochmal 2 Delays drinne. Für was> sind die denn gut?
Eigentlich nur um einen relativ unaufwendigen Randomizer zu bekommen. Er
übernimmt einfach nur die Werte vom Runner der interruptroutine.
Funktioniert eigentlich ganz gut, im ferigen Code wird dies natürlich
nicht vorkommen, da der Tiny durch einen anderen µC gesteuert wird.
Joachim schrieb:> Ich hab ein 32fach PWM mit je 32 Schritten auf dem ATTiny88 (8MHz)> laufen und bekomm pro Ausgang 500Hz PWM Frequenz.>> Genug Power hat der µC also.
Jaja, das ist mir durchaus bewußt, das solch ein µC dies eigentlich
links aus der Hüfte schaffen sollte.
sven schrieb:> wenns dann nochmal schneller werden muss eignet sich an der stelle auch> ein wenig asm...>> Gerade wenn man mehr als einen PWM Kanal hat kann man das folgendermaßen> machen:>>> cp counter, pwm1 //carry wird gesetzt wenn counter > pwm1> rol r_tmp //bit0 ist gesetzt wenn counter > pwm1>> cp counter, pwm2> rol r_tmp> ...> out PORTX, r_tmp //bit0 wenn counter > pwm2, bit1 wenn counter > pwm1>>> Man braucht also pro Kanal nur noch 1x cp, 1x rol und vermutlich> irgendwo ein paar lds. Dazu kommt noch ein out. Macht 3 + Kanalanzahl*4> Takte>> Damit schafft man dann doch einiges.
Wirklich ein sehr sehr guter Ansatz! Damit werde ich mich mal
auseinandersetzen!
Peter Dannegger schrieb:> Dein Compiler macht "unsigned short" wirklich als 8Bit?> Sehr ungewöhnlich.>> Laut C-Standard muß "unsigned short" mindestens 16-bittig sein.> Nur "unsigned char" darf 8-bittig sein.> Besser ist aber "uint8_t" zu verwenden.>>> Peter
Jep, bei meinem Compiler (MicroC PRO AVR) ist short 8bit / 1Byte groß.
Hier mal die übersicht, float und double haben 4byte:
bit 1–bit 0 or 1
sbit 1–bit 0 or 1
(unsigned) char 1 0 .. 255
signed char 1 -128 .. 127
(signed) short (int) 1 -128 .. 127
unsigned short (int) 1 0 .. 255
(signed) int 2 -32768 .. 32767
unsigned (int) 2 0 .. 65535
(signed) long (int) 4 -2147483648 .. 2147483647
unsigned long (int) 4 0 .. 4294967295