Forum: Compiler & IDEs AVR mega8 - Timer1 CTC Problem


von Jannes K. (jk_gcc)


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

von Jörg G. (joergderxte)


Lesenswert?

Du willst da bestimmt ein '~' und kein '!' -- tip: schau nach, wo der 
unterschied ist...

von Jannes K. (jk_gcc)


Lesenswert?

Da magst du recht haben =/

Danke...

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.