Forum: Mikrocontroller und Digitale Elektronik STK501 variablen problem


von daniel (Gast)


Lesenswert?

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.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Huhu Daniel,

poste mal Deinen Code und sei etwas spezifischer ;)

von daniel (Gast)


Lesenswert?

#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;

von daniel (Gast)


Lesenswert?

ebenso auch mit i

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

> 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

von daniel (Gast)


Lesenswert?

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.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

OK denn kann ich Dir nicht helfen, wenn Du meine Fragen nicht 
beantwortest. Mach's gut.

von daniel (Gast)


Lesenswert?

nich gleich so pissig - man...!!
ich debugge mit nem jtag adapter und gucke mir die variablen die ganze 
zeit an!

Keiner ne Idee?!?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

> 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

von Johannes M. (johnny-m)


Lesenswert?

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

von daniel (Gast)


Lesenswert?

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?!?

von daniel (Gast)


Lesenswert?

nachtrag: scheiß auf die schleife... geht auch ohne nicht!

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

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?

von daniel (Gast)


Lesenswert?

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

von daniel (Gast)


Lesenswert?

var bekommt den wert 0xAA das funktioniert...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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

von daniel (Gast)


Lesenswert?

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

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

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

von daniel (Gast)


Lesenswert?

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

von daniel (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?


von daniel (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.