UART Problem mit Fleury Lib

Gast #2040927
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!
Gast #2041032
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
#2041170
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
Gast #2041309
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
Moderator (Firma: Titel) Persönliche Seite #2041328
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?
#2041367
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.
Gast #2041584
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.
Gast #2043829
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
#2043834
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
Gast #2043888
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren