Hallo zusammen, Ich hab' ein Problem mit dem Timer/Counter1 in meinem ATmega8. Wenn ich den Controller starte (Versorgungsspannung anlege) kommt es mitunter vor, dass der Timer nicht gestartet wird. Es ist allerdings nur dieser eine Timer1, Timer0, sowie die anderen Interrupts vom USART & Co laufen einwandfrei. Meine Initialisierung der Timer sieht so aus: ;Timer0 - ca. 47kHz ldi temp, 1 << WGM12 ^ 1 << CS00 ;Vorteiler auf 1 setzen und Modus = CTC out TCCR0, temp ldi temp, 1 out TCNT0, temp ;Timer1 - ca. 11Hz ldi temp, 1 << WGM12 ^ 1 << CS10 ^ 1 << CS12 ;Vorteiler auf 1024 out TCCR1B, temp ldi temp, HIGH(1000 - 1) out OCR1AH, temp ldi temp, LOW(1000 - 1) out OCR1AL, temp out TCNT1L, temp ldi temp, 1 << OCIE1A ^ 1 << TOIE0 out TIMSK, temp ldi temp, 0b00111111 out DDRC, temp out PORTC, temp ldi temp, 0b11110000 out DDRD, temp out PORTD, temp sei ;Interrupts global aktivieren Da kann es ja eigentlich keinen Fehler drin haben, denn plötzlich (Nach etwas warten und einigen Resets) funzt es dann wieder. Und dann klappt eigentlich alles, bis ich die Versorgungsspannung entferne. Hat einer eine Ahnung, was man da machen könnte, bzw. woran das liegt? Danke schonmal im Voraus! mfG Phip
Ok, ich frage mal andersrum: Gibt es eine Möglichkeit, den Controller ganz am Anfang richtig zu resetten, damit sicher auch das ganze SRAM leer ist? Oder muss man das alles "von Hand" erledigen?
hallo, Du musst bitweise das "oder" setzen, also (1 << OCIE1A) | (1 << TOIE0) nicht 1 << OCIE1A ^ 1 << TOIE0 | nicht ^ schau mal im Simulatorprogramm, es wird, denke ich, bei Deiner Variante immer nur das erstgeschriebene Bit gesetzt, die anderen aber ignoriert.
Eh? Was ist denn das ^ ? Ich dachte, das wäre OR... Ausserdem kann's eigentlich nicht daran liegen, denn 1. Es läuft im Simulator 2. Es geht manchmal auch mit dem Controller. Aber eben nicht immer. Wie dem auch sei, ich hab's jetzt mit dem Timer/Counter2 gemacht, da brauche ich halt einfach noch ein Byte im RAM mehr... Egal. Danke trotzdem für die Mühe!
Zu den operatoren | OR ^ XOR Also den code schreiben wie Jens-Erwin geposted hatte. Das folgt dem allgemeinen stiel und hift bei der lesbarkeit. Zum code noch ein vorschlag zur reihenfolge: 1. interrupts freischalten 2. die counter mit den werten füllen 3. die timer starten Wenn bei deinem mega8 die counter register nach dem reset fälschlicherweise mit einem wert gefüllt waren läuft der an erzeugt einen interrupt, der, weil geblockt, nur das flag setzt aber nicht die isr anspringt. Nur eine möglichkeit. Der simulator füllt all IO-register IMMER mit null.
Ob XOR oder OR ist in diesem Falle egal, da es sich um verschiedene Bits handelt. Es können also nie zwei 1-en an der gleichen Bitstelle zu 0 werden. Ich nehme lieber ^ statt |, weil es sich leicht schreibt (ohne AltGr) und leichter liest (das ^ trennt optisch besser). Peter
Keine "englische" tastatur? ;) Wenn man an einem project mit anderen arbeitet sollte man sich schon an die üblichen konventionen halten. Wenn zum beispiel (wie auch schon öfter auf arbeit gesehen) bestimmte flags zusammengelegt werden (weil der actuelle hardware-decoder sie nicht unterscheidet) hätte es gekracht, wenn wir XOR nutzen würden. Tja nicht eimmer wird die hardware immer komplexer... Olaf P.S.: Zu den umlauten sun-keyboards haben eine compose taste, sehr hilfreich um alle möglichen zeichen zu generieren "y => ÿ ;)
Axo, ^ ist XOR... Naja, danke euch allen! Ich werd's mal versuchen. Hoffentlich klappt das Zeug dann endlich mal... Wegen dem Schreiben: Bei mir (Schweizer Tastatur) spielt es nicht mal 'ne grosse Rolle, ob ich nun | oder ^ nehme. Bei | brauch' ich zwar AltGr, bei ^ muss ich danach dafür zweimal die Leertaste drücken. Das ist auch der Grund, warum ich ausgeschreibene Operatoren bevorzuge... (Ausser natürlich +, -, *, /, = und &) ;)
UAAAAAH! Ich bin doch der VOLLNOOOOOOB! Kann mich bitte mal jemand schlagen? Ich hab' doch tatsächlich brav dran gedacht, ZH am Anfang auf 0 zu setzen, aber XH und YH hab' ich vergessen. Jetzt hat der immer falsches Zeugs eingelesen und es lag gar nicht am Timer. Oh Mann! Manchmal da frage ich mich wegen mir... Trotzdem danke euch allen!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.