#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "1wire.h"
signed char rozkaz;
void USART_Transmit( char data ) //unsigned
{
while ( !( UCSRA & (1<<UDRE)) ); //wolny bufor
UDR = data;
}
SIGNAL(SIG_UART_RECV)
{
//OCR0=0x00;
rozkaz=UDR;
}
int main(void)
{
DDRD=0x02;
PORTD=0x00;
DDRB=0xFF;
//licznik w trybie PWM
TCCR0=0x03; //pres
TCCR0|=_BV(WGM00); TCCR0|=_BV(WGM01); //Fast PWM
TCCR0|=_BV(COM01); TCCR0&=~_BV(COM00); //Fast PWM set compare,set bottom
OCR0=0xFF;
TCNT0=0x00;
TIMSK |= _BV(TOIE0);
//UART
UCSRA = _BV(U2X);
UBRRL = 103;
UCSRB = _BV(TXEN) | _BV(RXEN)| _BV(RXCIE);
UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
sei();
int i;
USART_Transmit('e');
while(1)
{
delay_us(100);
}
}
Nie rozumiem za bardzo gdzie robie zasadniczy blad ?
ustawiajac w przerwaniu SIGNAL(SIG_UART_RECV) OCR0=0x00; zmiany na podlaczonej diodzie widze tylko na moment. Domyslam sie ze 'cos' resetuje mi uC i OCR0 wraca do wartosci 0xFF
transmisja jest poprawnie zestawiona ,wszystko dzialalo ok poki nie musialem zastosowac odbior danych przez przerwanie ( i wlaczenie sei() )
od PC ustawienia :
port.setSerialPortParams(
9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);