-         

Ergebnis 1 bis 8 von 8

Thema: AVR Studio 4.18 und Probelem mit Watch der Variablen

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.11.2005
    Beiträge
    272

    Cool AVR Studio 4.18 und Probelem mit Watch der Variablen

    Anzeige

    Hallo Leute,

    ich bin aktuell dabei mich wieder in C ein rein zu fitzen. Ist leider schon ne Weile her.

    Na jedenfalls habe ich ein kleines Programm geschrieben, was über eine Headerdatei einen Wert in eine Funktion gibt und dort multipliziert und wieder raus gibt. Da sind scheinbar noch kleinere Problemchen drin.

    Code:
    #include <avr/io.h> 
    #include <stdio.h> 
    #include <inttypes.h> 
    
    #ifndef F_CPU
    #define F_CPU 80000000UL     /* Quarz mit 8 Mhz  */
    #endif
    
    #include <util/delay.h>      /* definiert _delay_ms() ab avr-libc Version 1.2.0 */
    
    
    #include "main_header.h" // Einfügen der Header-DAtei main_header.h
    
    
    
    int main(void) //Hauptprogramm
    {
        int8_t Var_Out, Var_In = 0;
    
        Var_In = 14;
        
        DDRD = 0b11111111;            // PORTD als Ausgang setzen
    
        PORTD = zaehler(Var_Out); //Aufruf Funktion
    }
    
    int8_t zaehler(int8_t Var_In) //Definition der Funktion "zaehler"
    {    
        int8_t Var_Out;
    
        Var_Out = Var_In * 2; //hochzählen    
    
        return (Var_Out);
    }
    Header:
    /*

    Header Testdatei

    */


    int8_t zaehler(int8_t Var_In); //Deklaration der Funktion "zaehler"
    ABER: Wenn ich auf die Variable klicke und sage "add watch" dann habe ich die in der List drin stehen. Es steht aber bei "Value" immer "Location not valid". Muss ich da irgendwas einstellen oder aktivieren? Wie kann ich das nutzen?


    Und dann, sozusagen als Bonusfrage, noch eine kleine Frage zu meine Programm. Ich habe eine Variable die an die Funktion übergeben wird "Var_In". Dann habe ich eine Variable "Var_Out" die wieder zurück an die main geht, oder? Weil irgendwie funzt das so nicht. Leider. Vielleicht habt ihr ja ein Tip für mich.

    Danke
    Arno
    Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
    Sir Isaac Newton

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    29
    Beiträge
    4.545
    Versuche einmal die Zeile "int8_t Var_Out, Var_In = 0;" vor main geben. Also zwischen den include Anweisungen und main. Bei mir kommt dann der gleiche Fehler, habe es gerade probiert. Wenn du die Variable vor main benutzen würdest (z.B. bei einer ISR) würden noch mehr Fehler auftauchen.

    Du hast keine Endlosschleife. Das Programm läuft nur einmal durch. Du musst die Funktion ebenfalls vor main geben.

    MfG Hannes

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.11.2005
    Beiträge
    272
    Hallo,

    Versuche einmal die Zeile "int8_t Var_Out, Var_In = 0;" vor main geben. Also zwischen den include Anweisungen und main.
    Das würde aber bedeutet das ich die Variablen dann global definiere oder? Habe mal gelernt das man das nicht machen soll. Aber habs mal ausprobiert, es geht.

    Habe jetzt auch mal um die Zeile eine kleine dauer While Schleife gebaut. Geht immer noch nicht. Ich dachte aber das jeder Aufruf der Funktion die einmal ausführt.

    Code:
    #include <avr/io.h> 
    #include <stdio.h> 
    #include <inttypes.h> 
    
    #ifndef F_CPU
    #define F_CPU 80000000UL     /* Quarz mit 8 Mhz  */
    #endif
    
    #include <util/delay.h>      /* definiert _delay_ms() ab avr-libc Version 1.2.0 */
    
    
    #include "main_header.h" // Einfügen der Header-DAtei main_header.h
    
    
    
    int8_t Var_Out, Var_In = 0;
    
    
    int8_t zaehler(int8_t Var_In) //Definition der Funktion "zaehler"
    {    
        int8_t Var_Out;
    
        Var_Out = Var_In * 2; //hochzählen    
    
        return (Var_Out);
    }
    
    int main(void) //Hauptprogramm
    {
    //    int8_t Var_Out, Var_In = 0;
    
        Var_In = 19;
        
        DDRD = 0b11111111;            // PORTD als Ausgang setzen
    
        while(1)
        {
            PORTD = zaehler(Var_Out); //Aufruf Funktion
        }
    
    }
    Var_In in der Funktion hat abber immer noch kein Wert. Also geht das ganze Programm immer noch nicht. Mist. Kann mir da jemand bei helfen.

    Danke
    Arno
    Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
    Sir Isaac Newton

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    29
    Beiträge
    4.545
    Ich habe gerade gesehen, dass du "PORTD = zaehler(Var_Out); //Aufruf Funktion" geschrieben hast. Du übergibst also den Wert von "Var_out" an die Funktion. Danach liest du den gleichen Wert wieder ein und übergibst ihn an Port D. Tausche Var_out in der geposteten Zeile gegen Var_in. Dann sollte es funktonieren. Der Grund ist, dass 0x2=0. Da wird sich nichts ändern.

    PS: Warum sollte man keine globalen Variablen nehmen? Lokale Variablen kann man nur innerhalb von Funktionen verwenden (so wie du es in der Funktion gemacht hast). Globale Variablen kannst du im gesamten Programm verwenden. Es gibt dann noch Variablen mit "volatile". Diese kann man dann auch in z.B. ISR verwenden.

    MfG Hannes

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.11.2005
    Beiträge
    272
    @ 021aet04

    Danke für deine hilfe. Hab meine Fehler danke deiner Hilfe und Hinweise gefunden.
    Oh man, die sind wirklich dämlich Fehler, aber ok. Man lernt dadurch Habe heute nochmal im C-Buch gelesen und da sind mir meine Fehler aufgefallen.

    So hier jetzt die Lösung. Nur falls es jemanden Interessiert.

    Code:
    #include <avr/io.h> 
    #include <stdio.h> 
    #include <inttypes.h> 
    
    #ifndef F_CPU
    #define F_CPU 80000000UL     /* Quarz mit 8 Mhz  */
    #endif
    
    #include <util/delay.h>      /* definiert _delay_ms() ab avr-libc Version 1.2.0 */
    
    
    #include "main_header.h" // Einfügen der Header-Datei main_header.h
    
    
    int main(void) //Hauptprogramm
    {
        int8_t Var_In = 0;
    
        Var_In = 19;
        
        DDRD = 0b11111111;            // PORTD als Ausgang setzen
        DDRC = 0xff;                //PortC alles auf Ausgang
    
        while(1)
        {
            PORTD = zaehler(Var_In); //Aufruf Funktion
    
            _delay_ms(1);        // Eine Sekunde +/-1/10000 Sekunde warten...
                                 // funktioniert nicht mit Bibliotheken vor 1.6        
        }
    }
    
    int8_t zaehler(int8_t Var_In) //Definition der Funktion "zaehler"
    {    
        static int8_t Var_Out; //Damit er die Variable gleich im Speicher lässt!?
    
        Var_Out = Var_Out++; //hochzählen    
    
        return (Var_Out);
    }
    Also kurz zu den Fehlern. Ne Funktion muss den Wert reingereicht bekommen. Also Var_In und nicht Out. Wenn in der While -Schleife nur ein Befehl steht, wiederholt er es nicht. Komisch, aber mit dem Delay gehts supi (ich rede jetzt vom AVRGCC Simulator).

    Das einzige was immer noch nicht will ist halt lokale Variablen im Watch zu betrachten.

    PS: Warum sollte man keine globalen Variablen nehmen? Lokale Variablen kann man nur innerhalb von Funktionen verwenden (so wie du es in der Funktion gemacht hast). Globale Variablen kannst du im gesamten Programm verwenden. Es gibt dann noch Variablen mit "volatile". Diese kann man dann auch in z.B. ISR verwenden.
    Zitat C-Buch: Für das Anlegen von Variablen gilt: »So lokal wie möglich und so global wie nötig.

    Guckst du hier. Da ist es gut erklärt.
    http://openbook.galileocomputing.de/...e218a3e906958e

    thx Arno
    Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
    Sir Isaac Newton

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    29
    Beiträge
    4.545
    Danke für den Hinweiß und den Link. Funktioniert es eigentlich mit Watch, wenn du die Variable global machst (nach include Anweißungen gibst)?

    MfG Hannes

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.11.2005
    Beiträge
    272
    Hallo 021aet04,

    ja, wenn ich die Global mache geht es. Gefällt mir aber so nicht wirklich. Muss doch auch anders gehen.

    mfg Arno
    Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
    Sir Isaac Newton

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    29
    Beiträge
    4.545
    Versuche einmal die Variable direkt vor die Schleife zu geben (nach DDR Anweißungen). Vielleicht hilft es. Sonst könnte es auch noch ein Fehler vom Simulator sein. Dann könntest du noch versuchen ob das Programm am Controller läuft.

    MfG Hannes

Ähnliche Themen

  1. Watch Dog - Was ist dass?
    Von Duesentrieb im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 30.05.2009, 15:19
  2. Antworten: 6
    Letzter Beitrag: 25.12.2006, 23:41
  3. AVR Studio Simulator - Frage zu Variablen Watch
    Von orbi im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 05.06.2006, 02:20
  4. Bascom mit Studio4 debuggen -> watch?
    Von Werner_Just im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 02.11.2005, 13:06
  5. Variablen in AVR Studio mit AVR JTAG Anzeigen?
    Von chris.moe im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 24.07.2005, 11:12

Berechtigungen

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