mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Attiny45 geht nicht in Schleife


Autor: Daniel Hardi (scretchy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.
Ich hab mich heute mal rangemacht um eine Stromversorgungsplatine zu 
basteln.
Dafür verwende ich den Attiny45 auf dem STK500 Board. Testen tue ich auf 
einem Steckbrett.
PB1, PB4 sind eingänge
PB2, PB0, PB3 sind Ausgänge
PB5 nicht belegt da Reset
Pin 8 VCC 5+
Pin 4 Gnd 0V

Folgenden Code verwende ich.
Habe schon einiges auskommentiert um den Fehler zu finden.
#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>

void long_delay(unsigned int ms)
{
  for(; ms > 0; ms--) _delay_ms(1);
}


int main( void )
{
  unsigned int time = 0;
        DDRB = 1 << PB0 | 1 << PB2 | 1 << PB3; //Ausgänge definieren
  PORTB = 1 << PB2 | 1 << PB3; //PB2, PB3 einschalten

  long_delay(2500); //2,5sec warten

  PORTB = 1 << PB0 | 1 << PB2 | 1 << PB3; // PB0 auch einschalten
  while(~(PINB & PB4)) // Solange in der Schleife bleiben bis PB4 auf Low ist
  {
                // In diese Schleife geht er nicht rein. PB4 hab ich direkt auf Masse gezogen oder frei in der luft hängen gelassen.
    PORTB = !(1 << PB0 | 1 << PB3);
    /*if(++time == 5000)
    {
      PORTB = !(1 << PB0 | 1 << PB2 | 1 << PB3);
      while(1);
    }
    long_delay(1);*/
  }
  while(PINB & PB4)
  {
    if(PINB & PB1) PORTB = 1 << PB0 | 1 << PB2 | 1 << PB3;
    else PORTB = 1 << PB2 | 1 << PB3;
  }

  PORTB = 0;
        return 0;
}


Ich hoffe ihr könnt mir helfen

Mit freundlichen Grüßen
Daniel

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

Bewertung
0 lesenswert
nicht lesenswert
  while(~(PINB & 1<<PB4))

die andere while Schleife detto

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

Bewertung
0 lesenswert
nicht lesenswert
> PB4 hab ich direkt auf Masse gezogen oder frei in der luft hängen gelassen

Dann solltest du einen Pullup Widerstand an PB4 einschalten.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> while(~(PINB & (1<<PB4)))
        ^
        Ba sollte noch ein logische not hin anstelle des binären, sonst 
wird das zur Endlosschleife.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> PORTB = !(1 << PB0 | 1 << PB3);
          ^
           ..und hier gehört das binäre not hin statt des logischen.. 
der PORTB wird sonst immer 0x00..
</ingrid>

Autor: Klaus das Biest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf die Schnelle die groben Fehler, fehlerhafte Zeilen sind 
auskommentiert und durch die Richtigen ersetzt:
#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>

void long_delay(unsigned int ms)
{
  for(; ms > 0; ms--) _delay_ms(1);
}


int main( void )
{
  unsigned int time = 0;
  DDRB = 1 << PB0 | 1 << PB2 | 1 << PB3; //Ausgänge definieren
  PORTB = 1 << PB2 | 1 << PB3; //PB2, PB3 einschalten

  long_delay(2500); //2,5sec warten

  PORTB = 1 << PB0 | 1 << PB2 | 1 << PB3; // PB0 auch einschalten
  //while(~(PINB & PB4)) // Solange in der Schleife bleiben bis PB4 auf Low ist
  while(!(PINB & (1<<PB4))) //Falsches NOT verwendet
  {
                // Warum sollte er auch in diese Schleife gehen, wenn Pin4 doch schon low ist? 
  //Hier rein geht es nur, so lange PB4 high ist.
// In der Luft ist nicht sicher High! Hierzu solltest Du die PullUp-Widerstände nutzen.
    PORTB = ~(1 << PB0 | 1 << PB3);
  }
  //while(PINB & PB4)
  while(PINB & (1<<PB4))
  {
    //if(PINB & PB1) PORTB = 1 << PB0 | 1 << PB2 | 1 << PB3;
    if(PINB & (1<<PB1)) PORTB = 1 << PB0 | 1 << PB2 | 1 << PB3;
    else PORTB = 1 << PB2 | 1 << PB3;
  }

  PORTB = 0;
  return 0;
  //Das Programm ist hier zu Ende, der Controller startet im besten Fall neu. 
  //Mach eine while(1)-Schleife hier hin, dann bleibt er an der Stelle stehen.
}


Schau die bitte im Turorail einmal den Abschnitt 10, Zugriff auf 
Register, im AVR-GCC-Tutorial an! Und lies Dir durch, was der 
Unterschied zwischen ! und ~ ist.

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.