Forum: Mikrocontroller und Digitale Elektronik atmega16 UART / USART


von Phil (Gast)


Lesenswert?

Hey Leute,

Ich geistere schon seit Monaten auf eurem Forum herum, es
vereinfacht den Start mit µC enorm.
Ich wollte jetzt eine Kommunikation zwischen nem atmega16 und dem PC 
über seriell einrichten...
Habe mir das Programm Putty eingerichtet, der Port und die Daten sind 
denk ich richtig angegeben, da eine Überbrückung der Kabel die 
Buchstaben an Putty zurücksendet.

Nur leider habe ich Probleme ein Programm zu schreiben, dass auf dem 
atmega16 erstmal nur zeichen ausgibt...
Bis jetzt soll mein Programm "x" in 1 Sekunden Abständen ausgeben, es 
kommt aber nichts an...
Ich habe schon mehrere Libraries gesehen (uart.h/usart.h), nur sind die 
alle sehr verschollen im Netz...

Wäre super, wenn ihr mir helfen könntet!!

Vielen Dank!

Phil

von Jonas B. (jibi)


Lesenswert?

Code?

Gruß Jonas

von Uwe (de0508)


Lesenswert?

Hier die Lib von Peter,

Beitrag "AVR-GCC: UART mit FIFO"

Bitte noch die Änerungen aus dem Thread einbauen.

von Phil (Gast)


Lesenswert?

1
#include <stdio.h>
2
#include <util/delay.h>
3
4
#define F_CPU 4000000UL // Clock Speed
5
#define BAUD 9600
6
#define MYUBRR F_CPU/16/BAUD-1
7
8
void main( void )
9
{
10
  
11
USART_Init ( MYUBRR );
12
13
while (1){
14
USART_Transmit("x");
15
_delay_ms(1000);  
16
}
17
}
18
19
void USART_Init( unsigned int ubrr)
20
{
21
/* Set baud rate */
22
UBRRH = (unsigned char)(ubrr>>8);
23
UBRRL = (unsigned char)ubrr;
24
/* Enable receiver and transmitter */
25
UCSRB = (1<<RXEN)|(1<<TXEN);
26
/* Set frame format: 8data, 2stop bit */
27
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
28
29
30
void USART_Transmit( unsigned char data )
31
{
32
/* Wait for empty transmit buffer */
33
while ( !( UCSRA & (1<<UDRE)) )
34
;
35
/* Put data into buffer, sends the data */
36
UDR = data;
37
}
Das meiste ist aus dem Datasheet übernommen, leider funzt dieser code 
nicht wirklich... (13 Error)

von AVR (Gast)


Lesenswert?

Phil schrieb:
> Das meiste ist aus dem Datasheet übernommen, leider funzt dieser code
> nicht wirklich... (13 Error)

Was für errors und wo?

von AVR (Gast)


Lesenswert?

Phil schrieb:
> UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);

hier danach fehlt z.B. ein }

von Achim M. (minifloat)


Lesenswert?

Phil schrieb:
> #include <stdio.h>

#include <avr/io.h> bitte.
mfg mf

von Phil (Gast)


Lesenswert?

