Skocz do zawartości
Zaloguj się, aby obserwować  
starcu

[C][Atmega8] Problem z UARTem

Pomocna odpowiedź

Witam, próbuję napisać program obsługujący UART w mojej atmedze8. Na atmega328p nie mam żadnych z tym problemów, ale do 8 już nie mam siły. Mój mikrokontroler to czysta atmega8 bez zewnętrznego kwarcu, próbowałem różnych ustawień BAUD i nic.

Mój kod .c:

#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
#include "USART.h"

int main (void)
{

DDRD |= 0xff;
USART_Init(MYUBRR);

while(1){

		USART_Send_string("hello world \n");
		_delay_ms(500);
}

return 0;

}

Mój kod .h

/*
* USART.h
*
* Created: 2015-09-16 16:03:58
*  Author: Łukasz
*/ 


#ifndef USART_H_
#define USART_H_

#define FOSC 1000000
#define BAUD 9600	  //baud
#define MYUBRR (((FOSC / (BAUD * 16L))) - 1) //inaczej: (((((FOSC * 10) / (16L * BAUD)) + 5) / 10) - 1) //UBR ratio

void USART_Init( unsigned int ubrr);

void USART_Sendbyte( uint8_t data );
void USART_Send_string(const char *str);
void USART_Send_int(unsigned int d);

unsigned char USART_Receive( void );

void USART_Init( unsigned int ubrr){
/*Set baud rate */
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
//wlaczenie rx-receiver i tx-transmitter
UCSRB = (1<<RXEN)|(1<<TXEN);
//UCSRB = (1 << RXCIE); //przerwanie gdy ramka zostanie odebrana
// ramka 8bitowa z 1 bitem stopu
UCSRC = (1<<USBS)|(1<<UCSZ0);
}

void USART_Sendbyte(uint8_t data){
/* czekaj az bufor sie wyczysci */
while ( !( UCSRA & (1<<UDRE)) )
;
/* dane do bufora i wyslanie danych */
UDR = data;
}

void USART_Send_string(const char *str){
while (*str)
USART_Sendbyte(*str++);

}

#endif /* USART_H_ */

Udostępnij ten post


Link to post
Share on other sites

1. Przy kwarcu 1MHz będzie trudno uzyskać sensowne prędkości transmisji. Już 9600 wymaga niecałkowitego podzielnika. Policz to na kalkulatorze zanim każesz kompilatorowi wpisać 5.5 do UBRR. 4800bd to najszybciej co możesz nadawać chyba, że użyjesz podwajacza prędkości - bitu U2X w UCSRA.

2. Dostęp do rejestru UCSRC jest inny - podczas zapisu musisz ustawiać bit URSEL.

3. 8-bitowe ramki dostaniesz gdy ustawisz UCSZ1 i UCZS0. Teraz masz 6-bitowe, co nawet w połączeniu z dwoma bitami stopu (po co USBS?) nie gwarantuje prawidłowego odbioru gdy druga strona oczekuje 8 bitów danych.

4. Nieprawdziwe komentarze są gorsze niż żadne.

5. Nie pisz ".. i nic", bo nie wiadomo czy odbierasz na terminalu krzaki, czy czasem zdarzają się błędy albo czy zupełnie nic nie idzie, procesor zwisa a po sprawdzeniu woltomierzem linia TXD w ogóle się nie rusza - objawy musisz opisać najdokładniej jak potrafisz. Lekarz zabiłby Cię śmiechem gdybyś powiedział: "Jestem chory i poproszę o jakieś dobre lekarstwo", nieprawdaż?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dzięki wielkie za pomoc, już wszystko działa. Rzeczywiście problemem był głównie URSEL, a żeby przejść z 2 bitów stopu na jeden bezmyślnie niechcący skasowałem jeden z bitów UCSZ robiąc ramkę 6-bitową. Gdy kiedyś będę miał jakiś problem to opiszę go lepiej, jeszcze raz dziękuję.

Udostępnij ten post


Link to post
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!

Gość
Napisz odpowiedź...

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

Zaloguj się, aby obserwować  

×
×
  • Utwórz nowe...