Pin in Interrupt auf High/Low setzen

OP #3044610
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren