www.mikrocontroller.net

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


Autor: Philipp Burch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Burch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Philipp Burch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 => ÿ ;)

Autor: Philipp Burch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 &) ;)

Autor: Philipp Burch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.