Forum: Mikrocontroller und Digitale Elektronik Attiny45 geht nicht in Schleife


von Daniel H. (scretchy)


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

von Karl H. (kbuchegg)


Lesenswert?

1
  while(~(PINB & 1<<PB4))

die andere while Schleife detto

von Karl H. (kbuchegg)


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.

von g457 (Gast)


Lesenswert?

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

von g457 (Gast)


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>

von Klaus das Biest (Gast)


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.

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.