Attiny45 geht nicht in Schleife

OP #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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.