mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART Problem mit Fleury Lib


Autor: UART verzweifelter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>

#include "uart.h"


/* define CPU frequency in Mhz here if not defined in Makefile */
#ifndef F_CPU
#define F_CPU 4000000UL
#endif

/* 9600 baud */
#define UART_BAUD_RATE      9600      


int main(void)
{
    unsigned int c;
    char buffer[7];
    int  num=134;

    
    /*
     *  Initialize UART library, pass baudrate and AVR cpu clock
     *  with the macro 
     *  UART_BAUD_SELECT() (normal speed mode )
     *  or 
     *  UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode)
     */
    uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
    
    /*
     * now enable interrupt, since UART library is interrupt controlled
     */
    sei();
    
    /*
     *  Transmit string to UART
     *  The string is buffered by the uart library in a circular buffer
     *  and one character at a time is transmitted to the UART using interrupts.
     *  uart_puts() blocks if it can not write the whole string to the circular 
     *  buffer
     */
    uart_puts("String stored in SRAM\n");
    
    /*
     * Transmit string from program memory to UART
     */
    uart_puts_P("String stored in FLASH\n");
    
        
    /* 
     * Use standard avr-libc functions to convert numbers into string
     * before transmitting via UART
     */     
    itoa( num, buffer, 10);   // convert interger into string (decimal format)         
    uart_puts(buffer);        // and transmit string to UART

    
    /*
     * Transmit single character to UART
     */
    uart_putc('\r');
}

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!

Autor: AVR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mein Tipp ist die

#define F_CPU 4000000UL

vor allen anderen #include zu haben.

Autor: UART verzweifelter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: UART verzweifelter (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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_Checkl...

Autor: UART verzweifelter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: UART verzweifelter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Carsten Wille (eagle38106)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UART verzweifelter schrieb:
>
>     /*
>      * Transmit string from program memory to UART
>      */
>     uart_puts_P("String stored in FLASH\n");
> 
> 
>     /*
> 

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carsten Wille schrieb:
> UART verzweifelter schrieb:
>>
>>     /*
>>      * Transmit string from program memory to UART
>>      */
>>     uart_puts_P("String stored in FLASH\n");
>>
>>
>>     /*
>> 
>
> 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) )

Autor: UART verzweifelter (Gast)
Datum:

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

Autor: UART verzweifelter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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_fu...

Autor: UART verzweifelter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    if(flag_uart0_get_command >= 1)
    {
      uart_puts(uart0_command_buffer);
      //uart0_command_buffer = 

      if(strcmp(uart0_command_buffer, "LED12") == 0)
        led12(ON);

      flag_uart0_get_command = 0;
    }

    // ASCII Zeichen holen und auswerten
    //
    if(flag_uart0_echo_mode >= 1)
    {
      unsigned int c;
      c = uart_getc();

      if(flag_uart0_get_command == 0)
      {
        uart0_command_buffer[temp_uart_cnt] = c;
        temp_uart_cnt++;
      }

      if(temp_uart_cnt == 5)
      {
        flag_uart0_get_command = 1;
        uart0_command_buffer[5] = '\0';
        temp_uart_cnt = 0;
      }
                 }


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

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.