Mahlzeit!
Ich habe ein Problem mit dem ATMega328P (Arduino Nano V3.0 Board)
Und zwar habe ich anscheinend keinen Zugriff auf die obigen
High-Register.
Der Timer1 ist auf FastPWM Mode 14 eingestellt.
Mit ICR1 als Top und OCR1A als Compare Register.
Nur leider haben Änderungen in den High Bytes keinerlei auswirkungen auf
Frequenz und/oder Tastverhältnis.
Ich arbeite mit 16MHz und wollte mit Prescaler 256 eine Periode von ca
1sek erstellen.
TOP/ICR1 = 62499
Compare/OCR1A = 62499/2
Ich habe zwar ein Tasverhältnis von 50%, durch die LOW Bytes (0x23 und
0x11), jedoch mit viel zu hoher Frequenz.
Habe auch mal extreme Werte für die High Bytes benutzt um einen Effekt
sehen zu können, aber egal ob 0x00 oder 0xFF, da ändert sich absolut nix
am Ausgang.
Woran kann das liegen?
Jürgen II schrieb:> derOJ schrieb:>> Woran kann das liegen?>> Wenns hier nicht liegt, in dem nicht gezeigten Code. Mein Ratetipp:> Prescaler falsch eingestellt.
... bzw. WGM12 WGM13 beim Einstellen von Prescaler überschrieben.
Hallo,
erstmal die Interrupts ausschalten, Register ändern, Interrupts
einschalten.
Die Trennung zwischen High und Low Byte brauchste nicht machen. Macht
der Compiler für dich. Du kannst das ganze Register ansprechen.
Und ganz wichtig, am Anfang alle Timer Register Nullen. Nur dann geht
man sicher das auch nur die Bits drin stehen die man selbst gesetzt hat.
Vielen Dank.
Aber:
Interrupts sind doch aus...
Und wenn ich "sts ICR1, 0xF423" schreibe meldet der Compiler, dass diese
Variable nicht bekannt ist. Ist auch in der .inc nicht definiert
Gerade nochmal ausprobiert.
direkt nach der Stackpointer Initialisierung einen "cli" gemacht,
alle benutzten Register auf Null gesetzt mit
clr r16
sts Register , r16
keine Änderung.... :-(
derOJ schrieb:> ldi r16, (1<<CS12) ; Timer1 starten mit Prescaler 256 für 1> sts TCCR1B, r16
Hier überschreibst du dir deine WGM12, WGM13 Bits, die auch im TCCR1B
stehen mit 0.
Wie blööööd :D
Danke. Genau das war der Fehler!
Dachte das wär direkt ne "Oder Operation"
Lese jetz zuerst das/die Register und mach selbst en logisches Oder und
funktioniert natürlich! :-)
Besten Dank
Tipp schrieb:> Die Trennung zwischen High und Low Byte brauchste nicht machen. Macht> der Compiler für dich.
Was denn für ein Compiler? Das ist Assembler-Code, kein C.