witam,
od jakiegoś czasu walczę z dekodowanie sygnału RC5
TSOP1736 <--> PD2 (INT0)
dioda nadawcza IR <--> BC516(PNP) <--> PB1
układ na 100% działa ponieważ przetestowałem go w BASCOMIe rc5send i getrc5(); działają znakomicie. pilot philips 100% rc5 - sprawdzone
problem mam taki, że w terminalu dostaje przedziwne rzeczy.
np. dla tego samego klawisza prawie za każdym razem jest co innego.
kod:
wydaje mi się, że problem leży w źle dobranych czasach wpisywanych do rejestru OCR1A albo w tym, że INT0 jest wywoływany przez opadające zbocze.
z góry dziękuje za pomoc!
od jakiegoś czasu walczę z dekodowanie sygnału RC5
TSOP1736 <--> PD2 (INT0)
dioda nadawcza IR <--> BC516(PNP) <--> PB1
układ na 100% działa ponieważ przetestowałem go w BASCOMIe rc5send i getrc5(); działają znakomicie. pilot philips 100% rc5 - sprawdzone
problem mam taki, że w terminalu dostaje przedziwne rzeczy.
np. dla tego samego klawisza prawie za każdym razem jest co innego.
kod:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/signal.h>
//hFuse : 0xD9
//lFuse : 0xFF
#define F_CPU 8000000L //f osc
#define UART_BAUD 9600 //prędkość transmisji rs232
#define UART_CONST (F_CPU/(16ul*UART_BAUD)-1)
void USART_Transmit( unsigned char data );
unsigned char USART_Receive( void );
void USART_Init( unsigned long int ubrr );
void send_string(const char *tekst);
void receive_string(void);
unsigned char bufor[32]; //zmienna globalna bufor'a
volatile unsigned char flaga=0; //flaga do przerwań
uint16_t data;
SIGNAL(SIG_INTERRUPT0)
{
PORTC ^= _BV(5); //zmiana stanu diody
TCCR1B |= ((1<<WGM12) | (1<<CS12)); //tryb CTC und preskaler 256
//GICR &= ~(1<<INT0); // wylaczenie przerwania od INT0
GICR = 0x00;
//GIFR |= _BV(INTF0); //kasowanie flagi INTF0 ,
}
SIGNAL(TIMER1_COMPA_vect)
{
OCR1A = 0x36; //nastepna pętla po 1,778ms
PORTC ^= _BV(5); //zmiana stanu diody
if(bit_is_clear(PIND,2))
data++;
data<<=1;
if((data & 0xC000) == 0xC0000)
{
sprintf(bufor,"%d",data);
send_string(bufor);
TCCR1B = 0x00;
OCR1A = 0x2A; //znowu petla 1.35ms (poczatek nowej ramki)
//GICR |= (1<<INT0); //wlaczenie przewania od INTO
GICR = 0x40; // INT0 ON!
}
}
int main(void)
{
DDRC |= _BV(5); //led
DDRB |= _BV(1); //led_IR
PORTB |= _BV(1); //dioda IR off
USART_Init(UART_CONST); // inicjalizacja rs'a
// A|=B oraz A&=~B ustawiane / kasowanie bitów
// kasowanie w zmiennej/rejestrze A tych bitów, które są ustawione w B
//GICR |= 1<<INT0; //wlaczenie przerwania na INT0
GICR = 0x40;
//MCUCR = (1<<ISC01); //INT0 reaguje na zbocze opadajace
MCUCR = 0x02;
OCR1A = 0x2A; //pierwsza pętelka po 1,35
TIMSK = (1<<OCIE1A); //zezwolenie dla przerwania od CTC
sei(); //globalne zezwolenie na przerwania
while(1)
{
}
}
void USART_Transmit( unsigned char data )
{
while ( !( UCSRA & (1<<UDRE)) ); // Wait for empty transmit buffer
UDR = data; // Put data into buffer, sends the data
}
unsigned char USART_Receive( void )
{
while ( !(UCSRA & (1<<RXC)) ); // Wait for data to be received
return UDR; // Get and return received data from buffer
}
void USART_Init( unsigned long int ubrr )
{
UBRRH = (unsigned char)(ubrr>>8); // Set baud rate
UBRRL = (unsigned char)ubrr;
UCSRB = (1<<RXEN)|(1<<TXEN); // Enable Receiver and Transmitter
UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0); // Set frame format: 8data, 1stop bit
}
void send_string(const char *tekst)
{
while(*tekst)
USART_Transmit(*tekst++);
}
void receive_string(void)
{
unsigned char i=0;
do
{
if((bufor[i] = USART_Receive()) == '\n') break;
i++;
}while(i < 32); //zeby nie przepelnic bufora
}
wydaje mi się, że problem leży w źle dobranych czasach wpisywanych do rejestru OCR1A albo w tym, że INT0 jest wywoływany przez opadające zbocze.
z góry dziękuje za pomoc!