STK501 variablen problem

Gast #651905
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.
Gast #651914
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;
Persönliche Seite #651931
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
Gast #651940
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.
#651953
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.
Persönliche Seite #651958
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
#651961
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...
Gast #651964
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?!?
Gast #651973
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..
#651981
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...
Gast #651982
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...
Persönliche Seite #651989
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren