Forum: Compiler & IDEs Timer0 auf Atmega328P


von surrli (Gast)


Lesenswert?

Hallo zusammen,

Ich versuche bereits den ganzen Abend Timer0 auf einem Atmega328P zum 
laufen zu bringen. Mein Code sieht wie folgt aus:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
#ifndef F_CPU
5
#define F_CPU 16000000UL
6
#endif
7
8
int main()
9
{
10
   TCCR0B |= (1<<CS02) | (1<<CS01) | (1<<CS00);
11
   TIMSK0 |= (1<<TOIE0);
12
   
13
   DDRB = (1 << DDB5);
14
   PORTB = (1 << PB5);
15
  
16
  sei();
17
  
18
  while(1) {
19
20
  }
21
}
22
23
ISR (TIMER0_OVF_vect)
24
{
25
  PORTB = ( 0 << PB5 );
26
}

An PB5 habe ich eine Led um zu prüfen ob der Interupt überhaupt 
ausgelöst wird. Lieder bleibt die Led die ganze Zeit an.

Was mache ich falsch?

surrli

von wörg (Gast)


Lesenswert?

Du solltest auf jeden Fall darauf achten, den Registern definierte 
Startwerte zu verpassen und nicht bloß Werte zum Init "reinodern" und 
annehmen, dass sie vorher 0 waren. Auch TCCR0A = 0 schreiben (PWM aus).

von Karl H. (kbuchegg)


Lesenswert?

surrli schrieb:

Was sagt das Datenblatt, welche Takteinstelung du hier ...

>    TCCR0B |= (1<<CS02) | (1<<CS01) | (1<<CS00);

... gewählt hast?

Tabelle 14.9 auf Seite 110 vom Datenblatt
http://www.atmel.com/Images/doc8161.pdf

alle CS Bits auf 1 bedeutet
1
1 1 1 External clock source on T0 pin. Clock on rising edge.

hast du einen externen Takt am Pin T0?


>   PORTB = ( 0 << PB5 );

Interessante SChreibweise für

   PORB = 0;

Wenn du die Ooperation willst, dann schreibs besser so. Deine 
Schreibweise hat den Nachteil, dass man beim schnellen Drüberlesen denke 
könnte, dass PB5 irgendwas mit der Operation zu tun haben könnte. Das 
hat es nicht. Eine 0 kann man nach links oder rechts schieben sooft man 
will. Das Ergebis ist immer nur ...... wieder 0.

von surrli (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> alle CS Bits auf 1 bedeutet
>
1
1 1 1 External clock source on T0 pin. Clock on rising edge.
> hast du einen externen Takt am Pin T0?

Ah vielen Dank. Da habe ich wohl den ersten Fehler gefunden. Ich wollte 
eigentlich einen Prescaler von Clk/1024.
Ich werde dann heute abend meinen Code mit:
1
TCCR0B |= (1<<CS02) | 1<<CS00);
ausprobieren.

von Karl H. (kbuchegg)


Lesenswert?

surrli schrieb:
> Karl Heinz Buchegger schrieb:
>> alle CS Bits auf 1 bedeutet
>>
1
1 1 1 External clock source on T0 pin. Clock on rising edge.
>> hast du einen externen Takt am Pin T0?
>
> Ah vielen Dank. Da habe ich wohl den ersten Fehler gefunden.

:-)
Du meinst: Du hast ihn eingebaut :-) Gefunden hast du ihn nicht.

Aber darum gehts nicht.
Wie hab ich ihn gefunden?
Ich hab mir das Datenblatt genommen und hab alle Einstellungen 
kontrolliert. Jedes einzelne Bit in jedem einzelnen Register. So viele 
sind es ja nicht in deinem Programm. Ich hab bei jedem Bit nachgesehen
* ist es überhaupt in diesem Register beheimatet?
  (Oder hast du zb ein Bit in TCCR0A gesetzt, welches eigentlich in
   TCCR0B beheimatet ist. Einige der WGM Bits sind zb heiße Kandidaten
   für Verwechslungen, weil sie auf beide Register aufgeteilt sind)
* was ist die Bedeutung dieses Bits, bzw. dieser Bitkmbination.
  Atmel macht es einem da recht leicht. Wenn mehere Bits (so wie hier
  die CS-Bits) zusammenspielen, dann gibt es im Umfeld der Register-Bit
  Beschreibung eine Tabelle, die die Bedeutungen der Kombinationen
  zusammenfasst.

Und es gibt keinen Grund, warum du nicht dasselbe machen könntest. 
Gewöhn dich daran, dass du bei der Übernahme aus dem Datenblatt Fehler 
machen wirst. Stell dich bei der Fehlersuche dumm und zäum das Pferd von 
hinten auf. Frag dich: was hab ich da eigentlich eingestellt. Nimm 
nichts als gegeben und richtig an, solange bis du dich im Datenblatt 
davon überzeugt hast, dass es richtig ist. Da wird noch einiges als 'so 
nicht klärbar' übrig bleiben. Aber ein ganz erklecklicher Anteil an 
Fehlern wird sich so definitiv lösen lassen.

von surrli (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Du meinst: Du hast ihn eingebaut :-) Gefunden hast du ihn nicht.

Das meinte ich. ;)

Ich war gestern Abend ziemlich verwirrt durch die vielen Register. Ich 
habe es auch versucht mit dem Datenblatt, aber es war mir dann einfach 
zu gross und ich habe die richtige Stelle nicht gefunden.

Ich werden heute Abend weiter experimentieren und das Datenblatt 
weiterhin studieren.

Vielen Dank für deine ausführliche und nette Antwort.

von Karl H. (kbuchegg)


Lesenswert?

surrli schrieb:
> Karl Heinz Buchegger schrieb:
>> Du meinst: Du hast ihn eingebaut :-) Gefunden hast du ihn nicht.
>
> Das meinte ich. ;)
>
> Ich war gestern Abend ziemlich verwirrt durch die vielen Register. Ich
> habe es auch versucht mit dem Datenblatt, aber es war mir dann einfach
> zu gross und ich habe die richtige Stelle nicht gefunden.

Der wichtigste Abschnitt ist das jeweilige Unterkapitel
"Register Summary"

Dort beginnt die praktische Arbeit.
Das davor ist die Erklärung wie die jeweilige Komponente funktioniert. 
Aber in der Register Summary geht es ans Eingemachte: Welche Register - 
welche Bits - wie heissen die Bits - was bewirken sie.

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.