PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR Studio 4.18 und Probelem mit Watch der Variablen



Olle_Filzlaus
22.05.2011, 12:45
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.


#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

021aet04
22.05.2011, 13:16
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

Olle_Filzlaus
22.05.2011, 14:30
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.


#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

021aet04
22.05.2011, 15:08
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

Olle_Filzlaus
23.05.2011, 18:30
@ 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.



#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/c_von_a_bis_z/009_c_funktionen_007.htm#mj4fc0b488fe8ca390c0e218a 3e906958e

thx Arno

021aet04
24.05.2011, 10:10
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

Olle_Filzlaus
24.05.2011, 10:13
Hallo 021aet04,

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

mfg Arno

021aet04
24.05.2011, 10:27
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