mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zeichen auf serielle schnittstelle ausgeben


Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey leute könnt ihr mir sagen wie man ein Zeichen in ASCII Darstellung 
auf eine serielle Schnittstelle ausgeben kann??
Der Prozessor ist  mit 8MHz getaktet die Baudrate =9600Baud

Ich benutzt AVR-Studio GCC, ATMega128

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine serielle Schnittstelle überträgt eine Reihe von Bits. Was diese 
Bits letztendlich darstellen (ASCII-Zeichen, Zahlenwerte, ...) hängt 
ausschließlich davon ab, wie die empfangende Gegenstelle die Bits 
interpretiert. Wenn Du dem Empfänger sagst, er soll 8-Bit-Frames 
empfangen und diese jeweils als ASCII-Zeichen interpretieren, dann tut 
er das i.d.R. auch...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich les es mir die ganze zeit durch und recherchiert habe ich auch nur 
ich sag ja bin blutiger anfänger
und ich versteh da nur bahnhof

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ein ASCII-Zeichen ist, weißt Du aber? Wenn nicht, dann schau bitte 
mal bei Wikipedia nach!

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja das weiss ich schon

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
micro wrote:
> ja das weiss ich schon
Und wo liegt dann bitte genau das Problem? "Ich krieg es nicht hin" oder 
"ich versteh das nicht" ist keine ausreichende Beschreibung. Man müsste 
schon wissen, was Du schon probiert hast und wo es präzise hakt.

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Probelm ist folgendes....
Ich weiss einfach nich wo ich anfangen soll
ich deklarieren meine Ports
bsp PortA als eingang und PortB als ausgang

so und dann? Ich hab einfach keine ahnung wie ich weiter machen soll !

ich soll beachten das die schnittstelle nich beliebig schnell ist

daraus schliess ich doch das ich irgendwie abfragen muss ob das 
Statusregister bzw die schnittstelle bereit ist das nächste zeichen 
abzufragen?! aber wie?!

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab jetzt mal ein bisschen im tutorial gesucht
und zu dem ergebniss gekommen

#ifndef F_CPU
#define F_CPU 8000000UL    // Systemtakt in Hz - Definition als unsigned 
long beachten
#endif

#define BAUD 9600UL          // Baudrate

#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate


int main(void)
{
    UCR |= (1<<TXEN);
    UBRR = UBRR_VAL;

}

while (!(USR & (1<<UDRE)))  /* warten bis Senden moeglich 
*/
    {
    }

UDR = 'x';                  /* schreibt das Zeichen x auf die 
Schnittstelle */

Autor: Das Kleinkind (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja genau so funktioniert es.
Noch Fragen?

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja hab noch ne frage
und zwar wenn ich das im AVR-Studio mache und kann ich das da irgenwie 
im simulator testen?
Ausserdem lässt es sich nich compilieren also müssen fehler da sein

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe es nochmal erweitert damit er was auf die schnittstelle "schreibt"


#ifndef F_CPU
#define F_CPU 8000000UL    // Systemtakt in Hz - Definition als unsigned 
long beachten
#endif

#define BAUD 9600UL          // Baudrate

#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate


int main(void)
{
    UCR |= (1<<TXEN);
    UBRR = UBRR_VAL;

}

while (!(USR & (1<<UDRE)))  /* warten bis Senden moeglich 
*/
    {
    }

UDR = 'x';                  /* schreibt das Zeichen x auf die 
Schnittstelle */


int uart_putc(unsigned char c)
{
    while(!(USR & (1 << UDRE)))  /* warte, bis UDR bereit */
    {
    }

    UDR = c;                     /* sende Zeichen */
    return 0;
}

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
trotzdem wird es nich kompiliert

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
micro wrote:
> Ausserdem lässt es sich nich compilieren also müssen fehler da sein
Grundregel Nr. 1: Vollständiges Programm posten, damit man das 
nachvollziehen kann! In Deinem Schnipsel fehlen einige Dinge 
(Headerdateien...).

Grundregel Nr. 2: Formatierungsmöglichkeiten der Forensoftware nutzen! 
Dann ist der Code viel leichter lesbar.

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
haha johannes ich nehm an das war nich deine absicht aber meine frage 
hast du beantwortet  ich dachte es wär schon das fertige Programm =/
#ifndef F_CPU
#define F_CPU 8000000UL    // Systemtakt in Hz - Definition als unsigned long beachten 
#endif

#define BAUD 9600UL          // Baudrate

#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate


int main(void)
{
    UCR |= (1<<TXEN);
    UBRR = UBRR_VAL;
    
}

while (!(USR & (1<<UDRE)))  /* warten bis Senden moeglich                   */
    {
    }

UDR = 'x';                  /* schreibt das Zeichen x auf die Schnittstelle */


int uart_putc(unsigned char c)
{
    while(!(USR & (1 << UDRE)))  /* warte, bis UDR bereit */
    {
    }
 
    UDR = c;                     /* sende Zeichen */
    return 0;
}




Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
micro wrote:
> haha johannes ich nehm an das war nich deine absicht aber meine frage
> hast du beantwortet  ich dachte es wär schon das fertige Programm =/
Wenn Du das tatsächlich gedacht hast, dann solltest Du das 
AVR-GCC-Tutorial noch mal etwas gründlicher lesen! Da steht nämlich 
einiges drin, was so ein Programm noch alles braucht.

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kannst du mir nochmal sagen was in meinem fall in die header datei rein 
muss?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
micro wrote:
> kannst du mir nochmal sagen was in meinem fall in die header datei rein
> muss?
Bitte informiere Dich, was es mit Headerdateien auf sich hat! Da 
schreibst Du zunächst mal gar nichts selber rein. Die Headerdateien, die 
Du brauchst, sind fertig und müssen nur noch in Dein Programm 
eingebunden werden. Wie das geht, steht alles im Tutorial.

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einfach mit der standart header-datei oder?
#include<avr/io.h>

#ifndef F_CPU
#define F_CPU 8000000UL    // Systemtakt in Hz - Definition als unsigned long beachten 
#endif

#define BAUD 9600UL          // Baudrate

#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate


int main(void)
{
    UCR |= (1<<TXEN);
    UBRR = UBRR_VAL;
    
}

while (!(USR & (1<<UDRE)))  /* warten bis Senden moeglich                   */
    {
    }

UDR = 'x';                  /* schreibt das Zeichen x auf die Schnittstelle */


int uart_putc(unsigned char c)
{
    while(!(USR & (1 << UDRE)))  /* warte, bis UDR bereit */
    {
    }
 
    UDR = c;                     /* sende Zeichen */
    return 0;
}




Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab nochmal kurz ne frage zu dieser Zeile
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) 

