www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Senden mit dem UART geht nicht


Autor: michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo kann mir jemand sagen wie ich mit den Quelltexten das im C 
Tutorial unter  "Der UART" stehen eine Zeichenkette von: 00010000 
00100000 00110000 01000000 und so weiter senden kann, es sollen 
insgesamt 14 stück gesendet werden, mit einer rate von 2400

Ich habe den Quelltext füt den atmega16 in mein 16er geladen aber es 
geht nicht. Der Quelltext aus UART initialisieren hat denke ich 
funktioniert bin mir aber nicht sicher, jetzt muss ich noch Schreiben 
einer Zeichenkette (String) einfügen, was ich auch schon versucht habe 
aber ich bekomme kein ausgangssignal.

Kann mir "bitte bitte bitte" jemand den Quelltext so zusammenstellen, 
das ich 14 Byte mit einer Übertragungsrate von 2400 bound und einem 
Stopbit für den atmega 16, senden kann.
  /* USART-Init beim ATmega16 */
 
int main(void)
{
    UCSRB |= (1<<TXEN);                // UART TX einschalten
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1 
 
    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;
}







/ bei neueren AVRs andere Bezeichnung fuer die Statusregister, hier ATmega16:
int uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
    {
    }                             
 
    UDR = c;                      /* sende Zeichen */
    return 0;
}







Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo michi

Ist das Dein ganzes Programm? Wo wird denn uart_putc aufgerufen? Und wo 
ist Deine Endlosschleife im main? So kann das ja nicht funktionieren.

Autor: µCnoob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest auch die Lib von Peter Fleury (google) verwenden, da klappts 
nähmlich schon,...
Einarbeitungszeit ca. 3-4h

Dann kannst du mit dieser Vorlage immernoch deine eigene UART- Lib 
zusammenstellen.

Gruß

Autor: michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hallo michi

>Ist das Dein ganzes Programm? Wo wird denn uart_putc aufgerufen? Und wo
>ist Deine Endlosschleife im main? So kann das ja nicht funktionieren.


Ja das ist alles sorry oben habe ich das aus dem Tutorial zur übersicht 
eingefügt hier ist mein Programm:

#include <avr/io.h>
#include <stdint.h>

int main (void)
{

uint8_t Speicher1 ;
uint8_t USR;
uint8_t UBRR_VAL;

DDRB  = 0xff;
DDRA  = 0x00;
PORTA = 0xff;



    UCSRB |= (1<<TXEN);                // UART TX einschalten
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1

    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;



int uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
    {
    }

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

return 0;
}

Autor: michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  µCnoob

Ich kann leider nicht so gut Englisch.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das dein Erst ist, dass das dein "Programm" sein soll fehlen dir 
jegliche Grundlagen in C!!!

Einfach mal bei google nach C-Tutorial suche, das hilft für den Anfang 
immer und dann mir uC Programmierung anfangen und nicht umgekehrt.....

Autor: michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ ich

danke für deine Hilfe aber damit ist mir auch nicht geholfen wenn du so 
schlau bist dann schreib doch mal den Quelltext so um wie ich ihn 
brauche.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist das dir die Grundstruktur von C-Programmen nicht bekannt 
ist. Damit schreibt dir einer dieses Programm richtig um und was 
passiert beim nächsten???    Dann darf dir der nächste das Programm 
schreiben??  Ich meine, wenn man das Teil nicht zum laufen bekommt, dann 
sag ich nie was, denn es ist noch nie ein Meister vom Himmel gefallen, 
aber bei Leuten die nur Code-Schnipsel in ein Forum posten und eine 
Lösung präsentiert bekommen wollen ......

UART-Tutorial:
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Und für Anfänger lohnt sich mal ein Blick auf Bascom!

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du ein Datenblatt vom ATMega16? Ab Seite 169 steht, auf welchen 
Wert Du UBRR einstellen musst, um eine Baudrate von 2400 zu erreichen. 
Dazu musst Du wissen, was für einen Quarz Du verwendest.

[c]
#include <avr/io.h>
#include <stdint.h>

int uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
    {
    }

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



int main (void)
{

uint8_t Speicher1 ;
uint8_t USR;
uint8_t UBRR_VAL = DeinWert;
uint8_t i = 0;

DDRB  = 0xff;
DDRA  = 0x00;
PORTA = 0xff;



    UCSRB |= (1<<TXEN);                // UART TX einschalten
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1

    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;

while(1)
{
 switch (i){
  case 0:  uart_putc(ersterWert);
           i++;
           break;
  case 1:  uart_putc(zweiterWert);
           i++;
           break;
  .
  .
  .
  case 13: uart_putc(14.Wert);
           i=0;
           break;
}


return 0;
}

Autor: michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Q ich

Ich kann in C programierne aber manches verstehen in noch nicht so 
richtig ein Programm kann ich auch schreiben. Das unter "int 
uart_putc(unsigned char c)" ist eine Funktion die ich in "int main 
(void)" wieder aufrufen muss. Alles unter "main" außer die Variablen 
müssen in eine  Schleife " While (1);{ ... }" ich war mir aber nicht 
sicher was in die Schleife muss.

Ich braucher einfach nur mal hilfe aber danke für deine bemühungen.

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du Anfänger bist, dann fang mal bei was Kleinem an. Z.B. eine LED 
blinken lassen. Wenns klappt machst Du was mit einem Timer. Dann 
Interrupts.... Und wenn das geht, dann wage Dich an die UART heran.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich kann in C programierne
Das wage ich zu bezweifeln

>Das unter "int uart_putc(unsigned char c)" ist eine Funktion die ich in "int 
>main (void)" wieder aufrufen muss.
Aber Du darfst sie nicht in int main (void) deffinieren. Das muss 
unabhängig erfolgen.

>Alles unter "main" außer die Variablen müssen in eine  Schleife " While (1);{ 
>... }"
Falsch. Alles was Du nur einmal initialisieren musst, kommt vor die 
Schleife.
>ich war mir aber nicht sicher was in die Schleife muss.
man siehts.

Ich denke, Du solltest Dir nochmal die Grundlagen für C ansehen. Da 
fehlt doch noch einiges.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ich mir den Vorwurf des nicht helfens nicht gefallen lasse, ist hier 
der unfassbar komplizierte Code für Bascom:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600


Do
   Print "hallo"
Loop

End

Natürlich muss muss er noch angepasste werden, aber das sollt ja kein 
Problem sein. Es ist ja kein C!!

Autor: michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die hilfe dann ist doch alles gut geworden.

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.