Forum: Mikrocontroller und Digitale Elektronik ATmega8: Timer/Counter1läuft manchmal nicht


von Philipp Burch (Gast)


Lesenswert?

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

von Philipp Burch (Gast)


Lesenswert?

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?

von Jens-Erwin (Gast)


Lesenswert?

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.

von Philipp Burch (Gast)


Lesenswert?

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!

von Olaf (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Olaf (Gast)


Lesenswert?

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 => ÿ ;)

von Philipp Burch (Gast)


Lesenswert?

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 &) ;)

von Philipp Burch (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.