und zwar hab ich diese Zeile aus dem Tutorial
Aber ich hab gedacht das UBRR durch (Taktfrequenz/(Baundrate*16)-1 
gebildet wird??

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also nochmal das was ich bisher habe funktioniert noch nich wirklich
kann mir jemand sagen wieso??
was noch fehlt?
#include<avr/io.h>
#ifndef F_CPU
#define F_CPU 8000000UL    // Systemtakt in Hz 
#endif
#define BAUD 9600UL          // Baudrate



#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden ((Taktfrequenz/Baundrate*16)-1)
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate




int main(void)
{
    UCR |= (1<<TXEN);
    UBRR = UBRR_VAL;
    
}

while (!(USR & (1<<UDRE)))        /* warten bis Senden moeglich */
    {    }

UDR = 'x';                  /* schreibt das Zeichen x auf die Schnittstelle */
     

             

int uart_putc(unsigned char c)
{
    while(!(USR & (1 << UDRE)))     /* warte, bis UDR bereit */
    {    }
 

    UDR = c;                       /* sende Zeichen */
    return 0;
}

void uart_puts (char *c)        /* Zeichen wird in uart_putc implementiert*/
{
    while (*c)
    { 
        uart_putc(*c);
        c++;
    }
}


Autor: Achja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>kann mir jemand sagen wieso??
>was noch fehlt?

Also ich nehme an, das das fehlt, dass dafür sorgen würde, das es 
wirklich funktioniert.

Falls das "nicht wirklich funktionieren" im Detail beschrieben wird, 
liesse sich vielleicht auch das, was fehlt im Detail beschreiben.

Im Moment sollte sich Dein Programm nicht kompilieren lassen.
Ich empfehle das oben angegebene Tutorial zu C.

Kleiner Tip: Welche Anweisungen oder Ausdrücke sind ausserhalb einer 
Funktion zulässig?

Autor: Christoph Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> kann mir jemand sagen wieso??
ja
> was noch fehlt?
Grundlegende C Kenntnisse

Du hast nichtmal eine Endlosschleife, dein "Programm" initialisiert den 
uart und beendet sich dann (schau mal in deine main-methode), 
desweiteren hängt da Code in der Luft.
Lies dir deine Compilerfehler durch und versuch sie zu verstehen, falls 
das nicht klappt poste sie hier ABER NICHT NOCHMAL DENSELBEN CODE!

Autor: Achja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich hab nochmal kurz ne frage zu dieser Zeile
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) 