1
Error  9  'UBRRH' undeclared (first use in this function)  C:\Users\Phil\Documents\AVRStudio 5.1\AVRGCC1\AVRGCC1\AVRGCC1.c  29  1  AVRGCC1
2
Error  11  'UBRRL' undeclared (first use in this function)  C:\Users\Phil\Documents\AVRStudio 5.1\AVRGCC1\AVRGCC1\AVRGCC1.c  30  1  AVRGCC1
3
Error  12  'UCSRB' undeclared (first use in this function)  C:\Users\Phil\Documents\AVRStudio 5.1\AVRGCC1\AVRGCC1\AVRGCC1.c  32  1  AVRGCC1
4
Error  13  'RXEN' undeclared (first use in this function)  C:\Users\Phil\Documents\AVRStudio 5.1\AVRGCC1\AVRGCC1\AVRGCC1.c  32  13  AVRGCC1
5
Error  14  'TXEN' undeclared (first use in this function)  C:\Users\Phil\Documents\AVRStudio 5.1\AVRGCC1\AVRGCC1\AVRGCC1.c  32  23  AVRGCC1
6
Error  15  'UCSRC' undeclared (first use in this function)  C:\Users\Phil\Documents\AVRStudio 5.1\AVRGCC1\AVRGCC1\AVRGCC1.c  34  1  AVRGCC1
7
Error  16  'URSEL' undeclared (first use in this function)  C:\Users\Phil\Documents\AVRStudio 5.1\AVRGCC1\AVRGCC1\AVRGCC1.c  34  13  AVRGCC1
8
Error  17  'USBS' undeclared (first use in this function)  C:\Users\Phil\Documents\AVRStudio 5.1\AVRGCC1\AVRGCC1\AVRGCC1.c  34  24  AVRGCC1
9
Error  18  'UCSZ0' undeclared (first use in this function)  C:\Users\Phil\Documents\AVRStudio 5.1\AVRGCC1\AVRGCC1\AVRGCC1.c  34  34  AVRGCC1
10
Error  19  'UCSRA' undeclared (first use in this function)  C:\Users\Phil\Documents\AVRStudio 5.1\AVRGCC1\AVRGCC1\AVRGCC1.c  39  12  AVRGCC1
11
Error  20  'UDRE' undeclared (first use in this function)  C:\Users\Phil\Documents\AVRStudio 5.1\AVRGCC1\AVRGCC1\AVRGCC1.c  39  24  AVRGCC1
12
Error  21  'UDR' undeclared (first use in this function)  C:\Users\Phil\Documents\AVRStudio 5.1\AVRGCC1\AVRGCC1\AVRGCC1.c  42  1  AVRGCC1
13
Error  22  expected declaration or statement at end of input  C:\Users\Phil\Documents\AVRStudio 5.1\AVRGCC1\AVRGCC1\AVRGCC1.c  43  1  AVRGCC1

Die meisten Fehler sind "undeclared" fehler, habe ich eine library 
vergessen?

von Phil (Gast)


Lesenswert?

Danke Mini Float!!
jetzt nur noch 1 Fehler:
1
Error  9  expected declaration or statement at end of input  C:\Users\Phil\Documents\AVRStudio 5.1\AVRGCC1\AVRGCC1\AVRGCC1.c  37  1  AVRGCC1

von AVR (Gast)


Lesenswert?

Phil schrieb:
> Danke Mini Float!!
> jetzt nur noch 1 Fehler:Error  9  expected declaration or statement at end of 
input  C:\Users\Phil\Documents\AVRStudio 5.1\AVRGCC1\AVRGCC1\AVRGCC1.c  37  1 
AVRGCC1

tipp die Meldung einfach einmal bei Google ein und du wirst feststellen, 
dass du ein } vergessen hast (was ich bereits geschrieben habe).

von Phil (Gast)


Lesenswert?

Vielen Dank für eure Hilfe!
Der Code wurde jetzt artig compiliert…
mit dem letzten Fehler hast du recht, ich hab gleichzeitig das auch 
gegoogelt, aber ihr wart schneller xD.
Leider spuckt der at immer noch nichts aus...
Woran könnte es noch liegen?
ich verwende derzeit 0.1µF Keramikkondensatoren und keine Elkos, kann 
das daran liegen?
außerdem hab ich grad keinen externen Quarz dran... aber trotzdem müsste 
er so ein paar zeichen ausspucken können, oder?

Vielen Dank!!

Phil

von Krapao (Gast)


Lesenswert?

> außerdem hab ich grad keinen externen Quarz dran... aber trotzdem müsste
> er so ein paar zeichen ausspucken können, oder?

Wer sagt, dass er nicht spuckt? Er hat nur ein so schlechtes Timing, 
dass der PC sich rechtzeitig weg duckt.

von Phil (Gast)


Lesenswert?

Ok, ich hau dann mal jetzt den externen Quarz dran, mal gucken obs dann 
klappt...
Hat vielleicht jmd. einen Beispiel Code für die Library von Peter?
außerdem... wie installiert man so eine .patch Datei...

Vielen Dank!

Phil

von Phil (Gast)


