Skocz do zawartości

[c][ATmega16] problem z UART'em


sobal44

Pomocna odpowiedź

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.

Link do komentarza
Share on other sites

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ć.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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
Link do komentarza
Share on other sites

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 🙂

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.