-         

Ergebnis 1 bis 6 von 6

Thema: Problem mit Fleury UART lib und Mega644 ...

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    41
    Beiträge
    685

    Frage Problem mit Fleury UART lib und Mega644 ...

    Anzeige

    Moin!

    Ich bastel mal wieder, und verzweifel grad an folgendem :

    Ich habe einen Mega644 mit Standardschaltung lt. RN-Wissen, also Spannungsregler 7805 mit Elko und Kerko (Schaltung läuft aber eh mit Akkus 6x1,2V), 10KOhm Pullup an Reset, 18,432 MHz Quarz mit 22pF Kondensatoren dran sowie Max232. Das erste Phenomän ist, die Übertragung von Daten zum PC (hterm) funktioniert nur bis 57600baud stabil, bei 115200 kommen Werte doppelt/fehlerhaft an, dabei ist das doch so ein schöner Baudratenquarz...
    Das ist allerdings in meinem Fall nicht so schlimm, ich weiß nur nicht, ob das evtl. eine Randerscheiung meines eigentlichen Problems ist.

    Das da wäre :

    Daten senden mit
    Code:
    uart_putc(x)
    geht, strings senden mit
    Code:
    uart_puts("text")
    geht, aber beim senden aus dem Programmspeicher mit
    Code:
    uart_puts_p("text")
    kommt mist, bzw. auch manchmal nur ein Byte, das aber auch schon falsch.

    Ich habe die Bibliothek jetzt schon auf verschiedenen Controllern benutzt, aber noch nie auf dem 644, und hatte nie Probleme damit....

    Ich hab die Schaltung nochmal neu aufgebaut, und auch den Mega644 sowie den Max232 getauscht, aber das wars nicht.

    Das komplette Programm hänge ich mal dran, steht allerdings nicht viel drin...

    Die bytes 0-255 kommen sauber an (bei 57600baud), das 'a' auch, das "test" nicht.

    Code:
    #include <avr/io.h>
    #include <stdlib.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include "uart.h"
    #include <avr/pgmspace.h>
    #include <avr/eeprom.h>
    #define UART_BAUD_RATE      57600
    void init()
    {
     DDRD = 0b00000010;
     uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
     sei(); 
    }
    int main(void)
    {
     int x;
     init();
     //while (1)
     {
      for (x=0;x<=255;x++)
       uart_putc(x);
     }
     uart_putc('a');
     uart_puts_p("test");
     while (1)
     {}
    }
    MfG
    Volker


    /edit: Geschwindigkeitsrätsel gelöst, schien irgendwie an meiner Max232-Schaltung zu liegen, jetzt geht es auch mit 115200baud, und es hat sich herausgestellt, dass beim uart_puts_p die anzahl bytes stimmt, nur der Inhalt nicht.... also evtl. ein Problem in der UART lib, ich forsche mal, bin aber weiterhin für Tipps dankbar!!
    Geändert von vklaffehn (07.11.2011 um 18:52 Uhr)
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Gleich vorweg: Ich kann's auch nicht erklären. Weil ich aber nun schon Zeit investiert habe, möchte ich meine Erkenntnisse wenigstens auch mitteilen.

    Mein erster Verdacht: Ein Dual-USART mit dem die Peter Fleury-Lib nicht zurecht kommt. Da ich aber nur ein Mega64er-Datenblatt auf der Platte hatte, wollte ich zuerst einen Blick in das 644er-Datenblatt werfen. Zweiter Verdacht: Zugriff auf die falschen Register. Aber die Definitionen in uart.c scheint unverdächtig, weil eben vorhanden und auf den ersten Blick auch richtig:

    Code:
    #elif defined(__AVR_ATmega644__)
     /* ATmega with one USART */
     #define ATMEGA_USART0
     #define UART0_RECEIVE_INTERRUPT   SIG_USART_RECV
     #define UART0_TRANSMIT_INTERRUPT  SIG_USART_DATA
     #define UART0_STATUS   UCSR0A
     #define UART0_CONTROL  UCSR0B
     #define UART0_DATA     UDR0
     #define UART0_UDRIE    UDRIE0
    #elif defined(__AVR_ATmega164P__) || defined(__AVR_ATmega324P__) || defined(__AVR_ATmega644P__)
     /* ATmega with two USART */
     #define ATMEGA_USART0
     #define ATMEGA_USART1
     #define UART0_RECEIVE_INTERRUPT   SIG_USART_RECV
     #define UART1_RECEIVE_INTERRUPT   SIG_USART1_RECV
     #define UART0_TRANSMIT_INTERRUPT  SIG_USART_DATA
     #define UART1_TRANSMIT_INTERRUPT  SIG_USART1_DATA
     #define UART0_STATUS   UCSR0A
     #define UART0_CONTROL  UCSR0B
     #define UART0_DATA     UDR0
     #define UART0_UDRIE    UDRIE0
     #define UART1_STATUS   UCSR1A
     #define UART1_CONTROL  UCSR1B
     #define UART1_DATA     UDR1
     #define UART1_UDRIE    UDRIE1
    (Aus uart.c)

    Was mir noch auffällt: Meine Datei uart.c stammt vom 29.11.2009 und ist die neuste Datei im Archiv. Die 644er-Definitionen sind die Letzten in der Datei und möglicherweise in deiner "schon immer verwendeten" Version nicht vorhanden/fehlerhaft.

    Welcher 664er ist es denn?
    http://www.atmel.com/dyn/products/de...ource=left_nav

    Gruß

    mic

    P.S.:
    Die Sende-ISR könnte auch ein Kandidat sein.

    Noch ein Edit:
    "Die bytes 0-255 kommen sauber an (bei 57600baud), das 'a' auch, das "test" nicht." ist doch klar. Das Senden geschieht asyncron über einen Ringpuffer und der Sende-ISR. Beim "T" von "Test" ist Schluß mit lustig:

    Code:
     uart_puts_p("test");
     while (1)
     {}
    }
    Ich bin mir nicht sicher, würde aber eher ein ; nach while machen. Bauchgefühlsmäßig.
    Geändert von radbruch (07.11.2011 um 20:03 Uhr)

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    41
    Beiträge
    685
    Moin!

    Ich habe den 644 ohne 'P', also mit einem USART, und die Bibliothek habe ich zwischendurch frisch heruntergeladen. das while-dingens ist ein Rest, es spielt keine Rolle, an welcher Stelle ich das uart_puts_p verwende....
    ich habe das testweise in ener Endlosschleife laufen lassen, für das letzte 'test' kommen immer die selben 4 (falschen) bytes an, als würde der Controller Murks lesen, oder evtl. auch schon vorher schreiben, der Rest funktioniert ja....
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von vklaffehn
    Ich habe die Bibliothek jetzt schon auf verschiedenen Controllern benutzt, aber noch nie auf dem 644, und hatte nie Probleme damit....
    Tja, dann hast du dort (im Gegensatz zu hier) wohl die richtige Funktion (eigentlich Makro) benutzt.
    Entweder
    Code:
    uart_puts_p(PSTR("text"));
    oder
    Code:
    uart_puts_P("text");
    Aber bei
    Code:
    uart_puts_p("text");
    liegt der Text im RAM, und dann liest die Funktion natürlich Müll aus dem Flash.
    MfG
    Stefan

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Danke, wieder mal was gelernt:

    Code:
    /**
     * @brief    Put string from program memory to ringbuffer for transmitting via 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.
     * Blocks if it can not write the whole string into the circular buffer.
     *
     * @param    s program memory string to be transmitted
     * @return   none
     * @see      uart_puts_P
     */
    extern void uart_puts_p(const char *s );
    
    /**
     * @brief    Macro to automatically put a string constant into program memory
     */
    #define uart_puts_P(__s)       uart_puts_p(PSTR(__s))

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    41
    Beiträge
    685
    Arg.

    Danke. Da ich immer die zweite Variante benutzt habe, war mir überhaupt nicht bewußt, dass es das Makro auch mit kleinem 'p' gibt.... Hätte da nicht mal ein warning kommen können ?

    Auf alle Fälle vielen Dank, jetzt kann ich mich endlich wieder dem Bluetoothmoduk widmen!

    MfG
    Volker
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

Ähnliche Themen

  1. Timer0 und UART Lib Fleury Timer läuft nicht mehr los
    Von gesamtplan im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 21.03.2011, 19:23
  2. UART mit Fleury Library
    Von MT2009 im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 20.06.2010, 17:20
  3. Bug in der UART bei Mega644 und Mega644P?
    Von benkly im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 26.04.2009, 16:08
  4. Uart Problem mit Mega644 und Mega644P
    Von jozefowicz im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 23.02.2009, 20:19
  5. ATMEGA8/UART/FLEURY
    Von rico65 im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 01.11.2006, 10:20

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •