Forum: Mikrocontroller und Digitale Elektronik UART Problem mit Fleury Lib


von UART verzweifelter (Gast)


Lesenswert?

Hallo Ihr,

ich habe die Fleury Lib in meinem Controller im Einsatz.

In meinem Programm habe ich es genau so gemacht wie in dem Beispiel:
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <avr/signal.h>
5
#include <avr/pgmspace.h>
6
7
#include "uart.h"
8
9
10
/* define CPU frequency in Mhz here if not defined in Makefile */
11
#ifndef F_CPU
12
#define F_CPU 4000000UL
13
#endif
14
15
/* 9600 baud */
16
#define UART_BAUD_RATE      9600      
17
18
19
int main(void)
20
{
21
    unsigned int c;
22
    char buffer[7];
23
    int  num=134;
24
25
    
26
    /*
27
     *  Initialize UART library, pass baudrate and AVR cpu clock
28
     *  with the macro 
29
     *  UART_BAUD_SELECT() (normal speed mode )
30
     *  or 
31
     *  UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode)
32
     */
33
    uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
34
    
35
    /*
36
     * now enable interrupt, since UART library is interrupt controlled
37
     */
38
    sei();
39
    
40
    /*
41
     *  Transmit string to UART
42
     *  The string is buffered by the uart library in a circular buffer
43
     *  and one character at a time is transmitted to the UART using interrupts.
44
     *  uart_puts() blocks if it can not write the whole string to the circular 
45
     *  buffer
46
     */
47
    uart_puts("String stored in SRAM\n");
48
    
49
    /*
50
     * Transmit string from program memory to UART
51
     */
52
    uart_puts_P("String stored in FLASH\n");
53
    
54
        
55
    /* 
56
     * Use standard avr-libc functions to convert numbers into string
57
     * before transmitting via UART
58
     */     
59
    itoa( num, buffer, 10);   // convert interger into string (decimal format)         
60
    uart_puts(buffer);        // and transmit string to UART
61
62
    
63
    /*
64
     * Transmit single character to UART
65
     */
66
    uart_putc('\r');
67
}

Auf dem Computer kommt bei mir aber immer nur <0> an und das seeehr oft, 
also ganz komisch die Sache.

Wisst Ihr an was das liegen könnte?

Grüße und gute Nacht!

von AVR (Gast)


Lesenswert?

Hallo,

mein Tipp ist die

#define F_CPU 4000000UL

vor allen anderen #include zu haben.

von UART verzweifelter (Gast)


Lesenswert?

naja, das ist der code von fleury, meiner ist genau so aufgebaut. Wenn 
ich ein zeichen empfange, hab ich im terminal achtmal <0>. Bei einem 
string sieht das dann echt schon wild aus.
Also empfangen tu ich, aber immer nur diese zeichenfolge. Was bedeuten 
diese nullen in klammern?

Hoffe ihr könnt mir helfen

von Karl H. (kbuchegg)


Lesenswert?

Hast du kontrolliert, ob dein µC auch wirklich mit 4Mhz läuft?

von UART verzweifelter (Gast)


Lesenswert?

Ich sagte ja, ich hab es so umgeschrieben, es ist alles wirklich so, wie 
es bei mir sein soll.

von Karl H. (kbuchegg)


Lesenswert?

UART verzweifelter schrieb:
> Ich sagte ja, ich hab es so umgeschrieben, es ist alles wirklich so, wie
> es bei mir sein soll.

Das war nicht die Frage.
Die Frage war: Hast du kontrolliert (mit einem Experiment) ob die von 
dir im Programm gemachte Aussage "Mein µC arbeitet mit 4Mhz" auch den 
Tatsachen entspricht?

http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART

von UART verzweifelter (Gast)


Lesenswert?

okay, also die platine läuft mit 16mhz ich habe das mit f_cpu 
eingestellt. Bei meiner initialisierung habe ich 9600 per define 
eingestellt. Jetzt hab ich ebenfalls mit uart_puts eine ausgabe gemacht.
Ich probier es heute abend mal mit einem anderen uart.

Grüße

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

UART verzweifelter schrieb:
> okay, also die platine läuft mit 16mhz ich habe das mit f_cpu
> eingestellt.
Das allein reicht nicht. Mit dieser Angabe sagst du dem Compiler, dass 
das Programm auf einem uC laufen wird, dessen Beschaltung und die Fuses 
so eingestellt sind, dass er mit 16MHz läuft.
Das mußt du jetzt aber am uC mit der Programmer-Software auch noch 
entsprechend einstellen... :-o

Hast du die Taktfrequenz mit einer blinkenden LED kontrolliert?

von Karl H. (kbuchegg)


Lesenswert?

Und falls du dich fragst, warum wir hier auf diesem einen Punkt so 
herumreiten:
Die überwiegende Mehrheit (>95%) aller UART Probleme sind genau auf 
dieses Problem zurückzuführen: Der µC arbeitet mit einer ganz anderen 
Taktfrequenz (meistens 1Mhz) als der, mit der dann die Konstanten für 
die UART Beschickung ausgerechnet werden.

von UART verzweifelter (Gast)


Lesenswert?

Also das Problem mit der LED hab ich auch nicht gehabt, also die LED 
blinkte genau wie ich es wollte.
Ich versuche mal einen anderen UART evtl. hat der eben was.
Evtl passt auch was in der Initialisierung nicht. Ich hab die Baud-Rate 
mit #define definiert und dann an die Funktion übergeben.

von Carsten W. (eagle38106)


Lesenswert?

UART verzweifelter schrieb:
>
1
>     /*
2
>      * Transmit string from program memory to UART
3
>      */
4
>     uart_puts_P("String stored in FLASH\n");
5
> 
6
> 
7
>     /*
8
>

Es sollte der String auch im Flash stehen:
1
    /*
2
     * Transmit string from program memory to UART
3
     */
4
    uart_puts_P(PSTR ("String stored in FLASH\n"));
                 ^^^^^^                          ^
Gruß
Carsten

von Karl H. (kbuchegg)


Lesenswert?

Carsten Wille schrieb:
> UART verzweifelter schrieb:
>>
1
>>     /*
2
>>      * Transmit string from program memory to UART
3
>>      */
4
>>     uart_puts_P("String stored in FLASH\n");
5
>>
6
>>
7
>>     /*
8
>>
>
> Es sollte der String auch im Flash stehen:

Tut er.
uart_puts_P ist bei Fleury ein Makro

#define uart_puts_P(x)   uart_puts_p( PSTR(x) )

von UART verzweifelter (Gast)


Lesenswert?

er hat auch eine funktion für uart_puts("Text..."); reine Textausgabe.. 
Die würde ich ausschließich benutzen...

von UART verzweifelter (Gast)


Lesenswert?

Hallo Leute,

also an was es jetzt lag kann ich beim besten Willen NICHT sagen. Auf 
jeden Fall geht es jetzt...

Ich habe in der Fleury Lib eine Funktion uart_getc();
In dieser kann ich Fehler / Keine Daten erkennen und das Zeichen 
abspeichern, bzw als Echo zurückzu senden.

Wenn ich jetzt aber per PC zum Beispiel LED12 senden will, bekomm ich ja 
fünf Zeichen rein.
Jetzt kann ich die in ein Array speichern und mit dem String "LED12" 
vergleichen oder?
Also das Kommando annehmen und verarbeiten. Aber wie genau geh ich hier 
vor?
Ich habe da noch nicht so viel Erfahrung, was arbeiten mit Srings 
angeht.

Grüße

von Karl H. (kbuchegg)


Lesenswert?

UART verzweifelter schrieb:

> Wenn ich jetzt aber per PC zum Beispiel LED12 senden will, bekomm ich ja
> fünf Zeichen rein.

Genau

> Jetzt kann ich die in ein Array speichern

kannst du.
Allerdings solltest du in diesem Array eine Stringterminierung machen, 
denn genau so gehts ja dann weiter: Mit Stringverarbeitung.

> und mit dem String "LED12"
> vergleichen oder?

Ja. Dazu musst du einen String haben.

> Also das Kommando annehmen und verarbeiten. Aber wie genau geh ich hier
> vor?

Mit STringverarbeitung.
Dazu stellt dir C einige Basisfunktionen zur Verfügung. Dein C-Buch hat 
da mit Sicherheit ein ganzes großes Kapitel darüber, weil das eine 
wichtige C-Grundfertigkeit ist, mit STrings umgehen zu können.

Wie? Du hast kein C-Buch.
Du wirst eines brauchen! Es gibt noch so vieles in C, was man wissen und 
können sollte und ein C-Buch bringt dir das alles sukzessive in kleinen 
Schritten bei.

Also kauf dir eines!

In der Zwischenzeit kannst du hier mal die absoluten Grundlagen über 
Strings in C nachlesen. Das ist allerdings kein Ersatz für ein C-Buch!

http://www.mikrocontroller.net/articles/FAQ#Wie_funktioniert_String-Verarbeitung_in_C.3F

von UART verzweifelter (Gast)


Lesenswert?

1
    if(flag_uart0_get_command >= 1)
2
    {
3
      uart_puts(uart0_command_buffer);
4
      //uart0_command_buffer = 
5
6
      if(strcmp(uart0_command_buffer, "LED12") == 0)
7
        led12(ON);
8
9
      flag_uart0_get_command = 0;
10
    }
11
12
    // ASCII Zeichen holen und auswerten
13
    //
14
    if(flag_uart0_echo_mode >= 1)
15
    {
16
      unsigned int c;
17
      c = uart_getc();
18
19
      if(flag_uart0_get_command == 0)
20
      {
21
        uart0_command_buffer[temp_uart_cnt] = c;
22
        temp_uart_cnt++;
23
      }
24
25
      if(temp_uart_cnt == 5)
26
      {
27
        flag_uart0_get_command = 1;
28
        uart0_command_buffer[5] = '\0';
29
        temp_uart_cnt = 0;
30
      }
31
                 }


okay so ähnlich, aber es klappt nicht ganz, ich muss es immer 4 - 5 mal 
schicken, bis es klappt...
was mach ich falsch?

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.