AVR mega8 - Timer1 CTC Problem

OP #2064885
Lesenswert?
• ▲
▼
N'abend!
Ich bin relativ neu im Thema gcc und bringe es mir grade selber bei!

Mein aktuelles Ziel ist es eine Routine zu schreiben, die mir aus einer 
übergebenen Zeit (in ms) den Prescaler, sowie den Wert fürs CTC 
berechnet und den 16bit Timer startet. Allerdings will mir das nicht 
wirklich gelingen und ich finde den Fehler einfach nicht ( trotz 
Forensuche und Google^^ ).
Um den Timer1 zu testen hab ich mir in die ISR einfach das Toggeln 
zweier LED geschrieben. Diese blinken zwar auch hübsch, allerdings immer 
im 9,1sec Takt, ich vermute also der Timer1 zählt immer bis 65.535 bei 
einem Prescaler von 1024 und einem Systemtakt von 7,3728MHz.
Und ich kann ihm das einfach nicht abgewöhnen...^^

Code:
1
void init_16bitTimer1(uint16_t ms)
2
{
3

4
uint8_t  i = 0;
5
uint16_t prescaler[5] = {1,8,64,256,1024};
6
uint32_t zwischenOCR1A = 65536;
7
uint16_t f_cpu = 7372;
8

9
TCCR1A = 0x00;        // no Port operation, kein PWM
10
TCCR1B = (1<<WGM12);  // CTC1
11
TIMSK |= (1<<OCIE1A); // Compare Match A Interrupt Enable
12

13
  while ( (zwischenOCR1A > 65535) && (i < 5) )
14
  {
15
    zwischenOCR1A = ( (ms*f_cpu)/prescaler[i] );
16
    i++;
17
  }
18

19
  OCR1A = zwischenOCR1A;
20

21
  switch (i)
22
  {
23
    case 1:      // Prescaler = 1 (no prescaling)
24
    {
25
      TCCR1B &= (!(7<<CS10));
26
      TCCR1B |= (1<<CS10);
27
    }
28
    case 2:      // Prescaler = 8
29
    {
30
      TCCR1B &= (!(7<<CS10));
31
      TCCR1B |= (1<<CS11);
32
    }
33
    case 3:      // Prescaler = 64
34
    {
35
      TCCR1B &= (!(7<<CS10));
36
      TCCR1B |= (3<<CS10);
37
    }
38

39
    case 4:      // Prescaler = 256
40
    {
41
      TCCR1B &= (!(7<<CS10));
42
      TCCR1B |= (1<<CS12);
43
    }
44
    case 5:      // Prescaler = 1024
45
    {
46
      TCCR1B &= (!(7<<CS10));
47
      TCCR1B |= (5<<CS10);
48
    }
49
    default:
50
    {
51
      ;
52
    }
53
  }
54

55
  return;
56
}

Vielleicht seht ihr ja mehr und könnt mir helfen


Danke schonmal, jannes

Antwort schreiben

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.

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.