Forum: Compiler & IDEs Timer0 vom Atmega8 funktioniert nicht


von Paul P. (cesupa)


Lesenswert?

Hallo,

ich bin grad dabei meine Kenntnisse in Sachen Interrupts zu vertiefen 
und versuche grade den Timer0 von meinem Atmega8(16MHz) so zu 
konfigurieren, dass er mit ca. 10ms läuft. Nur leider funktioniert das 
nicht so wie erhofft. Hier mal mein Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
volatile uint8_t counterT2;
5
6
ISR(TIMER0_COMP_vect)
7
{
8
counterT2++;
9
}
10
11
void init_timer(void)
12
{
13
TCNT0=0;
14
OCR0=156;                 //10ms bei 16MHz
15
TIMSK=(1<<OCIE0);
16
sei();
17
TCCR0 = ((1<<CS02) | (1<<CS00) | (1<<WGM01)); //Prescaler=1024(?), CTC Mode
18
}
19
20
inline void sleep(uint8_t t)
21
{
22
counterT2=0;
23
while(counterT2<t);
24
}
25
26
inline void sleep_s(uint16_t ms)
27
{
28
uint16_t i;
29
30
for(i=0;i<ms;i++)
31
sleep(100);
32
}
33
34
int main(void)
35
{
36
37
init_timer();
38
39
DDRD|=(1<<PD5) | (1<<PD6);
40
41
while(1)                        
42
{
43
PORTD|=(1<<PD5);
44
PORTD&=~(1<<PD6);
45
46
sleep_s(1);                    //1s warten
47
48
PORTD|=(1<<PD6);
49
PORTD&=~(1<<PD5);
50
51
sleep_s(1);                    //1s warten
52
}
53
54
return 0;
55
}

Warum funktioniert das nicht? Es leuchtet immer nur die LED an PD5.

Gruß
Paul

von Johannes M. (johnny-m)


Lesenswert?

Der Timer 0 vom ATMega8 hat gar keine Compare-Einheit und 
dementsprechend auch keinen CTC-Modus. Das müsste eigentlich beim 
Compilieren schon Fehlermeldungen geben (v.a. wegen den nichtexistenten 
OCR0 und WGMxx).

von Paul P. (cesupa)


Lesenswert?

Aha, das wusste ich nicht. AVR-Studio hat da noch nicht einmal eine 
Warnung ausgegeben. Ich hab das ganze mal mit CTC beim Timer2 probiert, 
da ließ sich aber der Prescaler nicht einstellen. Ich hab halt einfach 
TCCR2=(1<<CS22) | (1<<CS20) | (1<<WGM21); gesetzt, aber die LEDs 
leuchteten entweder beide auf, oder blinkten sehr schnell wenn ich statt 
sleep_s(1) sleep_s(100) verwendete. Also warum lässt sich der Prescaler 
nicht einstellen?

Gruß
Paul

von Michael J. (jogibaer)


Lesenswert?

Paul P. wrote:
> Aha, das wusste ich nicht. AVR-Studio hat da noch nicht einmal eine
> Warnung ausgegeben.


Hallo,

da würde ich fast darauf tippen, das Du die falsche CPU eingestellt 
hast.

Wenn die CPU nicht die entsprechenden Register kennt, gibt es eigentlich
immer eine Fehlermeldung.


Jogibär

von Paul P. (cesupa)


Lesenswert?

Ahhhhh, das vergess ich irgendwie immer wieder einzustellen, wenn ich 
ein neues Projekt erstellen will. Gibt es eine Möglichkeit, generelle 
Einstellungen vorzunehmen, die bei jedem neuen Projekt übernommen 
werden?

Jetzt funktioniert das auch mit der ISR.

Danke für eure Hilfe.

Gruß
Paul

von Michael J. (jogibaer)


Lesenswert?

Paul P. wrote:
> Ahhhhh, das vergess ich irgendwie immer wieder einzustellen, wenn ich
> ein neues Projekt erstellen will. Gibt es eine Möglichkeit, generelle
> Einstellungen vorzunehmen, die bei jedem neuen Projekt übernommen
> werden?
>
> Jetzt funktioniert das auch mit der ISR.
>
> Danke für eure Hilfe.
>
> Gruß
> Paul


Hallo,

passiert mir auch ab und zu mal.
Besonders wenn ich mal kurz ein programm von einem Gerät auf meine 
Testumgebung spiele um "schnell" mal was auszuprobieren.

Allerdings merkt man das recht schnell.

Wo Du das bei AVRStudio einstellen kannst, weiß ich nicht.
Bei mir ändere ich es immer direkt im makefile.

Jogibär

von Johannes M. (johnny-m)


Lesenswert?

Paul P. wrote:
> Aha, das wusste ich nicht.
Unwissenheit schützt vor Strafe nicht...;-) Frage mich, wie man einen µC 
programmieren kann, ohne vorher wenigstens mal ins Datenblatt zu 
schauen, ob der das, was ich brauche, überhaupt hat...

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.