>und zwar hab ich diese Zeile aus dem Tutorial
>Aber ich hab gedacht das UBRR durch (Taktfrequenz/(Baundrate*16)-1
>gebildet wird??

Im übrigen hilft es Kommentare zu lesen oder Codezeilen wenigsten 
vollständig zu kopieren.
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden 

Dem cleveren Leser ergibt sich dann zumindest ein Anhaltspunkt. In 
diesem Fall ein Runder .

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ christoph

ja da stimm ich dir zu das grundlegende Kenntnisse fehlen ....
ich muss auch ehrlich sagen das unser prof ein bisschen viel erwartet 
wenn man beachtet das wir uns noch nie mit c beschäftigt haben?!

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
../LABOR2.c:19: error: 'UCR' undeclared (first use in this function)
../LABOR2.c:19: error: (Each undeclared identifier is reported only once
../LABOR2.c:19: error: for each function it appears in.)
../LABOR2.c:20: error: 'UBRR' undeclared (first use in this function)
../LABOR2.c:24: error: expected identifier or '(' before 'while'
../LABOR2.c:31: error: expected identifier or '(' before 'while'

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe jetzt mal die endlosschleife eingebaut
stimmt die so
while(1)
{

int uart_putc(unsigned char c)
{
    while(!(USR & (1 << UDRE)))     /* warte, bis UDR bereit */
    {    }
 

    UDR = c;                       /* sende Zeichen */
    return 0;
}

void uart_puts (char *c)        /* Zeichen wird in uart_putc implementiert*/
{
    while (*c)
    { 
        uart_putc(*c);
        c++;
    }
}

}


Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
micro wrote:
> @ christoph
>
> ja da stimm ich dir zu das grundlegende Kenntnisse fehlen ....
> ich muss auch ehrlich sagen das unser prof ein bisschen viel erwartet
> wenn man beachtet das wir uns noch nie mit c beschäftigt haben?!
Ach, für die Uni ist das? Nun, auch ohne das näher zu erörtern kann man 
wohl sagen, dass Du allein durch versuchsweises Zusammenkopieren von 
Codeschnipseln aus Tutorien nicht viel weiter kommen wirst. Bitte 
besorge Dir (wenn Dein Prof keine Literatur empfohlen hat) in der 
Bibliothek ein Buch, das die C-Grundlagen ordentlich behandelt (z.B. den 
Kernighan & Ritchie) und eigne Dir die absoluten Basics an. Ohne die 
wirst Du auch mit den AVR-Tutorien nicht weit kommen, da die praktisch 
durchweg bereits allgemeine C-Kenntnisse voraussetzen.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du im Makefile bzw. AVRStudio unter Configuration Options auch den 
richtigen Ziel-Controller ausgewählt? Ohne das kennt der Compiler 
nämlich die richtigen Registernamen nicht, was dann zu den 
Fehlermeldungen führt.

EDIT:
Ich sehe grad, dass Du ja angeblich einen ATMega128 benutzt. Dann musst 
Du aber auch die entsprechenden Registernamen benutzen! Die Beispiele 
aus den Tutorien beziehen sich i.d.R. entweder auf einen ATMega8 oder 
sind allgemein gehalten. Beim ATMega128 gibt es keine Register "UCR" und 
"UBRR". Allein schon deshalb nicht, weil der Mega128 zwei UARTs hat, 
die mit 0 und 1 nummeriert sind. Bitte Datenblatt beachten!

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja das Problem ist nur wie ich schon gesagt habe
das wir ins kalte wasser geschmissen wurden ..... und gestern die 
aufgaben bekommen haben und wir es bis morgen machen müssen und dem prof 
is das völlig egal ob wir c-kenntnisse haben oder nicht fakt ist wenn 
wirs haben bestehn wir unser testat und wenn nich dann nicht .

ich probier das mal mit den configurations options

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
micro wrote:
> ich probier das mal mit den configurations options
Beachte auch die Ergänzung in meinem letzten Post. Das wird vermutlich 
eher das Problem sein!

Autor: micro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahhhh klar
aber das heisst ja auch wenn ich einfach mit dem ATmega8 simuliere 
müsste es gehn oder??

Autor: Christoph Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>aber das heisst ja auch wenn ich einfach mit dem ATmega8 simuliere
>müsste es gehn oder??

Nein, weil du wieder nur stupide rumkopiert hast und zwar diesmal 
Funktionen in eine Schleife. Die Funktionen haben ausserhalb der 
main-Funktion und die Endlosschleife innerhalb zu stehen.
Hänge in Zukunft dein C-File als Anhang an deinen Post und zwar 
komplett!

Autor: Michael Z. (incunabulum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist du eigentlich dieser hier?

Beitrag "Ausgaberoutinen"

Zumindest der Inhalt wie auch die Formulierungen sind sehr ähnlich.... 
ansonsten kann ich meinen Vorpostern nur recht geben. Wer an der Uni was 
erreichen will, der muss sich auch mal mit Grundlagen wie C 
beschäftigen. Damit solltest du zumindest schon einmal den Compiler 
überreden können

mz

Autor: Dieter Engelhardt (netdieter) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
micro wrote:
> ja das Problem ist nur wie ich schon gesagt habe
> das wir ins kalte wasser geschmissen wurden ..... und gestern die
> aufgaben bekommen haben und wir es bis morgen machen müssen und dem prof
> is das völlig egal ob wir c-kenntnisse haben oder nicht fakt ist wenn
> wirs haben bestehn wir unser testat und wenn nich dann nicht .

Darf ich mal fragen was das für ein Studiengang ist? Und an welcher 
Uni/FH?
>
> ich probier das mal mit den configurations options

Das ist schon mal der richtige Weg.
Ich rate Dir dringent Dir das Datenblatf für Deinen ATMega128 zu 
besorgen und schau Dir dann mal die Register an.

Viel Glück,
Dieter

Autor: Das Kleinkind (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier dürfte er wohl auch sein.
Beitrag "CHAR auf einem Port ausgeben"

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.