Hi,
ich versuche im Moment ein RC-Auto mit einem Atmega anzusteuern (genauer
gesagt einem RN-Control Board)
Dazu habe ich diese Anleitung verwendet:
http://www.mikrocontroller.net/articles/Modellbauservo_Ansteuerung
Es funktioniert auch alles wie in der Anleitung:
1 | #define F_CPU 1000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <avr/interrupt.h>
|
5 | #include <util/delay.h>
|
6 |
|
7 | ISR( TIMER1_COMPA_vect ) // Interruptbehandlungsroutine
|
8 | {
|
9 | OCR1A = 2500-OCR1A; // Das Servosignal wird aus der Differenz von
|
10 | // Periodenlänge (2500*0,008ms=20ms) und letztem
|
11 | // Vergleichswert (OCR1A) gebildet
|
12 | }
|
13 |
|
14 |
|
15 | int main (void)
|
16 | {
|
17 | DDRB = 0b11111100;
|
18 | PORTB = (1<<PB1) | (1<<PB0); // Pullup für PB0 und PB1
|
19 |
|
20 | TCCR1A = (1<<COM1A0); // Togglen bei Compare Match
|
21 | TCCR1B = (1<<WGM12) | (1<<CS11); // CTC-Mode; Prescaler 8
|
22 | TIMSK = (1<<OCIE1A); // Timer-Compare Interrupt an
|
23 |
|
24 | OCR1A = 2312; // Neutralposition ((2500-2312)*0.008ms)=1,5ms)
|
25 |
|
26 | sei(); // Interrupts global an
|
27 |
|
28 | while( 1 ) {
|
29 |
|
30 | if ( !(PINB & (1<<PINB0)) ) { // Impuls-Zeit verlängern
|
31 | cli();
|
32 | OCR1A = OCR1A + 3;
|
33 | sei();
|
34 | _delay_ms(50);
|
35 | }
|
36 |
|
37 | if ( !(PINB & (1<<PINB1)) ) { // Impuls-Zeit verkürzen
|
38 | cli();
|
39 | OCR1A = OCR1A - 3;
|
40 | sei();
|
41 | _delay_ms(50);
|
42 | }
|
43 | }
|
44 |
|
45 | return 0;
|
46 | }
|
Nun wollte ich das Ausgabesignal an einem anderen Pin. Dazu habe ich die
Interruptfunktion geändert:
1 | ISR( TIMER1_COMPA_vect ) // Interruptbehandlungsroutine
|
2 | {
|
3 | OCR1A = 2500-OCR1A;
|
4 | PORTA ^= (1<<PA0);
|
5 | }
|
und in der Main:
1 | DDRA |= 0x3F;
|
2 |
|
3 | PORTA |= (1<<PA0);
|
4 | PORTA ^= (1<<PA0);
|
Nun sollte mein Signal auch an Pin A0 anliegen, richtig? Das Signal
kommt auch an, nur wird es nach einigen Durchläufen invertiert. Es ist
so, als wäre die Anweisung "PORTA ^= (1<<PA0);" einmal übergangen
worden?!
Hättet ihr eine Idee was ich falsch mache?