- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 18

Thema: Erfahrenen Atmega 8 Programmierer gesucht

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    16.10.2012
    Beiträge
    10
    Verbindung ist RS232, fehlerhafte Daten über einen Zeitraum von meistens 40 minuten alle 2-3 minuten, danach vollständige Unterbrechung.
    quartz: 8 Mhz, 19200 Baudrate. Nach erneuter Verbindung das gleiche Spielchen wieder.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.02.2006
    Beiträge
    982
    Mh, da spuckt mir AVRCalc nen Baudratenfehler von 0.16% aus..das sollte keine Probleme machen.
    Beschaltung von MAX232 passt, Ground verbunden und Kabel nicht zu lang?

    Ansonsten muesste man mal einen Blick auf die Software werfen.
    Nam et ipsa scientia potestas est..

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Eine kalte oder nicht vollständig leitende Lötstelle oder ein Kabelbruch wäre auch eine Möglichkeit. Ansonsten hat der Wastel schon Recht, da hilft nur ein Blick in die Software. Ist das Zeug irgendwie aus einer Firma oder Ähnlichem? Also dass das nicht öffentlich gemacht werden darf?

    Sonst hättest du auch einfach hier im Forum Fragen können, ohne Kohle locker zu machen.
    Grüße,
    Daniel

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    16.10.2012
    Beiträge
    10
    Sind in gewisser Weise schon sensible Daten. Daher ungern veröffentlichen.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.255
    Für mich hört sich das etwas nach Pufferüberlauf an.
    Addressieren die verwendeten Pointer wirklich nur die reservierten Bereiche, oder könnte auch aus Versehen ein Bereich dahinter angesprochen werden?
    Beispiel: Puffergröße 128 Byte, Pointer hat den Wert 130!
    Dann wird eine nachfolgende Variable überschrieben was nicht gut sein kann!

    Werden Daten vom PC zum Mega 8 gesendet, oder umgekehrt, oder beides?

    Wie ist die Sende bzw. Empfangsroutine angelegt?
    Polling oder Interrupt?

    Ich mach da gerne Empfangsinterrupts um jeweils ein Byte in einem Puffer abzulegen.
    Im Hauptprogramm wird dann immer wieder geschaut, ob in dem Puffer was Neues drin ist.
    ( Schreib / Lesezeiger oder Marker = Bit Variable ).

    Beim Senden wird dann auch immer wieder ein Puffer beschrieben und dieser Puffer dann per Interrupt byteweise versendet.

    Wenn die Puffer nicht zu klein sind und der µC genügend Zeit zu Abarbeitung hat, macht das eigentlich keine Probleme.

    Ich Merge mit diesem Prinzip 4 MiDi Eingänge ( 31250 Bit/s ) auf einen Ausgang zusammen. Allerdings mit einem ATMEGA1280 an 16MHz.

    Um den Controller nicht auszubremsen würde ich keine! delay_ms Aufrufe für Zeitschleifen verwenden, sondern Variablen im einem Timer Interrupt hoch bzw. runter zählen lassen.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    16.10.2012
    Beiträge
    10
    Zitat Zitat von wkrug Beitrag anzeigen
    Für mich hört sich das etwas nach Pufferüberlauf an.
    Addressieren die verwendeten Pointer wirklich nur die reservierten Bereiche, oder könnte auch aus Versehen ein Bereich dahinter angesprochen werden?
    Beispiel: Puffergröße 128 Byte, Pointer hat den Wert 130!
    Dann wird eine nachfolgende Variable überschrieben was nicht gut sein kann!
    Hallo wkrug,

    der Gedanke gefällt mir gut. Sei so nett und sag mir, wie ich das überprüfen kann, bzw. wo diese Puffer festgelegt werden?

    Zitat Zitat von wkrug Beitrag anzeigen
    Werden Daten vom PC zum Mega 8 gesendet, oder umgekehrt, oder beides?
    Beides
    Geändert von Azzidodabass (16.10.2012 um 19:33 Uhr)

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.255
    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.

  8. #8
    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)

Ä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
  •  

fchao-Sinus-Wechselrichter AliExpress