Hallo! ich verzweifel hier gleich... ich hab hier das stk501 vor mir - ports/leds ansprechen funktioniert schonmal.. nun wollt ich mir ne variable basteln in die ich einen wert speichere. uint8_t var; jetzt komms: wenn ich die variable global definiere ist alles ok! sobald ich jedoch in meiner MAIN die variable deklariere hat sie immer den gleichen wert?!?!? den ich auch nicht ändern kann.... hab den arbeitsplatz komplett neu installiert! was hab ich falsch gemacht? gruß, d.
#include <avr/io.h> #include <stdint.h> #include <stdio.h> #include "test.h" volatile uint8_t var; volatile uint32_t i; int main (void) { DDRB = 0xFF; //init PORTB = 0xFF; //ausschalten DDRD = 0x00; var = 0xAA; do { PORTB = var; for(i=0xAAAAAAAA; i=0; i--){;} //WAIT var--; } while(1); return(0); } also nochmal: wenn ich die 2 variablen volatile uint8_t var; volatile uint32_t i; in der main deklariere dann ist var immer 0xA5 und lässt sich auch nicht ändern durch var = 0xAA;
> for(i=0xAAAAAAAA; i=0; i--){;} Du meinst wahrscheinlich eher > for(i=0xAAAAAAAA; i==0; i--); Initialisiere Deine Variablen mal bei der Deklaration. Wo genau (an welcher Stelle) liest Du var aus und erhaeltst den falschen Wert? Nochwas: Du hast eine Endlosschleife... d.h. Dein var laeuft Dir natuerlich staendig unter auf die Art, das ist Dir klar? Lg, Michael
danke für die antwort... aber das sind nicht meine probleme... wenn ich var global deklariere, steht die variable auf adresse 0x0110 wenn ich sie lokal in der main deklariere ist diese variable auf adresse 0x1100 - hat der mega128 überhaupt soviel sram? hab ich irgendwelche einstellungen im AVR-Studio vergessen? oder brücken auf dem stk-teil?!? mfg, d.
OK denn kann ich Dir nicht helfen, wenn Du meine Fragen nicht beantwortest. Mach's gut.
nich gleich so pissig - man...!! ich debugge mit nem jtag adapter und gucke mir die variablen die ganze zeit an! Keiner ne Idee?!?
daniel wrote: > danke für die antwort... > aber das sind nicht meine probleme... Doch, das sind deine Probleme. Stell erst mal dein Programm richtig. > > wenn ich var global deklariere, steht die variable auf adresse 0x0110 > wenn ich sie lokal in der main deklariere ist diese variable auf adresse > 0x1100 - hat der mega128 überhaupt soviel sram? Du kannst dem Compiler schon vertrauen, dass er das richtig macht. > hab ich irgendwelche > einstellungen im AVR-Studio vergessen? Den korrekten Prozessor hast du doch ausgewählt, oder? > oder brücken auf dem stk-teil?!? Nein. Wenn dein Programm compiliert, der richtige Prozessor eingestellt ist und das Programm fehlerfrei in den Prozessor gebrannt werden kann, dann läuft es so wie du es programmiert hast. Wenn sich dann das Programm nicht so verhält wie du erwartest, dann liegt das daran, dass dein Programm fehlerhaft ist. Die Idee, dass der Compiler das verbockt, solltest du dir gleich wieder abschminken. Klar haben Compiler auch Fehler, aber du wirst noch lange Zeit programmieren, bevor du das erstemal einen tatsächlichen Compilerfehler entdeckst.
> Klar haben Compiler auch Fehler, aber du wirst > noch lange Zeit programmieren, bevor du das erstemal einen > tatsächlichen Compilerfehler entdeckst. Ich habe den gcc mit meinem Code schonmal zum Segfault bewegen koennen und bin ueber ein Problem in der Stackverwaltung gestolpert... aber natuerlich hast Du schon recht. Und Daniel: Hier ist niemand "pissig". Allerdings solltest Du mal nicht vergessen, wer hier das Problem hat, naemlich Du. Wenn Du also Hilfe willst wirst Dir die entsprechenden Fragen schon gefallen lassen muessen. Wenn Du glaubst, es besser zu wissen, poste nicht. Michael
> for(i=0xAAAAAAAA; i=0; i--){;}
Du weist i einen Wert zu, der ungleich Null ist. Die Bedingung zum
Eintritt in die for-Schleife ist aber "i=0" (mal abgesehen davon, dass
da tatsächlich wenn überhaupt ein "==" stehen müsste, da "=" eine
Zuweisung macht). Diese Bedingung ist aber in dem Moment nie erfüllt.
Deshalb wird die Schleife auch nie betreten...
ich habe nie an einen compiler fehler gedacht... ich teste hier nur das stk500 mit 501 aufsatz.. nochmal das jetztige programm: #include <avr/io.h> #include <stdint.h> #include <stdio.h> void main (void) { volatile uint8_t varib; volatile uint8_t var; volatile uint32_t i; DDRB = 0xFF; //init PORTB = 0xFF; //ausschalten DDRD = 0x00; var = 0xAA; // DIE ZUWEISUNG MACHT ER NICHT do { PORTB = var; //DIE SCHON ABER HIER IST VAR=0x7B ?!? for(i=2; i==0; i--){;} var--; } while(var != 0); } SO funktioniert alles: #include <avr/io.h> #include <stdint.h> #include <stdio.h> volatile uint8_t varib; volatile uint8_t var; volatile uint32_t i; void main (void) { DDRB = 0xFF; //init PORTB = 0xFF; //ausschalten DDRD = 0x00; var = 0xAA; do { PORTB = var; for(i=2; i==0; i--){;} //WAIT var--; } while(var != 0); } Warum?!?
Jetzt ist die Sache komplett falsch, weil Dir Dein Programm abstuerzen
wird. Und im ersten Fall wurde die for-Schleife nicht ausgefuehrt und im
Zweiten wartest Du gerade zwei Iterationen, also so gut wie nichts.
> SO funktioniert alles
Was genau soll denn hier wie funktionieren?
> Und Daniel: Hier ist niemand "pissig". Allerdings solltest Du mal nicht > vergessen, wer hier das Problem hat, naemlich Du. michael mein lieber - Du hast ein weit aus größeres problem als ich - glaub mir! > Du weist i einen Wert zu, der ungleich Null ist. Die Bedingung zum > Eintritt in die for-Schleife ist aber "i=0" Blödsinn..
Wenn ich das im AVR-Studio mit dem gcc compiliere und dort im Simulator laufen lasse (hab keinen Mega32 da) läuft das Programm wie erwartet. Die for-Schleife wird nie ausgeführt, ist klar, ist aber auch so programmiert. var ändert seinen Wert wie erwartet. Ebenso der Port.
Daniel, Dein Problem ist, dass Du ein Troll bist: http://coremelt.net/jargon/T/troll.html Wenn Du wirklich etwas lernen willst, lese das hier (fals Du der Englischen Sprache maechtig bist): http://catb.org/~esr/faqs/smart-questions.html Michael
daniel wrote: >> Du weist i einen Wert zu, der ungleich Null ist. Die Bedingung zum >> Eintritt in die for-Schleife ist aber "i=0" > > Blödsinn.. Bevor DU hier irgendwas als "Blödsinn" abtust, lern erst mal C! In C wird in einer for-Schleife eine Einsprungbedingung angegeben und keine Abbruchbedingung. Aber Du musst es ja wissen. Bye...
> Wenn ich das im AVR-Studio mit dem gcc compiliere und dort > im Simulator laufen lasse (hab keinen Mega32 da) läuft > das Programm wie erwartet. > Die for-Schleife wird nie ausgeführt, ist klar, ist aber auch > so programmiert. > var ändert seinen Wert wie erwartet. Ebenso der Port. Danke Karl heinz! ich hab genau das selbe erfahren... deshalb denk ich ja es liegt am stk501 oder irgendwelchen einstellungen im AVR-Studio evtl macht mein selbstgebauter jtag auch probleme... mom... *jtagice mkii rauskram bis gleich...
Johannes: Daniel ist wohl nicht hier, um etwas zu lernen, sonst wuerde er zuhoeren. Aber fuer das Interesse der Allgemeinheit, da es ein haeufiger Anfaengerfehler ist: > Bevor DU hier irgendwas als "Blödsinn" abtust, lern erst mal C! In C > wird in einer for-Schleife eine Einsprungbedingung angegeben und keine > Abbruchbedingung. Aber Du musst es ja wissen. Bye... Das ist richtig. Der Ausdruck foo=bar liefert foo als Ergebnis zurueck. i=0 liefert also 0, in C korrespondiert das mit "false", somit wird die Schleife nie betreten. Endlosschleifen kann man auf die Art ebenfalls erzeugen, indem man z.B. i=1 schreibt. Michael
hehe... das du immer noch von der schleife redest... lustig... also am JTAG liegts nicht... der mkII liefert das delbe ergebniss beim debuggen.. globale variable funzt, lokale liegt im nirvana... arg..
LÖSUNG: Das verdammte mega103 compatiblitäts bit war noch gesetzt! der sram des mega103 sitzt an einer andern stelle als beim 128 somit wurden meine daten in's nirvana geschickt... Gruß, d.
uiui - einer hat mich verstanden... :D (Danke für den netten link - btw) gruß, d.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.