Skocz do zawartości

[C][Atmega8] Problem z UARTem


starcu

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_ */
Link do komentarza
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
Link do komentarza
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ę.

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.