www.mikrocontroller.net

Forum: Compiler & IDEs UART senden


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Habe bisher wenig Ahnung von dem, was ich da mache, aber hier kann mir 
bestimmt jemand helfen.

System: Atmega32, AVR Studio 4.12

Ich versuche einfach nur ein Zeichen über die serielle Schnittstelle zum 
PC zu senden. Das klappt solange, wie ich diese ganzen "special function 
register", sprich "UCSRB, UCSRB, ..." direkt im Programm deklariere. Die 
sollten doch eigentlich auch in einer Header-Datei stehen, oder? In der 
"iom32.h" habe ich zumindest die passende Deklaration gefunden. Binde 
ich die Datei ein, meckert der Compiler (Object file not found on 
expected location D:\...).

Wenn mir da mal einer nen Anstoß geben könnte wäre ich froh.

M f G
Sebastian

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal mit:
#include <avr/io.h>

Viel Spass, Stefan

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Hatte die Datei eingebunden, allerdings war bei den Projektoptionen der 
falsche Controller eingestellt...
Es mag jedoch noch nicht ganz funktionieren. Hier mal mein erster 
Versuch:


#define    F_CPU 4330000
#define   UART_BAUD_RATE 9600

#include <avr/io.h>
#include <lcd.h>
#include <uart.h>


int main(void)
{
        lcd_init(LCD_DISP_ON);
  lcd_puts ("Senden...");
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
main:
  uart_puts ("a");
goto main;
}


Viel ist da ja nicht dran, aber irgendwie ist da wohl noch was faul. Am 
Hyperterminal kommt absolut nichts an (Baudrate stimmt überein). Habe 
ich was wichtiges vergessen? Denke man muss da nicht mehr viel machen, 
die Fleury Bibliothek müsste ja reichen...

M f G
Sebastian

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benutz bitte kein goto!
Für sowas gibt es in C z.B. die while-Schleife.
Warum willst du unbedingt eine Bibliothek benutzen, von deren 
Vorgehensweise du nichts weißt?
Wirf einen Blick ins Datenblatt deines Controllers! Dort findest du zu 
fast jeder Funktion ein (funktionsfähiges) Beispiel.
Wenn es da zu Problemen kommt, kann unsereins wenigstens ins Datenblatt 
gucken und muß sich nicht irgendwelche Libraries herunterladen und 
installieren.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Habe ich was wichtiges vergessen?

Kabel. Gekreuzt oder nicht gekreuzt?

Nimm dir doch mal ein Multimeter (Oszi wäre besser) und
untersuch mal die Strecke ausgehend vom µC. Bis wohin
kannst du das Signal verfolgen?

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die uart_puts Funktion das 'A' einfach in das UART Senderegister 
schreibt und nicht wartet, bis der Sendevorgang beendet ist (wovon ich 
ausgehe), wirst du nichts sehen können, weil Du mit Deinem "GOTO" (Gott 
beware) zurück an den Anfang springst und dort die UART neu 
initialisierst. Und bei 9600Bd "dauert" ein Zeichen bekanntlich ca. 1ms.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@WM-Rahul:
Ich hab es schonmal mithilfe des GCC Tutorials ans laufen bekommen, 
allerdings finde ich die Bibliotheks-Lösung einfacher.

@kbucheg:
Das ist ein normales Nullmodem-Kabel, also gekreuzt... hat bisher auch 
immer damit geklappt.

@Thorsten:
OK.. vll ist goto nicht wirklich sinnvoll, werde es mal mit einzelnen 
Zeichen probieren und ne gewisse Zeit dazwischen warten. Das ganze soll 
erstmal überhaupt funktionieren....


M f G
Sebastian

Autor: Hermann-Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Sebastion,

für die UART-Library von P.Fleury muss man noch 2 Defines für den gcc 
setzen, ich mache das von Linux aus in einem Makefile:

DEFINES += -DUART_TX_BUFFER_SIZE=16 -DUART_RX_BUFFER_SIZE=16

Die jeweiligen Sizes müssen Potenzen von 2 (8, 16, 32, usw.) sein. Beim 
AVR-Studio sollte das auch irgendwie gehen - hab' ich aber noch nicht 
probiert.

Viel Erfolg
HJ

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Empfehlenswert wäre auch noch ein

while (!(UCSRA & 1 << TXC));

vor dem

uart_puts ("a");

Dann wartet der Controller bis das vorherige Zeichen gesendet wurde.

MW

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.