Atmega16 Timer

Gast #2717993
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
Gast #2718014
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
#2718022
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.
Gast #2718078
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!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 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.