OK...
Eine (hoffentlich) letzte Frage.
Ich hab alle Änderungen von oben drin - jetzt habe ich noch ein Problem
mit dem CTC mode...
Problem ist, dass sich mein Signal irgendwann invertiert, also aus:
wird
Das Ganze passiert jede Sekunde - sprich es hängt mitm CTC und dem
Interrupt zusammen... Ich verstehs aktuell aber nicht.
Der Code dafür ist wie folgt:
1 | #define F_CPU 4000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <avr/interrupt.h>
|
5 | #include <util/delay.h>
|
6 |
|
7 | #define SERVO_DDR DDRD
|
8 | #define SERVO_PORT PD7
|
9 | #define SERVO_POSITION OCR2
|
10 |
|
11 | #define SERVO_FREQU 78
|
12 | #define SERVO_CENTER 6
|
13 | #define SERVO_MAX 8
|
14 | #define SERVO_MIN 4
|
15 |
|
16 | ISR( TIMER2_COMP_vect )
|
17 | {
|
18 | SERVO_POSITION = SERVO_FREQU - SERVO_POSITION;
|
19 | }
|
20 |
|
21 | void sleepOneSec();
|
22 |
|
23 | int main (void)
|
24 | {
|
25 | DDRA |= ((1<<PA0) | (1<<PA1));
|
26 |
|
27 | SERVO_DDR |= (1<<SERVO_PORT);
|
28 |
|
29 | //Toggle mode OC2
|
30 | TCCR2 |= (1<<COM20);
|
31 | TCCR2 &= ~ (1<<COM21);
|
32 |
|
33 | //CTC mode
|
34 | TCCR2 |= (1<<WGM21);
|
35 | TCCR2 &= ~(1<<WGM20);
|
36 |
|
37 | //Prescaler 1024 RefPage
|
38 | TCCR2 |= ((1<<CS22)|(1<<CS21)|(1<<CS20));
|
39 | //TCCR2 &= ~ ((1<<CS21)|(1<<CS20));
|
40 |
|
41 | TIMSK |= (1<<OCIE2); // Timer-Compare Interrupt an
|
42 |
|
43 | SERVO_POSITION = SERVO_CENTER; // Center position
|
44 |
|
45 | sei(); // Interrupts global an
|
46 |
|
47 | while( 1 )
|
48 | {
|
49 | PORTA ^= (1<<PA0);
|
50 | SERVO_POSITION = SERVO_MIN;
|
51 | sleepOneSec();
|
52 | }
|
53 |
|
54 | return 0;
|
55 | }
|