Forum: Mikrocontroller und Digitale Elektronik Pin in Interrupt auf High/Low setzen


von Samuel P. (mo3bius)


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?

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.