www.mikrocontroller.net

Forum: Compiler & IDEs Attiny13 Variable initialisiert sich nicht


Autor: Thorsten Schaan (trantor)
Datum:

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

#define PB0 0 //output
#define PB1 1 //input
#define PB2 2
uint16_t t;
uint16_t i;

int main (void){


// set PB.0 as output pin

DDRB  = 0b0000001;

// set PB.0 to output low

PORTB &= ~(1 << PB0);

while(1){
  
  //  Schleife solange Taster 0 ist
  start:    
  i = PINB;
  if ( i & 0x02 ) goto start;
  
  // Taster betätigt Gerät schaltet ein
  i = PINB;
  if (!( i & 0x02 )){
    t=1;
    PORTB |= (1 << PB0);
    i = PINB;
  while((!( i & 0x02 ))+(t<6000)){ //Taster betätigt und Zeit kleiner 10 sekunden
      i = PINB;
    while((!( i & 0x02 ))+(t<3000)){ // Taster betätigt und Zeit kleiner 5 sekunden
      t=t+1;
      _delay_ms(1000);
       }
       // 5 sekunden Vorüber
     PORTB |= (1 << PB2);
         t=t+1;
       _delay_ms(1000);
     }  
   // 10 sekunden vorrüber
     i = PINB;
   if (!( i & 0x02 )) PORTB &= ~(1 << PB0);//Gerät hart auschalten
  }

  }
}

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

jemand eine idee ?

Autor: Peter (Gast)
Datum:

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

Autor: Thorsten Schaan (trantor)
Datum:

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

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

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

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

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

Autor: Kai S. (hugstuart)
Datum:

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

Autor: Martin (Gast)
Datum:

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

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

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

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

Autor: Martin (Gast)
Datum:

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

Autor: Thorsten Schaan (trantor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okok ... habt ja recht kleiner blödheitsfehler ... der allerdings nicht 
erklärt warum
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

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

Bewertung
0 lesenswert
nicht lesenswert
Thorsten Schaan schrieb:
> okok ... habt ja recht kleiner blödheitsfehler ... der allerdings nicht
> erklärt warum
>
>
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.

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.