Witam.
Mam taki problem. Próbuję skomunikować ze sobą dwa uC. Docelowo będą one skomunikowane po RS485, ale teraz w fazie testów próbuję je połączyć normalnie po UARCie. Skrosowałem TXD i RXD dwóch Atmeg. Wysyłam z Atmega162 znak 0x3A, natomiast na Atmedze32 włącza się przerwanie od odebrania (dioda niezależna od znaku odebranego się zapala ) ale nie odbiera tego znaku (dioda zależna od znaku się nie zapala). A oto kod do odebrania i do wysyłania:
Wysyłanie:
Odbieranie:
A Uarta w obydwu przypadkach deklaruje tak samo (zależnie od rejestrów)
O co może chodzić?
Mam taki problem. Próbuję skomunikować ze sobą dwa uC. Docelowo będą one skomunikowane po RS485, ale teraz w fazie testów próbuję je połączyć normalnie po UARCie. Skrosowałem TXD i RXD dwóch Atmeg. Wysyłam z Atmega162 znak 0x3A, natomiast na Atmedze32 włącza się przerwanie od odebrania (dioda niezależna od znaku odebranego się zapala ) ale nie odbiera tego znaku (dioda zależna od znaku się nie zapala). A oto kod do odebrania i do wysyłania:
Wysyłanie:
void USART_Wyslij(unsigned char dane) //procedury wysyłania danych
{
UDR0 = dane; //umieść dane w buforze, wyślij dane
}
void USART_Ramka(unsigned char adres, unsigned char dane) //Wysłanie ramki po RS232
{
//pakiety
tx_buf[0]=0x3A; //znak startu
tx_buf[1]=adres;
tx_buf[2]=0x02; //Funkcja - filtrowanie obrazów
tx_buf[3]=dane;
tx_buf[4]=0x44; //znak stop
//pętla wysyłająca dane zapisane w buforze poprzez uart
while (!(UCSR0A & (1 << UDRE0)));
for(int i=0;i<5;i++)
{
USART_Wyslij(tx_buf[i]); //umieść dane w buforze, wyślij dane
}
}
Odbieranie:
ISR(USART_RXC_vect) //Przerwanie od odebrania USART0
{
byte=UDR; //pobranie wartości z rejestru UDR
//sprawdzenie czy wystąpił znak startu ":" - czyli szesnastkowo 0x3A
if (byte==0x3A)
{
PORTB ^= _BV(1); //włączenie diody gdy odbierze się znak 0x3A
bitstart=1;
bitstop=0;
licznik=0; //wyzeruj licznik
}
licznik++;
//sprawdzenie czy nie wystapil znak konca ramki: "D" czyli szesnastkowo 0x44
if (byte==0x44)
{
bitstart=0;
bitstop=1;
wykonaj(ramkaodbierz,licznik);
}
//inkrementowanie tablicy char ramkaodbierz
if(bitstart==1)
{
ramkaodbierz[licznik]=byte;
}
PORTB ^= _BV(2); //Włączenie diody niezależnie od znaku
}
A Uarta w obydwu przypadkach deklaruje tak samo (zależnie od rejestrów)
/załączenie UARTA
void USART_Init(void)
{
//ustaw prędkość transmisji
/* Set baud rate */
UBRRH = (BAUD_PRESCALE >> 8);
UBRRL = BAUD_PRESCALE;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
/* Set frame format: 8data, 1stop bit */
UCSRC = (1<<URSEL)|(3<<UCSZ0);
}
O co może chodzić?
