- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 7 von 7

Thema: Programm wird nicht korrekt übernommen ???!!!

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332

    Programm wird nicht korrekt übernommen ???!!!

    Anzeige

    Praxistest und DIY Projekte
    Hallo Zusammen,

    ich habe einen seltsamen Effekt und weiß mir nicht zu helfen.

    Wenn ich ein Programm in meinem ATMega32 via ISP lade, arbeitet es korrekt und ich kann meine Daten abrufen.
    (Daten via I2C Bus).

    Schalte ich die Schaltung aus, so wird nach dem Einschalten der vorletzte Stand wieder geladen.
    (Ich habe eine Variable erst mit 100 und danach mit 101 beschrieben.)
    Nach dem Aus/Einschalten hat die Variabel wieder den Wert 100

    Was kann man hier falsch machen ?

    Gruss R.
    Kaum macht man es richtig, schon funktioniert's ...

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Die Variable ist deshalb wieder 100, weil du mit verändern deiner Variable das nicht fest im Programm ablegst. Beim Neustart des µCs beginnt aber das Programm wieder von vorne. Um Variablen dauerhaft verändert abzuspeichern, müsstest du sie im EEProm ablegen.

    Gruß
    Chris

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    Hi,

    ich habe am Anfang des Programmes fest:

    variable = 100; oder Variable = 101; stehen

    Das sollte immer korrekt arbeiten, da die Variable programmtecnisch gesetzt wird.
    Kaum macht man es richtig, schon funktioniert's ...

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Poste doch mal bitte dein Programm damit man mal gucken kann wo der Fehler ist
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    Hi,

    kann ich heute abend gerne machen. Ist aber was größer ...

    Eine mögliche Variante für mich wäre die Tatsache, das ich alle Variablen in einer Datei (variablen.c) deklariert habe und die jeweils verwendete Variable in der entsprechenden Datei als "extern" deklariert habe.

    Variablen, welche in Interruptroutinen behandelt werden, sind mit "volatile" deklariert. Das habe ich auch nochmals geprüft.

    Das Auslesen der besagten Variable erfolgt via I2C- SLAVE im Interruptverfahren. Änderungen der Variable erfolgen aber nicht zu diesem Zeitpunkt (erst später). Hierbei wird diese variable per I2C geändert.

    Aber wieso sollte das nach einem Neustart anders sein, wenn ich

    Code:
    main()
    {
     Variable = 100;
    
     while(true)   
        {
         ...
        }
    }
    schreibe. In der While() Schleife wird nur lesend auf diese variable zugegriffen. Der Interrupt Händer des Slaves wäre noch eine Variante. (Aber wieso erst nach einem Neustart und nicht immer ????)

    Gruss R.
    Kaum macht man es richtig, schon funktioniert's ...

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    So, anbei die beiden entsprechenden Dateien (fürs erste).

    In der Interruptroutine wäre die einzige Möglichkeit, wo schreiben auf diese variablen zugegriffen wird.

    Diese Variable ist am Anfang mit 101 gesetzt
    Code:
    extern    unsigned char        m_TargetSpeedLeft;                    // Speed to drive for the left wheel
    extern    unsigned char        m_TargetSpeedRight;                    // Speed to drive for the right wheel
    Wenn ich das Programm neu lade und die Variablen direkt über I2C Bus abfrage, haben sie den Wert 101.

    Nachdem ich das Gerät ausgeschaltet habe und nochmals einschalte, stehen in diesen Variablen wieder 100.

    Code:
    typedef    struct _Coordiante
    {
        unsigned int    x,y;                    // Coordinate position
    } Coordiante;
    
    
    extern    volatile Coordiante    m_StartPosition;
    extern    volatile Coordiante    m_EndPosition;
    extern    volatile Coordiante    m_ActualPosition;
    Mit diesen Variablen habe ich einen ähnlichen Fehler. Hier sind die Positionsangaben plötzlich falsch, obwohl diese nur am Programmstart gesetzt werden. Werte von 10 springen plötzlich auf 314...

    Ich habe nochmals alle Vergleiche geprüft, ob ich den "klassischen Fehler" "=" statt "==" verwendet habe, konnte aber keinen Fehler finden.

    Die einzige Routine, wo ich mit Pointer arbeite ist in der Interruptroutine des TWI Slaves.

    Da ich die Variable ja über TWI einlese, könnte der Fehler hier sein, nur kann ich dort keinen Fehler sehen (nicht mehr sehen).

    Gruss R.
    Angehängte Dateien Angehängte Dateien
    Kaum macht man es richtig, schon funktioniert's ...

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    Hallo Zusammen,

    ich habe meinen Fehler/Problem immer noch nicht gefunden.

    Im I2C Bus Treiber war noch ein Fehler, welcher aber keine Auswirkung hierauf haben könnte.
    Code:
                        if(m_NumberOfBytesToSend > 0)
                            {
                            if( m_buffer_adr != NULL )                // Do we have a valid pointer
                              {
                              *m_buffer_adr=data;                    // Store the data into the buffer
                              m_buffer_adr++;                            // Incr. Buffer address for the next byte
                              }
                            m_NumberOfBytesToSend--;                    // dec. counter of byte to send/recive
                            if(m_NumberOfBytesToSend > 0)
                                {
                                TWCR_ACK;                            // we still have to receive bytes
                                }
                            else
                                {
                                TWCR_NACK;                            // we have all bytes received
                                }
                            }
                        else
                            {
                            TWCR_NACK;                                // We have a Problem. All was send before
                            }
    Diese Zeile fehlte. Hier würde der Treiber keine Antwort senden und das Protokoll würde Fehl laufen.
    Code:
                        else
                            {
                            TWCR_NACK;                                // We have a Problem. All was send before
                            }
    Hat jemand noch eine Idee ?

    Edit:
    Auf dem Hauptrechner des Roby lief noch ein Hintergrund Task, welche ein Kommando einmalig an den Controller gesendet hat.
    Dumm, ich weiss.

    Gruss

    R.
    Geändert von Ritchie (22.12.2011 um 07:33 Uhr) Grund: Fehler gefunden!
    Kaum macht man es richtig, schon funktioniert's ...

Ähnliche Themen

  1. Programm-Ablauf wird nicht eingehalten.
    Von RobbyMartin im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 11.06.2011, 15:39
  2. Antworten: 1
    Letzter Beitrag: 03.08.2010, 18:37
  3. Programm wird nicht richtig auf den RP6 geladen
    Von Matthias1172 im Forum Robby RP6
    Antworten: 2
    Letzter Beitrag: 15.02.2010, 21:49
  4. ADCH & ADCL nicht richtig übernommen
    Von Bunch im Forum AVR Hardwarethemen
    Antworten: 9
    Letzter Beitrag: 28.11.2005, 08:52

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress