Ford
28.12.2007, 00: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
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