Lesenswert?

habe jetzt einen externen Quarz mit 14,7456 MHz drin... 22pF 
Kondensatoren
in den Fuses kann man ja nur 16k Crystal einstellen mit 64ms Startup.
Stelle ich jetzt F_CPU im Programm auf 14,... oder 16 MHz ein??
Muss ich die Baudrate noch verändern?

Vielen Dank!!

Phil

von Männel (Gast)


Lesenswert?

>Stelle ich jetzt F_CPU im Programm auf 14,... oder 16 MHz ein??
>Muss ich die Baudrate noch verändern?

Du musst das einstellen was du nutzt,
also 14,...MHz

>Muss ich die Baudrate noch verändern?
Nein
1
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
änder das auf
1
UCSRC = (1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);

jetzt mal eine andere frage wenn du dein Terminal Programm aufhast wie 
verhält sich der schwarze Balken (bei mir ist er schwarz Tereterm)
Wenn er schnell blinkt hast du im terminal falsch Einstellungen
und wenn er in 1 sec.(glaube ich) blinkt ist der code falsch, so als 
kleine Hilfe bei der Fehler suche

von Phil (Gast)


Lesenswert?

Danke für deine Antwort!
Ich stell das mit dem Register gleich um!
Bei mir in Putty ist der Balken immer Grün gefüllt, blinkt nicht.
Die Verbindung von PC bis zum steckbrett funzt auch, wenn ich nämlich 
die Pins 2 und 3 überbrücke, dann kommen die eingegebenen zeichen wieder 
an...

Ich werde mir auch gleich mal Tereterm angucken, vllt hilft mir das ja 
weiter...

Vielen Dank!

Phil

von Phil (Gast)


Lesenswert?

Ok, jetzt kommt was an...

ich habe im Programm eingestellt, dass er "x" auspucken soll in 
1-sek-Abständen...

ich habe eben mit Überbrückung gesehen, dass wenn ich X schreibe, dass 
ein Ü ankommt...komisch

Jedenfalls kommt jetzt endlich was vom µC an, aber nur schrott… (merke: 
Ü = X)

ÀðÀðüþüððþüÿàðÀøààüÿðøÀþðÿÿàøàÀüøøÿððüÀüÿÀàðþøðþþðþüþüÿþðàøàÀøàøÿÿøøðÀðþ 
üÀà

Nur zur Info, ich habe auch zu kleine Kondis dran...gewünscht sind Elkos 
mit 1 µF, ich hab Keramik mit 0,1µF, vllt ist das ja der entscheidende 
Unterschied...

Aber vielen Dank Männel, das war der Fehler!!

Phil

von Phil (Gast)


Lesenswert?

Kann man da auch Keramik mit 1 µF nehmen statt Elkos?

von Männel (Gast)


Lesenswert?

Klar mit dem Überbrücken ist eine Methode, aber der nachteil ist
wenn du das terminal Programm zb. auf 115000 Baud und 2 Stopbits 
einstellst wird er die auch bekommen weil sie ja von Ihm selbst ist und 
nicht vom mega.

Du kannst auch eine LED an TXD stecken ob die blinkt.

von Männel (Gast)


Lesenswert?

wenn die zeichen auch im sekunden takt raus kommen weisst du das es 
reicht kannst auch im datenblatt nachschauen ob es ausreicht. ob elko 
oder keramik it glaube ich egal.

dass mit den zeichen kann daran ligen da du nirgends wo geschrieben was 
das X  ist
kannst es ja mal so veruschen
1
void main( void )
2
{
3
unsigned char senden [] = "x"; 
4
USART_Init ( MYUBRR );
5
6
while (1){
7
USART_Transmit(senden);
8
_delay_ms(1000);  
9
}
10
}

von Karl H. (kbuchegg)


Lesenswert?

Phil schrieb:

> ich habe eben mit Überbrückung gesehen, dass wenn ich X schreibe, dass
> ein Ü ankommt...komisch
>
> Jedenfalls kommt jetzt endlich was vom µC an, aber nur schrott… (merke:
> Ü = X)
>
> ÀðÀðüþüððþüÿàðÀøààüÿðøÀþðÿÿàøàÀüøøÿððüÀüÿÀàðþøðþþðþüþüÿþðàøàÀøàøÿÿøøðÀðþ üÀà

