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!
Eine eigene Frage?
Dieser Thread ist über 21 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.