Skocz do zawartości

[C] UART/USART Atmega8


filipson

Pomocna odpowiedź

Witam ponownie 🙂

mam problem z obsługą USART na Atmedze8 z wew. generatorem 8Mhz

Używam przejściówki USB->RS232 na MAX232, i tu dziwne zjawisko:

kiedy cały układ jest zasilany, podpięty do komupera, nic się nie dzieje.

Jeśli odłączę przejściówkę od USB zaczynają w niej mrugać diody(sygnalizują transmisję?)

kod z Atmegi:



#include <avr/io.h>
#include <util/delay.h>

//void setAngle(int angle);
//void InitServ(void);

#include <inttypes.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdint.h>
#define USART_BAUD 9600
#define USART_UBBR_VALUE ((F_CPU/(USART_BAUD<<4))-1)

/*UART*/
void USART_Init(unsigned int ubrr) ;
void USART_Transmit( unsigned char data ) ;
unsigned char USART_Receive( void ) ;
void USART_TransmitString (unsigned char *str) ;


void main(void)
{
   unsigned char d[] = {'x','y','z'};
   unsigned char z = 'a';
   USART_Init(USART_UBBR_VALUE);
   //InitServ();
   //int i;
   while(1) {

       USART_TransmitString (d);

       USART_Transmit(z);


   }

}

Z góry dzięki za jakąkolwiek pomoc! :)


void USART_Init (unsigned int ubrr)
{
// Set baud rate
   UBRRH = (unsigned char)(USART_UBBR_VALUE>>8);
   UBRRL = (unsigned char)USART_UBBR_VALUE;

// Enable receiver and transmitter
   UCSRB = (1<<RXEN)|(1<<TXEN);

// Set frame format to 8 data bits, no parity, 1 stop bit
   UCSRC = (0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(0<<UCSZ2);


}

void USART_Transmit( unsigned char data )
{

   /* Wait for empty transmit buffer */
   while ( !( UCSRA & (1<<UDRE)) ) ;
   /* Put data into buffer, sends the data */
   UDR = data;
}

void USART_TransmitString (unsigned char *str)
{
   int i = 0;
   for (i=0; str[i]!='\0'; i++) {
       USART_Transmit(str[i]);
       _delay_ms(50);
   }
}


unsigned char USART_Receive(void)
{
// Wait until a byte has been received

   while((UCSRA&(1<<RXC)) == 0);

// Return received data

   return UDR;

}




Link do komentarza
Share on other sites

Witaj! Przejrzałem Twój kod i na pierwszy rzut oka wszystko jest ok. Przeczucie mi mówi że coś nie tak jest z funkcją wysyłającą stringi.

Spróbuj zrobić to tak:

void USART_TransmitString (unsigned char *str){
while( *str){
	USART_Transmit(str[i++]); 
	_delay_ms(50);
}
}

Jednak na początek wywal ją całkiem z programu i wyślij tylko pojedynczy znak.

Domyślasz się że te wysyłanie "stringów" to jest tylko z nazwy ??

Link do komentarza
Share on other sites

Dzięki za odzew:)

co do funkcji ze "stringiem" to i tak nie jest wywoływana, poprostu siedzi w kodzie 😋

Jak na razie dostaję same zera w terminalu, ponoć jest to problem ze złym dobraniem częstotliwości. Jednak wszystko robiłem zgodnie z datasheet.

Link do komentarza
Share on other sites

Zajrzyj do innych tematów było tego pełno. Ja również robiłem to zgodnie z dokumentacją atmegi i działało za pierwszym razem. Może coś nie tak z terminalem?? TX RX dobrze połączone??

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

Funkcja wysyłająca jest chyba OK, gorzej z deklaracją "stringu". Jeśli chcesz, żeby to był łańcuch znaków zakończony bajtem 0x00 czyli kompatybilny z Twoją funkcją wysyłającą, musisz to zadeklarować jako:

unsigned char d[] = {"A kuku!"};

W wersji osobnych znaków będzie to tablica 3 elementowa - u Ciebie "xyz" ale bez znacznika końca. Ale to tak na marginesie.

Wewnętrzny generator posiada deklarowaną przez producenta częstotliwość 8MHz ±1% tylko dla 5V i 25stopni. Jeżeli pracujesz z 3V to prawie na pewno baudrate rozjechało się. Spróbuj "pokręcić" rejestrem OSCCAL. Jeżeli nie masz możliwości dokładnego zmierzenia częstotliwości wyjścia któregoś timera albo chociaż czasu nadawania jednego bitu, wykonaj coś takiego:

OSCCAL += 2;

Ten rejestr ma już jakąś wartość wpisaną w procesie produkcji układu ale można ją zmienić - obejrzyj odpowiedni wykres w karcie katalogowej. Dobierz liczbę i znak zmiany tak, by zadziałało. U mnie zwykle pomaga max. odchyłka < 10 ale mierząc czasy wiem przynajmniej w którą stronę jechać. Z drugiej strony kilkuprocentowy błąd baudrate powinien skutkować odbiorem dziwnych znaków ale na pewno nie samymi zerami.. Hm..

A czy Twoja przejściówka USB/UART działa sama na siebie? Czy jak zewrzesz wyjście nadajnika z wejściem odbiornika to masz przejście z klawiatury terminala na ekran przy wyłączonym echu lokalnym?

Funkcja UART_Init() nie używa przekazanego argumentu tylko stałej - to nie błąd ale z czasem możesz o tym zapomnieć.

Acha, i nie wysyłaj nam kodu, który nie jest aktualny. Po co mamy się zastanawiać nad fragmentami funkcji, których i tak nie używasz?

EDIT: Napisałem jedną linię kodu i w niej jeden błąd nawiasu nie do pary - niezły wynik...

Link do komentarza
Share on other sites

Układ jest zasilany z programatora usb, czyli 5V.

Zwarłem TxD i RxD przejściówki i RealTerm zwraca symbol, który wysłałem, czyli OK.

TxD i RxD jest dobrze podłączone do Atmegi, sprawdzałem zamianę.

Może dzisiaj uda mi się sprawdzić częstotliwość na oscyloskopie.

[EDIT] OK, udało się, zabrakło jednego wpisu do rejestru UCSRC, który był w datasheet ;/

(1<<URSEL)

Dziękuję wszystkim za pomoc!

Link do komentarza
Share on other sites

Ech, i znowu (który to już raz?) ten piekielny URSEL, zmora starych "atmegów" nas zażył. Powinni tego zabronić albo chociaż drukować coś na obudowie układu:

"Uwaga, zawiera niebezpieczny bit URSEL, przed użyciem skontaktować się... itd".

Link do komentarza
Share on other sites

Ech, i znowu (który to już raz?) ten piekielny URSEL, zmora starych "atmegów" nas zażył. Powinni tego zabronić albo chociaż drukować coś na obudowie układu:

"Uwaga, zawiera niebezpieczny bit URSEL, przed użyciem skontaktować się... itd".

Nie sprawdził jakie pułapki na niego Atmel przyszykował: AVR: Czyhające pułapki - Pułapka nr 2

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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