Forum: Mikrocontroller und Digitale Elektronik aus-ja an-nein


von Joachim (Gast)


Lesenswert?

Hallo zusammen

Hab grad nen sehr merkwürdiges Problem, arbeite grad mit nem Tiny25, war 
grad nen bissl am rumspielen mit C, dabei bin ich auf folgendes Phänomen 
gestoßen: Dieses Programm funktioniert wie es soll:
(Bei Erde an PB3 geht PB4 aus)

#include <avr/io.h>

int main (void) {

DDRB = 0b00010000;
PORTB = 0b00001000;
while ( PINB & (1<<PINB3) ) {
PORTB = 0b00011000;
}
PORTB = 0b00001000;


   while(1) {
     /* "leere" Schleife*/;
   }

   /* wird nie erreicht */
   return 0;
}

Dieses jedoch nicht:

(Bei Erde an PB3 geht PB4 an)

#include <avr/io.h>

int main (void) {

DDRB = 0b00010000;
PORTB = 0b00001000;
while ( PINB & (1<<PINB3) ) {
PORTB = 0b00001000;
}
PORTB = 0b00011000;


   while(1) {
     /* "leere" Schleife*/;
   }

   /* wird nie erreicht */
   return 0;
}

Hier ist von Anfang an PB4 an, das soll aber erst passieren, wenn die 
Bedingung in der Schleife falsch wird.

Jemand ne Idee?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

1
#include <avr/io.h>
2
 
3
int main (void) 
4
{
5
   // Hardware initialisieren. Reihenfolge bzgl. Hardwareaufbau beachten
6
   PORTB = (1<<PINB4) | (1<<PINB3);         
7
   // PB4 HIGH, d.h. low active LED AUS
8
   // PB3 interner Pullup aktiviert 
9
   DDRB = (1<<PINB4);          // PB4 Output, PB3 Input
10
11
   // unendliche Arbeitsschleife
12
   while(1) {
13
      while ( PINB & (1<<PINB3) ) 
14
      {
15
         // Solange PB3 NICHT an GND hängt
16
         PORTB = (0<<PINB4) | (1<<PINB3); // PB4 LOW, d.h. low active LED AN
17
      }
18
      PORTB = (1<<PINB4) | (1<<PINB3); // PB4 HIGH, d.h. low active LED AUS
19
   }
20
21
   /* wird nie erreicht */
22
   return 0;
23
}

von Peter Diener (Gast)


Lesenswert?

Hallo,

das kann passieren, wenn beim Einschalten der Controller schon los 
läuft, während die Versorgungsspannung noch nicht ausreicht, um HIGH an 
PB4 zu erkennen.

Bau eine kleine Startup-Verzögerung ein!

Grüße,

Peter

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.