PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ppm dekodierung



Ford
27.12.2007, 23:14
ich habe ein problem mit der dekodierung des ppm signals eines rc-empfängers.

ich hab soviel rausbekommen: sobald ich das TCCR2 register des timer2 schreibe, wird irgendwie der externe interrupt int0 nichtmehr ausgelößt und der usart des atmega32 fängt an zu spinne . mein controller läuft auf 8mhz. wenn ich dann vor dem schreibevorgang das register lösche und hinterher wieder schreibe funktioniert der usart wieder einwandfrei...
keine ahnung warum. eigendlich dürfte das doch garnicht miteinander zusammenhängen oder?

dadurch, dass int0 nicht ausgelößt wird, wenn der timer2 läuft, kann ich leider auch nicht testen ob der rest des programms tut.

wäre wirklich schön wenn mir da jemand weiterhelfen könnte! im datenblatt des atmega32 hab ich keine hinweise darauf gefunden wie das zusammenhängen könnte.

hier mein code:
#include "global.h"
#include <avr/io.h>
#include "ppm.h"
#include <avr/interrupt.h>

uint8 servopos[7];
word overflow = 0;
uint8 counter =0;

void decode(void)
{
overflow= overflow+TCNT2;
if (overflow < 500){
servopos[counter] = overflow-250;
overflow=0;
counter++;
}
else {
counter=0;
overflow=0;
TCNT2=0;
}
}


void ppm_init(void)
{
GICR |= (1<<INT0);
MCUCR |= (1<<ISC00) | (1<<ISC01);

TCCR2 |= (1<<CS20)|(1<<CS21);
TIMSK |= (1<<TOIE2);
sei();
}

ISR(INT0_vect){
decode();

}

ISR( TIMER0_OVF_vect )
{
overflow=overflow+256;
}


uint8 get_pos(uint8 servo)
{
return servopos[servo];
}


danke schonmal für jegliche hilfe!!

mfg Ford

roboterheld
28.12.2007, 08:29
...decode(); ....


ist schwachsin in eine int noch eine sub reinsetzen.

Ford
28.12.2007, 09:19
ich hab das gemacht weil ich gelesen hab, dass die service routinen nich zu lang werden dürfen. aber das eigendliche problem ist das je nicht.

McJenso
28.12.2007, 14:16
Hallo,
die ISR soll möglichst schnell beendet werden, damit es nicht zu einer Überschneidung beim Ausführen und neuem Eintreten eines Interrupts kommt. Ob du die Anweisungen in eine neue Funktion schreibst oder nicht, die ISR wurde noch nicht beendet.

Zu deinem Code. Du setzt das Interruptflag für Timer 2. Wo ist die ISR für Timer 2?

Gruß

Jens

Ford
28.12.2007, 18:01
ah ok, dann weis ich das jetzt auch...

inzwischen tuts schon!, danke trotzdem für eure antworten.
hab mich heute morgen dranngehockt und das mit der isr vom timer auch gemerkt ^^ naja war gestern abend warscheinlich n bischen übermüdet. schnell vorm schlafen gehn noch was zusammenklopfen geht dann wohl doch in den seltensten fällen gut...

mfg Ford!