Skocz do zawartości

[c][ATmega16] problem z UART'em


Pomocna odpowiedź

Napisano

Witam

Mam problem z komunikacja miedzy uC a PC,

#include <avr/io.h>               
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <util/delay.h> 
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define F_CPU 16000000UL         // częstotliwość zegara w Hz
#define UART_BAUD 19200                // prędkość transmisji bit/s
#define UART_CONST (F_CPU/(16ul*UART_BAUD)-1)       




// inicjalizacja portu szeregowego
void UART_init()
{
 UCSRA &= ~(1<<U2X); //kasuje bit u2x w rejestrze ucsra
 /* Ustawianie prędkości*/
 UBRRH = (unsigned char)(UART_CONST >>8);
 UBRRL = (unsigned char)UART_CONST ;

 // załącz odbiornik i nadajnik
 UCSRB = _BV(RXEN)|_BV(TXEN)|_BV(RXCIE);
 // ustalenie formatu ramki: 8bit, 2 bity stopu
 UCSRC = _BV(URSEL)|_BV(USBS)|_BV(UCSZ1)|_BV(UCSZ0);

}

// wysyła znak
void wyslij_znak(unsigned char c)
{
 while ( !( UCSRA & (1<<UDRE)) ) ;// albo jeżeli się nie myle to loop_until_bit_is_set(UCSRA,UDRE)
 UDR = c;
}


// odbiera znak z portu szeregowego i zwraca go jako wartość funkcji
char odbierz(void)
{
 loop_until_bit_is_set(UCSRA,RXC);        // czekaj na zakończenie odbioru
 cbi(UCSRA,RXC);                                // skasuj bit RXC w rej. USR
 return UDR;                                // zwróć zawartość rejestru UDR
}



int main(void)                        // program główny
{

 DDRD=0x02;
 PORTD=0x00;
 UART_init();     // inicjalizacja portu szeregowego

 while(1)                        // pętla nieskończona
 {

   wyslij_znak(0x45);   
   wyslij_znak(0x53);   
   odbierz();            
 }
}

używam po stronie pc Hyperterminala i uc wysyła do niego dziwne znaczki nie to co bym chciał. port com jest skonfigurowany odpowiednio:

liczba bitów na sekundę 19200

bity danych 8

parzystość brak

bity stopu 2

sterowanie przepływem brak

przeczytałem gdzieś ze możliwe mam włączony dzielnik fcpu przez 8, tylko nie wiem który bit w którym rejestrze jest za to odpowiedzialny.

fuse bity mam skonfigurowane odpowiednio

lfuse FF [8-16MHz, "Slow Rising Power" (SUT1..0=11)]

hfuse C9 [JTAGEN wyłączony, zwiększona amplituda drgań (CKOPT=0)]

do komunikacji używam modułu radiowego z mobot'a.

a po miedzy odbiornikiem a komputerem przypadkiem nie powinien się znajdować max232 ze względu na różnicę napięć sygnałów?

do komunikacji używam modułu z mobota, oba moduły(czyli ten na atmega i ten podłączony do kompa) komunikują sie, tylko znaki ascii są wysyłane nie takie jakie zaprogramowałem, wydaje mi sie ze to może być wina niewłaściwej prędkości po stronie uC ale nie wiem jak to sprawdzić a tym bardziej to naprawić.

Ja bym radził zacząć od komunikacji po kablu. Dopiero jak wszystko zadziała zmienił na radio.

Nie znam modułu mobota, ale:

1) może wymagać inicjalizacji, np. ustawienia prędkości, częstotliwości itd

2) nie wiem czy zawiera sprzętową kontrolę transmisji - jeśli nie, to mogą być spore zakłócenia i problem wykrycia początku transmisji

[ Dodano: 16 Gru 09 04:49 ]

Używasz modułu MOBOT-RCRv2? W dokumentacji jest konfiguracja uarta:interfejs wyjsciowy: UART TTL57600bps, bity

danych: 8, parzystosc: brak, bit stopu: 1

  • Pomogłeś! 1

tak właśnie tego modułu używam.

spróbuje takie dane wgrać na uc zobaczymy co się stanie.

[ Dodano: 17 Gru 09 06:03 ]

Udało mi sie rozwiązać problem dzięki Elvis to właśnie było to,
trzeba było wgrać do uc prędkość danych 57600bps brak parzystości 8 bitów danych i jeden bit stopu.

a w komputerze ostawić port com tak samo.

komunikacja bez przewodowa śmiga w obu kierunkach 🙂

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...