atmega16 UART / USART

Gast #2573322
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
Gast #2573358
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)
Gast #2573381
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?
Gast #2573394
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).
Gast #2573413
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
Gast #2573471
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.
Gast #2573473
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
Gast #2573499
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
Gast #2573579
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
Gast #2573604
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
Gast #2573619
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
Gast #2573631
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.
Gast #2573659
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
}
#2573663
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?
Gast #2573859
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
Angehängte Dateien:
Gast #2573881
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
#2573888
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren