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

Thema: AVR Studio 4.18 und Probelem mit Watch der Variablen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    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

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.093
    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

  3. #3
    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

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.093
    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

  5. #5
    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

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.093
    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, 14:19
  2. Antworten: 6
    Letzter Beitrag: 25.12.2006, 22: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, 01:20
  4. Bascom mit Studio4 debuggen -> watch?
    Von Werner_Just im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 02.11.2005, 12: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, 10:12

Berechtigungen

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

Labornetzteil AliExpress