-
Ich verzweifel da noch dran, hab jetzt Stunden mit ausprobieren verbracht aber ich komme auf keinen grünen Zweig...
Bei dem Code unten bekomme ich immer eine 17-stellige Zahl, dabei sollen einfach nur alle Bits in die Variable rc5.gesamt kopiert werden...
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>
#include <inttypes.h>
#include <compat/deprecated.h>
struct rc5_parts
{
volatile char s_bit;
volatile uint8_t addresse;
volatile uint8_t code;
volatile char rdy;
volatile uint16_t gesamt;
} volatile rc5;
volatile uint8_t bitnummer = 0;
void init_rc5()
{
MCUCR |= (1<<ISC11); //wait falling edge
GICR |= (1<<INT1); //enable INT1
TCCR0 |= (1<<CS02); //Prescaler 256
cbi(DDRD,PD3);
}
//****************************************************USART******************************
void init_usart(void)
{
UBRRL |= 0b01100111;
UCSRB = (1<<TXEN) | (1<<RXEN);
UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
}
void send_char(unsigned char s)
{
while (!(UCSRA & (1<<UDRE)));
UDR = s;
}
void send_string(char *s)
{
while(*s != '\0')
{
send_char(*s);
s++;
}
}
//**********************************************************USART-ENDE********************
SIGNAL(SIG_OVERFLOW0)
{
bitnummer++;
if(rc5.s_bit == 1 && bitnummer < 14)
{
if((PIND & (1<<PD3)) != 0)
{
rc5.gesamt |= (1<<(14-bitnummer));
TCNT0 = 228;
}
else
{
rc5.gesamt &= ~(1<<(14-bitnummer));
TCNT0 = 228;
}
}
if(rc5.s_bit == 1 && bitnummer == 14)
{
cbi(TIMSK,TOIE0);
TCNT0 = 0;
rc5.rdy = 1;
}
}
SIGNAL(SIG_INTERRUPT1)
{
if(rc5.s_bit==0)
{
TCNT0 = 228;
rc5.s_bit = 1;
sbi(TIMSK,TOIE0);
cbi(GICR,INT1);
}
}
int main(void)
{
init_usart();
init_rc5();
sei();
char result[10];
for(;;)
{
if(rc5.rdy == 1)
{
itoa(rc5.gesamt,result,10);
char hello2[15] = "RC5-Code: ";
send_string(result);
rc5.rdy = 0;
rc5.gesamt = 0;
rc5.s_bit = 0;
bitnummer = 0;
sbi(GICR,INT1);
}
}
}
-
Hast du nen Pullup an dem Port?
-
Ja, gegen VCC. texttextextextextext
-
Deine IRQs kommen doch mit -28, das ist 1/4 Bit. Für den ersten (ab INTx) ist das ok, aber danach sollten sie mit 1/2 Bit (-56) oder 1 Bit (-111) kommen. Du hast es auf 1 Bit ausgelegt (also ohne Konsistenzprüfung etc). Bist du sicher, daß du RC5 sendest?
-
Genau, erst 1/4 Bit und dann immer ein ganzes Bit. Ich gehe davon aus, dass RC5 gesendet wird, da ich in Basic mit dem GetRC5()-Befehl die Commandos empfangen kann und es sich um eine Philipps-Fernbedienung handelt.
-
Dann sollte doch in der Timer0-ISR Timer0 auf -111 preloadet werden, oder?
Ausserdem ist es ratsam, die IRQ-Flags vor Aktivierung einer IRQ zu resetten. Sonst bekommst du evtl eine INT1-IRQ, ohne daß es nach Aktivieren der IRQ ein INT1-Ereignis gab.
-
Hi,
ich hatte das mit dem Preloaden so verstanden, dass der Timer bis 256 zählt und ich will, dass er nach 111 Schritten einen Overflow auslöst
->256-111 = 145
Wie soll ich dass denn sonst machen? Das mit dem Flag-resetten werde ich ausprobieren.
-
Jo, -111 = 145. ich rechne immer mit den negativen, ist einfacher.