Witam prosze o pomoc w takim oto temacie :
Staram sie odczytac/wyslac dane przez Usart przy pomocy AVR studio (jako ze jestem jeszcze zielony w tym temacie nie moge poradzic sobie z tym problemem sam)
Zapalanie i gaszenie Ledow mam juz za soba i teraz chcialem nauczyc sie rozmawiac z komputerem przez USART
wydukalem taki oto kod - ale niestety symulacja w avr studio blokuje sie w pewnym momecie i nie moge dojsc czemu...
Kod: Zaznacz cały
/Najpierw musisz ustawić odpowiednie parametry
//np tak Kod:
//unsigned char odebrane; //zmienna globalna - definujemy ja przed wszyskimi funkcjami unsigned - oznacza ze przyjmuje warotsc od 0 do 255
unsigned char zmienna;
#include <avr\sfr_defs.h> //pozwala sterowac bitami code::blocks
#include <avr\io.h> //wejscia_wyjscia avr
#define F_CPU 8000000 // tu definiujesz wartość uzywanego kwarcu
void PORTY(void) //Ustawiamy porty
{
DDRB|=_BV(PB0); //ustawienie piny PB0 jako wyjscia = zapisz do rejesru 1
DDRB&=~_BV(PB1); // portC0 jako wejscie (zapisz 0 do rejestru DDRC)
PORTB|=_BV(PB1); // wlacz wewnetrzny rezystor podciagajacy do Vcc
}
void InitUSART( unsigned long int baud ) // baud - czyli bitrate portu COM
{
UBRRH = (unsigned char)(((F_CPU/(16UL*baud))-1)>>8);
UBRRL = (unsigned char)((F_CPU/(16UL*baud))-1);
// Otwarty kanal odbioru i nadawania
UCSRB = (1<<RXEN)|(1<<TXEN);
// 8bitów, 2bity stopu */
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}
unsigned char ReceiveUSART( void ) // funkcja odbioru bajtu z RS232
{
while ( !(UCSRA & (1<<RXC)) );
//odebrane = UDR; //zmienna odebrane przyjmuje wartosc UDR
return UDR;
}
void TransmitUSART( unsigned char data ) // funkcja wysłania bajtu po RS232
{
while ( !( UCSRA & (1<<UDRE)) );
UDR = data;
}
void ZAMIANA(void)
{
PORTB^=_BV(PORTB0); //zamiana stanu pinu...czyli toggle
}
int main (void) // glowna petla progamu
{
PORTY(); // ustaw porty
//while(1);
ZAMIANA(); //Odwolaj sie do petli bez parametrow
for (int i=0;i<200;i++); // male opoznienie
zmienna = ReceiveUSART();
return(0);
}
w bascomie robilem to przy pomocu przerwan (niestety nie znam jeszcze na tyle dobrze C aby przelozyc ten program z bascoma)
w bascomie wygladalo to tak +/-
Kod: Zaznacz cały
...)
On Urxc Rx232
Set Ucr.4 ' załącz odbiornik UART
Enable Urxc
Enable Interrupts
(...)
' gdy odebrano znak to:
Rx232: ' wywolanie przerwania
If Usr.3 = 1 Then ' błąd
erro = 1 ' ustaw flage erro na 1
Elseif Usr.4 = 1 Then ' uszk ramka
erroa = 1 ' ustaw flage rserr na 1
Else ' wszystko poprawnie
Slowo = Udr ' przypisz UDR do zmiennej
got = 1 ' ustaw flage
errb = 0 ' flaga bledu 0
End If
Return