Forum: Compiler & IDEs Attiny13 Variable initialisiert sich nicht


von Thorsten S. (trantor)


Lesenswert?

Hallo zusammen, ich versuche mich grade ein wenig mit dem ATTiny13 ...

Ausstattung ist das STK500 und AVR Studio 4

Ziel meines ersten Versuchsprogrammes : Nachbildung der Schaltzustände 
eines PC Netzteils...

Schalter(Pb1) kurz drücken = Gerät ein (PB0=1)
Schalter länger als 5 sekunden gehalten = Auschaltflag (PB2=1)
Schalter länger Als 10 Sekunden gehalten = Gerät aus (PB0=0)

klingt trivial - ist es leider net ...

hier mal mein Code in der Version null hatte ich es mit Gotos gelöst 
hier Versuch 2 mit while Schleifen ...
1
#define PB0 0 //output
2
#define PB1 1 //input
3
#define PB2 2
4
uint16_t t;
5
uint16_t i;
6
7
int main (void){
8
9
10
// set PB.0 as output pin
11
12
DDRB  = 0b0000001;
13
14
// set PB.0 to output low
15
16
PORTB &= ~(1 << PB0);
17
18
while(1){
19
  
20
  //  Schleife solange Taster 0 ist
21
  start:    
22
  i = PINB;
23
  if ( i & 0x02 ) goto start;
24
  
25
  // Taster betätigt Gerät schaltet ein
26
  i = PINB;
27
  if (!( i & 0x02 )){
28
    t=1;
29
    PORTB |= (1 << PB0);
30
    i = PINB;
31
  while((!( i & 0x02 ))+(t<6000)){ //Taster betätigt und Zeit kleiner 10 sekunden
32
      i = PINB;
33
    while((!( i & 0x02 ))+(t<3000)){ // Taster betätigt und Zeit kleiner 5 sekunden
34
      t=t+1;
35
      _delay_ms(1000);
36
       }
37
       // 5 sekunden Vorüber
38
     PORTB |= (1 << PB2);
39
         t=t+1;
40
       _delay_ms(1000);
41
     }  
42
   // 10 sekunden vorrüber
43
     i = PINB;
44
   if (!( i & 0x02 )) PORTB &= ~(1 << PB0);//Gerät hart auschalten
45
  }
46
47
  }
48
}

es scheint als ob t nicht initialisiert wird ... aber warum ?

jemand eine idee ?

von Peter (Gast)


Lesenswert?

Thorsten Schaan schrieb:
> //  Schleife solange Taster 0 ist
>   start:
>   i = PINB;
>   if ( i & 0x02 ) goto start;

wie kommt man denn so so ein unschönes konstrukt.


while ( PINB & 0x02 ) {};

von Thorsten S. (trantor)


Lesenswert?

oh ein goto vergessen ...

ich komme ursprünglich aus der sps und assembler welt und sprünge sind 
da durchaus eingänglich ... c ist mir noch nicht so eigen das ich vieles 
nicht so schnell zu vereinfachen weiss ...

aber das war ja net meine frage ... sowohl das eine als auch das andere 
funktioniert ja ...

von Karl H. (kbuchegg)


Lesenswert?

Thorsten Schaan schrieb:
> oh ein goto vergessen ...
>
> ich komme ursprünglich aus der sps und assembler welt und sprünge sind
> da durchaus eingänglich ...

Dann hast du etwas, was du dir ganz, ganz schnell abgewöhnen solltest.
Zumindest fürs erste.

von Karl H. (kbuchegg)


Lesenswert?

1
  while((!( i & 0x02 ))+(t<6000)){ //Taster betätigt und Zeit kleiner 10 sekunden

und schreibt sich in C als &&  und nicht durch ein +



Kauf dir ein C-Buch und arbeite es durch!
Das hat so keinen Sinn.

von Kai S. (hugstuart)


Lesenswert?

Na, sooo schlimm sieht der Code auch nicht aus. Ich würde dir raten, mal 
das AVR-GCC-Tutorial durchzuarbeiten, sollte mit Vorkenntnissen schnell 
gehen und bringt dir C etwas näher.

von Martin (Gast)


Lesenswert?

>> while((!( i & 0x02 ))+(t<6000)){ //Taster betätigt und Zeit kleiner 10
>> sekunden

Das '+' in der 'while'-Anweisung ist in C ein '&&'.

von Karl H. (kbuchegg)


Lesenswert?

Kai S. schrieb:
> Na, sooo schlimm sieht der Code auch nicht aus.

Find ich schon.
In dem Code ist nur sehr schwer irgendeine Linie zu erkennen. Man muss 
mehr ahnen (unterstützt durch die Kommentare) was da die Absicht sein 
soll.

von Martin (Gast)


Lesenswert?

@Karlheinz

Du bist ja richtig süß: einfach nach meinem Beitrag, den Fehler in 
deinem Beitrag streichen und auch noch ohne Quellenangabe ;)

Das nächste Mal warte ich das akademische Viertel ab :)

von Thorsten S. (trantor)


Lesenswert?

okok ... habt ja recht kleiner blödheitsfehler ... der allerdings nicht 
erklärt warum
1
t=1;

nicht ausgeführt wird ...

das tutorial hab ich mir durchaus angesehn ... erklärt den fehler aber 
auch nicht ...

bevor jetzt noch mehr gegen den Goto Sprung schimpfen und mir empfehlen 
ein C Buch zu kaufen oder das Tutorial zu lesen ...Bitte OT bleiben.

ich simuliere das ganze im Debugger vom AVR Studio ... wenn ich von 
Schritt zu Schritt springe funktioniert t=1; nicht wiso ?


Danke Thorsten

von Karl H. (kbuchegg)


Lesenswert?

Thorsten Schaan schrieb:
> okok ... habt ja recht kleiner blödheitsfehler ... der allerdings nicht
> erklärt warum
>
>
1
t=1;
>
> nicht ausgeführt wird ...

Es wird mit Sicherheit ausgeführt.
Such den Fehler zuallererst bei dir und deiner Programmlogik.
Bis du soweit bist, dass du dem Compiler einen Fehler nachweisen kannst, 
steht auf deinem Kalender 2013

> ich simuliere das ganze im Debugger vom AVR Studio ... wenn ich von
> Schritt zu Schritt springe funktioniert t=1; nicht wiso ?

Weil der Optimizer die Anweisung an eine andere Stelle verschoben hat. 
Die Programmlogik bleibt allerdings die gleiche.

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.