mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STK501 variablen problem


Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Huhu Daniel,

poste mal Deinen Code und sei etwas spezifischer ;)

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ebenso auch mit i

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

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

Autor: daniel (Gast)
Datum:

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

Keiner ne Idee?!?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!?

Autor: daniel (Gast)
Datum:

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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
var bekommt den wert 0xAA das funktioniert...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uiui - einer hat mich verstanden... :D
(Danke für den netten link - btw)

gruß,
d.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.