ATmega8: Timer/Counter1läuft manchmal nicht

Gast #167340
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
Gast
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?
Gast
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.
Gast
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!
Gast
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
Gast
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 => ÿ ;)
Gast
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 &) ;)
Gast
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!

Antwort schreiben

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.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.