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


von michi (Gast)


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.
1
  /* USART-Init beim ATmega16 */
2
 
3
int main(void)
4
{
5
    UCSRB |= (1<<TXEN);                // UART TX einschalten
6
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1 
7
 
8
    UBRRH = UBRR_VAL >> 8;
9
    UBRRL = UBRR_VAL & 0xFF;
10
}
11
12
13
14
15
16
17
18
/ bei neueren AVRs andere Bezeichnung fuer die Statusregister, hier ATmega16:
19
int uart_putc(unsigned char c)
20
{
21
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
22
    {
23
    }                             
24
 
25
    UDR = c;                      /* sende Zeichen */
26
    return 0;
27
}

von Patrick (Gast)


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.

von µCnoob (Gast)


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ß

von michi (Gast)


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;
}

von michi (Gast)


Lesenswert?

@  µCnoob

Ich kann leider nicht so gut Englisch.

von ich (Gast)


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.....

von michi (Gast)


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.

von ich (Gast)


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-Tutorial#Der_UART

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

von Patrick (Gast)


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;
}

von michi (Gast)


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.

von Johnny (Gast)


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.

von Patrick (Gast)


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.

von ich (Gast)


Lesenswert?

Da ich mir den Vorwurf des nicht helfens nicht gefallen lasse, ist hier 
der unfassbar komplizierte Code für Bascom:
1
$regfile = "m32def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 16000000
6
$baud = 9600
7
8
9
Do
10
   Print "hallo"
11
Loop
12
13
End

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

von michi (Gast)


Lesenswert?

Danke für die hilfe dann ist doch alles gut geworden.

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.