Forum: Compiler & IDEs UART senden


von Sebastian (Gast)


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

von Stefan K. (_sk_)


Lesenswert?

Versuchs mal mit:
1
#include <avr/io.h>

Viel Spass, Stefan

von Sebastian (Gast)


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

von inoffizieller WM-Rahul (Gast)


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.

von Karl heinz B. (kbucheg)


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?

von Thorsten (Gast)


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.

von Sebastian (Gast)


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

von Hermann-Josef (Gast)


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

von Michael Wilhelm (Gast)


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

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.