www.mikrocontroller.net

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


Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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');

Autor: chris (Gast)
Datum:

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

Autor: Fred S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fred S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.