Wenn der Empfänger etwas anderes 'sieht' als der Sender schickt, dann 
liegt das praktisch immer daran, dass die Baudrate nicht stimmt. Und das 
liegt wieder in der überwiegenden Mehrzahl der Fälle daran, dass die 
Taktfrequenz falsch angegeben wurde.

Es reicht nicht einen Quarz an den Mega 'zu schrauben'. Der muss auch 
aktiviert werden (per Fuse). Hast du das gemacht?

von Stefan E. (sternst)


Lesenswert?

Es funktioniert auch nicht sonderlich gut, eine Funktion, die ein 
einzelnes Zeichen erwartet, mit einem String zu füttern.

von Phil (Gast)


Angehängte Dateien:

Lesenswert?

Hey allerseits!

Erstmal vielen Dnak für eure zahlreichen Antworten!!

1. Die Fuses hab ich gesetzt auf 16k Crystal + 64ms, er spuckt auch gar 
nichts aus, wenn ich den rausziehe...
2. Habe jetzt mal TeraTerm laufen, viel besser als putty auf jeden fall, 
der Balken ist die meiste Zeit "hohl", und blinkt sehr unregelmäßig, 
heißt denk ich nichts gutes...
3. F_CPU ist auf 14,7456 MHz eingestellt. Reicht es, wenn ich das nur da 
eingebe, oder muss man das noch woanders vermerken?
4.Leider sind die abstände zwischen den Zeichen seeehhr unregelmäßig, 
zwischen 0.5 sek und 10 Sek.

Ich werde jetzt mal zu Conrad fahren und mir n paar 1 µF Elkos 
besorgen... Habt ihr noch eine Idee was für einen Quarz? oder ist der in 
Ordnung?

Hab noch n Screenshot von Putty reingesetzt, wenn jmd damit was anfangen 
kann xD.

Vielen Dank!!

Phil

von Phil (Gast)


Lesenswert?

@Stefan:
ich habe ja beides ausprobiert...
1
USART_Transmit(senden);
und
1
USART_Transmit("x");
spuckt er bei beidem nur schrott aus...

von Stefan E. (sternst)


Lesenswert?

Phil schrieb:
> @Stefan:
> ich habe ja beides ausprobiert...

Und beides ist auf die gleiche Art und Weise falsch.
Wie sieht in C ein einzelnes Zeichen aus?

von Phil (Gast)


Lesenswert?

Wenn ich un TeraTerm überbrücke, weit weg vom rs232, dann spuckt dieser 
mir ein x aus, beim drücken von x! xD

Wenn ich aber vor dem rs232 überbrücke, also den Empfangsdraht vom 
Computer am rs dranlassen und nur den Sendedraht dazupacken, dann spuckt 
er größtenteils ein Ü aus, wenn ich n x drücke, vllt hilft einem das 
ja...

Glaube eher nicht..
:-P

L.G.
Phil

von Cyblord -. (cyblord)


Lesenswert?

Das ist dermaßen lächerlich. Hier versucht jemand serielle Daten zu 
übertragen, und kann noch nichtmal die io.h selbständig einbinden bzw. 
die Fehlermeldungen dazu interpretieren. Weiß den Unterschied zwischen 
Strings und Chars und, und weiß Gott was da noch alles an Basics fehlt.
MANN lerne die Grundlagen und dann komm wieder. Ist doch quatsch hier 
einen Step by Step ich lerne C von null auf Kurs im Thread zu 
veranstalten.

Und dann wird immer auf dem Quarz rumgeritten. Wenn man den internen OSC 
benutzt dann geht man halt mit der Baudrate auf 2400 runter. Das sollte 
nicht das Problem sein. Auf diese Art und Weise mache ich serielle Debug 
Ausgaben seit Jahr und Tag und immer nur mit dem internen Oszillator. 
Und noch nie lag ein Fehler in der Übertragung an einer zu großen 
Ungenaugkeit desselben.

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.