Attiny45 geht nicht in Schleife

#1725921
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.
1
#include <avr/io.h>
2
#define F_CPU 1000000UL
3
#include <util/delay.h>
4

5
void long_delay(unsigned int ms)
6
{
7
  for(; ms > 0; ms--) _delay_ms(1);
8
}
9

10

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

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

19
  PORTB = 1 << PB0 | 1 << PB2 | 1 << PB3; // PB0 auch einschalten
20
  while(~(PINB & PB4)) // Solange in der Schleife bleiben bis PB4 auf Low ist
21
  {
22
                // In diese Schleife geht er nicht rein. PB4 hab ich direkt auf Masse gezogen oder frei in der luft hängen gelassen.
23
    PORTB = !(1 << PB0 | 1 << PB3);
24
    /*if(++time == 5000)
25
    {
26
      PORTB = !(1 << PB0 | 1 << PB2 | 1 << PB3);
27
      while(1);
28
    }
29
    long_delay(1);*/
30
  }
31
  while(PINB & PB4)
32
  {
33
    if(PINB & PB1) PORTB = 1 << PB0 | 1 << PB2 | 1 << PB3;
34
    else PORTB = 1 << PB2 | 1 << PB3;
35
  }
36

37
  PORTB = 0;
38
        return 0;
39
}

Ich hoffe ihr könnt mir helfen

Mit freundlichen Grüßen
Daniel
Gast #1725963
Lesenswert?

Auf die Schnelle die groben Fehler, fehlerhafte Zeilen sind 
auskommentiert und durch die Richtigen ersetzt:
1
#include <avr/io.h>
2
#define F_CPU 1000000UL
3
#include <util/delay.h>
4

5
void long_delay(unsigned int ms)
6
{
7
  for(; ms > 0; ms--) _delay_ms(1);
8
}
9

10

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

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

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

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

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

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