Forum: Mikrocontroller und Digitale Elektronik avr mega8 usart beispielcode funktioniert bei mir nicht


von chris (Gast)


Lesenswert?

hallo,

wo liegt der Fehler? hab die Usart Funktionen aus dem Datenblatt 
übernommen aber es wird nichts gesendet...
bitte mal meinen Quellcode anschauen :)

#include <avr/io.h>
#include <stdint.h>
#include "main.h"

// F_CPU is defined by makefile
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1 // Asynchronous Normal mode

int main(void)
{

USART_Init(MYUBRR);

while(1) {  // Mainloop
USART_Transmit("hello");
USART_Transmit("\r\n");
}

return 0;
}

void USART_Init( unsigned int ubrr)
{
/* Set baud rate */
UBRRH = (unsigned char) (ubrr>>8);
UBRRL = (unsigned char)ubrr;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bits*/
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}

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

von Stefan E. (sternst)


Lesenswert?

Das kompiliert doch garantiert nicht ohne irgendwelche Warnings, oder?

Die Funktion USART_Transmit kann nur ein einzelnes Zeichen senden, 
keinen kompletten String.

Ersetze
  USART_Transmit("hello");
  USART_Transmit("\r\n");
durch
  USART_Transmit('h');
  USART_Transmit('e');
  USART_Transmit('l');
  USART_Transmit('l');
  USART_Transmit('o');
  USART_Transmit('\r');
  USART_Transmit('\n');

von chris (Gast)


Lesenswert?

ah ok, macht es einen Unterschied ob ich " oder ' benutze?
es kommt nun aber auch nichts an

von Fred S. (Gast)


Lesenswert?

Hi chris,

> wo liegt der Fehler? hab die Usart Funktionen aus dem Datenblatt
> übernommen aber es wird nichts gesendet...
Glaube kaum, dass so etwas im Datenblatt steht!
> #define MYUBRR F_CPU/16/BAUD-1 // Asynchronous Normal mode
OK, aber warum benutzt Du MYUBRR weiter unten nicht?

> USART_Transmit("hello");
> USART_Transmit("\r\n");
Vergleiche mal den Parameter dieses Aufrufs mit dem Parametern in der 
Funktion unten!!
> UBRRH = (unsigned char) (ubrr>>8);
> UBRRL = (unsigned char)ubrr;
sollte heißen: UBRR=MYUBRR;

> /* Set frame format: 8data, 2stop bits*/
> UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
Wirklich 2 Stopp-Bits -- was erwartet denn Dein Empfänger 
(Terminal-Programm o.ä.)?

> void USART_Transmit(unsigned char data)
Parameterdefinition anders als oben - hat der Compiler denn nicht 
gemeckert?

Vermutlich sind noch mehr Fehler drin, diese fallen aber auf dem ersten 
Blick besonders ins Auge.

Gruß

Fred

von Fred S. (Gast)


Lesenswert?

chris wrote:
> ah ok, macht es einen Unterschied ob ich " oder ' benutze?
> es kommt nun aber auch nichts an

Bitte informier' Dich mal in einem Standard-Werk zu C über "String" 
versus "char".

Gruß

Fred

von chris (Gast)


Lesenswert?

ich hab den fehler gefunden ich hätte auf die Kompiler Warnings achten 
sollen,
hatte die Funktionen garnicht deklariert...
einfach über der main Funktion noch dies Eingefügt:

void USART_Init( unsigned int ubrr);
void USART_Transmit(unsigned char data);

und siehe da es kommen Daten im Terminal an.
Danke für die Antworten!

von Stefan E. (sternst)


Lesenswert?

Fred S. wrote:

> Wirklich 2 Stopp-Bits -- was erwartet denn Dein Empfänger
> (Terminal-Programm o.ä.)?

Wenn er 2 Stop-Bits sendet, spielt es doch keine Rolle, ob der Empfänger 
1 oder 2 Stop-Bits erwartet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.