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.