- LiFePO4 Speicher Test         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: Erfahrenen Atmega 8 Programmierer gesucht

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.191
    Anzeige

    Powerstation Test
    bzw. wo diese Puffer festgelegt werden?
    Diese Puffer sind im Prinzip String Variablen, da sie auch im Interrupt behandelt werden müssen sie Volatile sein.
    volatile unsigned char uc_receivepuffer[128]; // Wäre ein Puffer mit 128Byte Speicherkapazität.

    Bei mir schaut dann die komplette Initialisierung für den Empfangspuffer so aus ( CodeVision AVR! )
    Code:
    // USART Receiver buffer
    #define RX_BUFFER_SIZE 514
    volatile char rx_buffer[RX_BUFFER_SIZE];
    
    #if RX_BUFFER_SIZE<256
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    #else
    unsigned int rx_wr_index,rx_rd_index,rx_counter;
    #endif
    
    // This flag is set on USART Receiver buffer overflow
    bit rx_buffer_overflow;
    
    // USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    char status,data;
    status=UCSR0A;
    data=UDR0;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
       {
       rx_buffer[rx_wr_index]=data;
       if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; //Diese Zeile setzt den Pointer am Pufferende wieder auf 0
       if (++rx_counter == RX_BUFFER_SIZE) //Diese Zeile setzt das Flag für einen Overflow
          {
          rx_counter=0;
          rx_buffer_overflow=1;
          };
       };
    }
    Initialisierung des USART muss natürlich auch noch gemacht werden.

    Die Daten aus diesem Puffer kann man sich dann mit getchar Byteweise abholen.
    Code:
    #ifndef _DEBUG_TERMINAL_IO_
    // Get a character from the USART Receiver buffer
    #define _ALTERNATE_GETCHAR_
    #pragma used+
    char getchar(void)
    {
    char data;
    while (rx_counter==0);
    data=rx_buffer[rx_rd_index];
    if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #asm("cli");
    --rx_counter;
    #asm("sei");
    return data;
    }
    #pragma used-
    #endif
    Getchar wird im Main Loop natürlich nur dann aufgerufen, wenn auch tatsächlich Daten im Puffer sind.
    Code:
    if(rx_counter>0)
                {
                //Ein Byte wird geschrieben
                    c=getchar();
                }
    Das Byte steht nun in der Variable c zur weiteren Verarbeitung.

    Die Code Beispiele sind für CodeVision AVR, bei AVR GCC wird das eventuell etwas anders aussehen.

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    16.10.2012
    Beiträge
    10
    Kann es sein, dass dieser Pufferbereich dann auch beim Programmieren des uC angegeben werden muss?
    Kann es sein, dass wenn dieser Bereich im Mikrocontroller falsch (garnicht) gewählt ist, der oben genannte Fehler auftritt?!
    Ich habe nämlich im Galep noch ein Feld Pufferbereich Start-Stop.
    Ich denke, dass der Fehler eher hier liegt...?!?
    Geändert von Azzidodabass (17.10.2012 um 07:19 Uhr)

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.191
    Kann es sein, dass wenn dieser Bereich im Mikrocontroller zu klein gewählt ist, der oben genannte Fehler auftritt?!
    Ich würd mal sagen ja. Es ist aber auch ein Softwareproblem.

    Ich habe nämlich im Galep noch ein Feld Pufferbereich Start-Stop.
    Der GALEP ist doch eigentlich nur ein Programmer, um ein fertiges Maschinencode File in den Controller zu übertragen. Was hat der mit dem compilierten Code zu tun?
    Du schreibst ja noch nicht mal in welcher Programmiersprache Du den Controller programmierst.


    Der Controller muss so viel Rechenzeit frei haben, das er diesen Puffer abarbeitet bevor er vollaufen kann.
    Wenn Du deinen Controller in unsinnigen Warteschleifen oder beim Pollen ewig auf irgendwelche Ereignisse warten lässt, läuft ja in dieser Zeit der Datenempfang im Interrupt weiter. - Wenn Du das so gelöst hast.

    Irgendwann ist dann der Ringpuffer voll und wird im günstigsten Fall einfach von vorne her überschrieben = Datenverlust.

    Wenn Deine Software nichts taugt wird eventuell auch ein anschließender Speicherbereich überschrieben, der gar nicht für die Pufferung von dieser Daten vorgesehen war, sondern Variablen oder sonstwas enthält. Im schlimmsten Fall wird Dir der Stack überschrieben und der Controller findet die Rücksprungadressen aus Subroutinen und Interrupts nicht mehr und hängt sich auf.

    Das Brachialmittel in solchen Fällen ist, einen Watchdog einzusetzen, wenn das von Deiner Anwendung her geht.
    Der Controller muss dabei immer wieder mal das Kommando "WDR" bekommen. Kriegt er das nach einer einstellbaren Zeit nicht, führt er einen Reset aus.
    Bei einem Datenlogger dürfte das weniger ein Problem sein, bei einer Schrittmotorsteuerung kanns eine sein.


    Ich hatte einmal so ein Problem mit einer FAT zum Schreiben auf einer SD Karte.

    Die Karte wird immer in Blöcken zu 512Byte beschrieben. Das dauerte aber so lange, das bei 38400Bit/s der maximale Pufferbereich von 280Byte schon voll war, bevor die Daten daraus vollständig ausgelesen werden konnten. - Folge Datenverlust.
    Da die Schreiberei auf die SD Karte nicht beschleunigt werden konnte, war da Softwaretechnisch nichts zu machen.
    Erst als ich diesen Puffer auf 520Byte durch einen größeren Controller aufgemotzen konnte, lief die Beschreiberei fehlerfrei ohne Datenverlust.

    Es wäre dann schon mal sinnvoll, das Du hier zumindest mal deine Routinen für die Verarbeitung der seriellen Daten offenlegst, weil die meisten Leute hier Ihre Glaskugel verlegt haben. Schmeiss auch wo möglich alle delay_xy Befehle raus. Wenn was gepollt wird, warte nicht ewig sondern mach da irgendwo ein Timeout in die Schleife mit rein. Halte alle Interruptroutinen so kurz wie möglich.
    Sehr viel mehr Tipps kann ich Dir ohne Blick auf den Quellcode eigentlich nicht mehr geben.

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    16.10.2012
    Beiträge
    10
    Hallo wkrug,

    wie gesagt möchte ich den Code nicht posten.
    Ich hoffe Ihr habt Verständniss dafür.

    Solltest du dir das allerdings ansehen wollen, würde ich mich freuen.
    Ich denke, dass das Problem von nem Profi schnell gelöst wird.

    Gruß

  5. #15
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.191
    Mir den Code zu schicken macht relativ wenig Sinn.
    Ich weiss ja noch nicht mal mit welchem Compiler der Code erstellt wurde. Ob ich den dann überhaupt kenne ?
    Zudem müsste ich zum Eingrenzen des Fehlers auch die Hardware bei mir haben.

    Ich denk mal, das die Routinen für die serielle Schnittstelle kein ernsthaftes Unternehmensrisiko bergen, es sein denn Du hättest sie geklaut.

    Und die Programmteile, die mit der seriellen Schnittstelle zusammenhängen hier zu veröffentlichen dürfte auch nichts über Deine Applikation verraten.

  6. #16
    RN-Premium User Roboter Genie Avatar von 5Volt-Junkie
    Registriert seit
    05.03.2008
    Alter
    37
    Beiträge
    947
    Man kann ja den Code irgendwie anders auskommentieren, Sende- und Empfängerdaten anders benennen usw. Klingt nach viel Arbeit, aber wenn sich keiner per PN meldet, wäre das vielleicht eine Alternative.

  7. #17
    RN-Premium User Begeisterter Techniker
    Registriert seit
    30.04.2004
    Alter
    47
    Beiträge
    245
    Aus welcher Region kommst du den?

  8. #18
    Neuer Benutzer Öfters hier
    Registriert seit
    16.10.2012
    Beiträge
    10
    Hallo an alle,

    erstmal Danke fuer eure Bemuehungen.Ich glaub ich hab den Fehler (hoffentlich) gefunden. Kann es im Moment aber leider nicht testen.
    Ich verwende eine Baudrate von 19200 mit einem 8 MGHz Quartz. Damit ergibt sich fuer den UBBR Wert:
    UBBR = (fosc / 16*Baud)-1 = (8 000 000 / 16 * 19200)-1 = 25
    Habe auch im Datenblatt nachgesehen. 25 ist hier der Wert.
    Ich habe allerdings 26 verwendet.
    Damit ergibt sich ein Fehler von:
    Error[%] = ( (BaudIst/BaudSoll)-1)*100%
    Wobei gilt:
    BaudIst = fosc / 16*(UBBR+1) = 8 000 000 / 16*(27) = 18518.518
    Damit gilt fuer den Fehler:
    Error[%] = (18518.518 / 19200)-1)*100% = 3,5 %
    Und das sollte zu hoch sein und die immer wiederkehrenden falschen Bits erklaeren.

    Eure Meinungen dazu...

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Biete Job Programmierer gesucht
    Von darkzone666 im Forum Jobs/Hilfen/Stellen - Gesuche und Angebote
    Antworten: 0
    Letzter Beitrag: 25.10.2011, 17:54
  2. Programmierer für PIC16f676 gesucht
    Von night45 im Forum Assembler-Programmierung
    Antworten: 1
    Letzter Beitrag: 31.05.2010, 22:07
  3. C- Programmierer gesucht
    Von nonoboy im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 14.10.2008, 22:56
  4. Programmierer(in) gesucht
    Von ricoderrichter im Forum Software, Algorithmen und KI
    Antworten: 0
    Letzter Beitrag: 24.03.2005, 22:17
  5. Programmierer Gesucht
    Von johnjudge im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 16.03.2005, 19:16

Berechtigungen

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

Labornetzteil AliExpress