Forum: Mikrocontroller und Digitale Elektronik Atmega16 Timer


von Rene3233 (Gast)


Lesenswert?

Hallo ich habe ein Problem und zwar schaffe ich es nicht 3 Timer bei 
einem Atmega 16 zu erstellen.

Hier mein Code:
1
void Timer_Init(void) {
2
  
3
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
4
// Timer 0 Aktivieren                      
5
// Vorteiler: 64                         
6
// Herz: 488 Hz                             
7
// 800000/64/256 = 488.28Hz                     
8
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
9
10
TCCR0  = (1 << CS01) | (1 << CS00);                 
11
TIMSK |= (1<<TOIE0);                        
12
13
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
14
// Timer 1 Aktivieren                         
15
// Vorteiler: 0                                
16
// Herz: 100 Hz                             
17
// 800000/0/256/T_PWM = 100Hz                   
18
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
19
20
TCCR1B = 1;                              
21
TIMSK |= (1<<OCIE1A);                        
22
23
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
24
// Timer 2 Aktivieren                         
25
// Vorteiler: 256                              
26
// Herz: 100 Hz                             
27
// 800000/0/256/T_PWM = 100Hz                   
28
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\ 
29
30
TCCR2  = (1 << CS22) | (1<< CS21);                         
31
TIMSK |= (1<<TOIE2);                       
32
 
33
sei();                                  
34
}
35
36
37
Hier die Interupts
38
39
40
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
41
// Interupt Timer0 (ABLÄUFE)                                     \\
42
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
43
44
ISR(TIMER0_OVF_vect){
45
  PORTC ^= 0xff;
46
}
47
48
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
49
// Interupt Timer1 (PWM)                                         \\
50
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
51
52
ISR(TIMER1_COMPA_vect){
53
   static uint8_t pwm_cnt=0;
54
    uint8_t tmp=0;
55
 
56
    OCR1A += (uint16_t)T_PWM;
57
  if (pwm_settings1 > pwm_cnt){
58
    PORTB = 0xff;
59
  }else{
60
    PORTB = 0x00;
61
  }
62
  
63
                            // PWMs aktualisieren
64
    if (pwm_cnt==(uint8_t)(PWM_STEPS-1))
65
        pwm_cnt=0;
66
    else
67
        pwm_cnt++;
68
}
69
70
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
71
// Interupt Timer2 (Blinken)                                     \\
72
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
73
74
ISR(TIMER2_OVF_vect){
75
  Uart_Send("INTERUPT TIMER2\r\n");
76
}


MIr Freundlichen Grüßen Rene3233

von Kay (Gast)


Lesenswert?

Hi,

Was erwartest Du nun?

Gruß Kay

von Karl H. (kbuchegg)


Lesenswert?

Rene3233 schrieb:
> Hallo ich habe ein Problem und zwar schaffe ich es nicht 3 Timer bei
> einem Atmega 16 zu erstellen.

Was genau muss man sich unter dieser Aussage vorstellen?

von Rene3233 (Gast)


Lesenswert?

Sry ich weiß nciht was ich falsch mache entwieder es lauft Timer 0 oder 
Timer 2.
Timer 1 hingehgen lauft immer weiß nur nicht warum das mc lauft mit 8 
MHz.

Villeicht kann mit wer helfen den fehler in meinem Code zu finden so das 
alle 3 Timer laufen.

Hoffe mein Anliegen ist jetzt versändliche.

MFG Rene3233

von Karl H. (kbuchegg)


Lesenswert?

Rene3233 schrieb:
> Sry ich weiß nciht was ich falsch mache entwieder es lauft Timer 0 oder
> Timer 2.

Wie stellst du das fest?

(SChmeiss doch mal den UART COde ausdem Timer raus oder ersetzt ihn 
zumindets durch das versenden von nur EINEM Zeichen! Das dauert doch 
viel zu lange)

> Villeicht kann mit wer helfen den fehler in meinem Code zu finden so das
> alle 3 Timer laufen.

Dazu bräuchte man aber ein VOLLSTÄNDIGES Programm.
Denn: die Timer werden schon laufen. Die Frage die sich stellt ist: Wie 
und Wo interpretierst du die Symptome falsch.

Mach halt deine Tests erst mal so
1
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
2
// Interupt Timer0 (ABLÄUFE)                                     \\
3
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
4
5
ISR(TIMER0_OVF_vect){
6
  PORTC ^= 0x01;
7
}
8
9
ISR(TIMER2_OVF_vect){
10
  PORTC ^= 0x02;
11
}

dann hast du erst mal eine weitere Komponente, die UART (die natürlich 
ebenfalls fehlerhaft konfiguriert sein kann) aussen vor.

von Rene3233 (Gast)


Lesenswert?

Ja es war der Uart der hat zu lange gedauert vielen dank an alle

von Krapao (Gast)


Lesenswert?

Timer1 ist ein 16-Bit Timer. Beim Kommentar wird falsch mit 0.8 MHz und 
8-Bit Timer gerechnet (800000/0/256/T_PWM = 100Hz). Dort ist der 
Kommentar Vorteiler: 0 auch falsch. Die Zuweisung TCCR1B = 1; entspricht 
Vorteiler 1.

Die Sollfrequenzen kann man ansonsten nicht nachrechnen, weil unbekannt 
ist, wie groß T_PWM ist (und PWM_STEPS).

Ich sehe keine Definition der Variablen pwm_settings1. Sie muss 
wahrscheinlich volatile gekennzeichnet werden.

OCR1A wird in Timer_Init() nicht initialisiert. Nur nach dem Reset hat 
OCR1A dort den Wert 0. Bei einem 2. Aufruf von Timer_Init() hat OCR1A 
i.d.R. einen undefinierten Wert.

Uart_Send() darf kein wartendes interruptgesteuertes Senden sein. Andere 
Interrupts kommen während der Ausführung von ISR(TIMER2_OVF_vect) nicht 
zum Zug. Das gäbe einen Deadlock!

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.