Hallo,
ich habe hier ein kleines Problem, bei dem ich nicht weiterkomme -
vielleicht hat ja einer einen Denkanstoß für mich.
Also, ich will eine RGB-Led so richtig schön mit Übergängen ansteuern
und habe mir dafür an Timer2 und Timer3 je an die OCRs einen FET mit
jeweiligen Farbe drangebaut. Die Timer betreibe ich mit 8 Bit (der
Timer2 kann eh nicht mehr), normaler FastPWM, die OCR sind auch gemappt.
Wenn ich einen Wert in das OCR-Register schreibe, kommt aus der Hardware
auch sauber die PWM raus.
Dann habe ich mir eine Interpolatorroutine gebaut, die zwischen zwei
RGB-Werten linear interpoliert und die ich alle 20ms aufrufe. Den
Interpolationswert schreibe ich dann in die OCR-Register. Das kann ich
am Simulator wunderbar nachvollziehen - es fällt der richtige Wert aus
der Routine raus, die OCR2 bzw. OCR3AL und OCR3BL stehen richtig und
wandern auch brav bei jedem Durchlauf mit.
Lade ich aber das in die Hardware, kommt immer Fullscale raus. Zum
Gegencheck habe ich mal das Rechenergebnis einfach mit 7F maskiert - ja,
dann kommt halt 7F raus, maskiere ich anders, ja es kommt so raus. Auch
die 20ms habe ich überprüft - alles okay - es ist einfach das
Rechenergebnis nicht mit dem Simulator konform. Ach ja, Data Space
(Stack) ist noch genug da. (AVR GCC, 37% Data usage)
Irgendwie begreife ich das nicht. Im Simulator ist alles paletti, die
Hardware funktioniert (ich kann 'zu Fuß' PWM-Werte ausgeben), aber das
Interpolationsergebnis scheint immer 0xFF zu sein. Gibt es da ev.
Errata, die man kennen sollte?
Den Code poste ich mal noch nicht, ist etwas umfangreicher.
Frustriert ... Wolfgang
libm eingebunden?
du machst hier Rechnungen mit Multiplikationen und Divisionen ...
und falls jetzt kommt da sind keine floats drin:
#define CALC_GAIN 128L ist ein float ...
gruss
soundso schrieb:> libm eingebunden?>> du machst hier Rechnungen mit Multiplikationen und Divisionen ...>> und falls jetzt kommt da sind keine floats drin:>> #define CALC_GAIN 128L ist ein float ...
Seit wann?
@Wolfgang
EEPROM hast du gebrannt?
Ansonsten: Konzentrier dich auf die 20ms. Die Berechnungen laufen auf
dem µC auch nicht anders als auf dem Simulator. Du hast doch in beiden
Fällen identische Optimizer-Einstellungen?
Dem Simulator sind deine Berechnungen wurscht, der arbeitet nur
Assembler Instruktionen ab, genauso wie der µC. Da kommt im Simulator
dasselbe raus, wie auf dem µC. Timing ist aber eine andere Sache, das
kann abweichen, zb wenn im Simulator falsche Takteinstellungen gemacht
sind.
Hallo,
> Ansonsten: Konzentrier dich auf die 20ms.
Hatte ich auch schon in Verdacht, habe daher einfach mal
set_R(my_static_i++) reingehängt - und die LED dimmt in 5sec einmal rum;
5 sec = 256/20ms, paßt.
> Du hast doch in beiden Fällen identische Optimizer-Einstellungen?
Ja, und EEPROM ist auch geladen. Das werde ich aber nochmal zur Probe
rücklesen und das eep file genau ansehen.
Servus Wolfgang
Hallo,
LCD und UART ist keiner dran, die Zielplatine ist recht minimalistisch
und klein. UART könnte ich mal nachverdrahten und über ein FTDI-Kabel
mal ein bischen printf machen - Danke für den Hinweis.
Servus Wolfgang
Ansonsten fällt mir nur noch ein;
Abspecken. Du hast einen Fehler gemacht: Zuviel Code geschrieben ohne
ihn auf der realen Hardware zwischendurch immer wieder zu testen.
Hallo,
und heute des Rästels Lösung: der ISP war einen Tick zu schnell - ich
habe den AVRmkII auf langsamere Speed gestellt, et voila, es dimmt.
Danke nochmals für die Denkanstöße.
Übrigens, obige Rumrechnerei habe ich bereits bei der Servoansteuerung
drin - um mit Integer etwas Auflösung hinzuzaubern, muß man das einfach
ein bischen hochskalieren.
Servus Wolfgang, www.opendcc.de