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