Forum: Mikrocontroller und Digitale Elektronik Delay in if else funktion


von Sebastian B. (opfer1983)


Lesenswert?

Hallo ich möchte eine Schaltung bauen die jeden Tag bei nacht für 3min 
eine L-Diode einschaltet.Ich mache das mit einer Photodiode.Es klappt 
auch schon aber ich kriege die delay funktion nicht eingefügt sodas die 
leuchtdiode 3min anbleibt.Ich bin totaler Anfänger und wäre für hilfe 
sehr dankbar!

Hier ist mein code mit der delay funktion an der falschen stelle im Code

#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 3686400UL
#endif
#include <util/delay.h>



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

int main( void )
{
    DDRB = ( 1 << PB0 );        // Ausgang
   DDRD = ( 0 <<  PD2 );        //Eingang

    while( 1 ) {                // Endlosschleife
        if (!(PIND&0x04))

      PORTB = 0xFF;

    else
      PORTB = 0x00;
        long_delay(1000);       // Eine Sekunde warten...
    }

    return 0;
}

von Karl H. (kbuchegg)


Lesenswert?

Du brauchst ein C Buch.

WEnn von einem if oder einem else mehrere Anweisungen abhängen, dann 
muss man die Anweisungen in { } einschliessen und so einen Block bauen.

Grundlagen C - zweite Unterrichtseinheit.

von Sebastian B. (opfer1983)


Lesenswert?

Kannst Du mal an einen beispiel mir das zeigen?

von Karsten (Gast)


Lesenswert?

Außerdem wird die LED die ganze Nacht leuchten...

von Sebastian B. (opfer1983)


Lesenswert?

Stimmt habe ich vertauscht gerade gemerkt.

von Karl H. (kbuchegg)


Lesenswert?

1
#ifndef F_CPU
2
#define F_CPU 3686400UL
3
#endif
4
5
#include <avr/io.h>
6
#include <util/delay.h>
7
8
void long_delay(uint16_t ms)
9
{
10
  for(; ms>0; ms--)
11
    _delay_ms(1);
12
}
13
14
int main( void )
15
{
16
  DDRB  =  ( 1 << PB0 );        // Ausgang
17
  DDRD &= ~( 1 << PD2 );        //Eingang
18
19
  while( 1 )
20
  {
21
    if( !( PIND & ( 1 << PD2 ) )
22
      PORTB |= ( 1 << PB0 );
23
24
    else
25
    {
26
      PORTB &= ~( 1 << PB0 );
27
      long_delay(1000);       // Eine Sekunde warten...
28
    }
29
  }
30
31
  return 0;
32
}

und rücke deinen Code korrekt ein! Falsch eingerückter Code verursacht 
Augenkrebs :-)

von Sebastian B. (opfer1983)


Lesenswert?

Ja danke aber wenn ich das in der if funktion mache statt in der Else 
kommt die fehlermeldung : error: 'else' without a previous 'if'

von Karl H. (kbuchegg)


Lesenswert?

Kauf dir ein C-Buch

Oder denk alternativ ein wenig nach. (*)

Wenn du das delay vom else Zweig in den if Zweig holst, dann hast du 
jetzt im if Zweig 2 Anweisungen, die vom if abhängen. Also wirst du dort 
eine { } Klammerung brauchen.


(*) Edit: Das nehme ich zurück. Du sollst nicht alternativ nachdenken. 
Du sollst auf jeden Fall nachdenken UND dir ein C-Buch kaufen.
1
  while( 1 )
2
  {
3
    if( !( PIND & ( 1 << PD2 ) )
4
    {
5
      PORTB |= ( 1 << PB0 );
6
      long_delay(1000);       // Eine Sekunde warten...
7
    }
8
    else
9
    {
10
      PORTB &= ~( 1 << PB0 );
11
    }
12
  }

von Fabi (Gast)


Lesenswert?

if( !( PIND & ( 1 << PD2 ) )


DA GEHEN 3 KLAMMERN AUF, ABER NUR 2 ZU!!!

von Karl H. (kbuchegg)


Lesenswert?

Danke.
Die Klammer ist beim editieren hier im Forum verschwunden.

Sollte aber klar sein, wo sie sein muss.

von Sebastian B. (opfer1983)


Lesenswert?

Danke für die Hilfe ein bißchen nachdenken hat wirklich geholfen!!!


Hier meine Lösung

if (!(PIND&0x04))
{PORTB = 0xFF;
long_delay(1000);
}

von Karl H. (kbuchegg)


Lesenswert?

Einrückungen!
eine konsistente und einigermassen schöne Formatierung verhindert schon 
mal 20% der gängigsten Fehler.

von Timmo H. (masterfx)


Lesenswert?

Und nutze die Makros für die Ports:
1
if ( !(PIND & (1<<PD4)) ){
2
  PORTB = 0xFF;
3
  long_delay(1000);
4
}

von Sebastian B. (opfer1983)


Lesenswert?

Ja ich werde es in Zukunft versuchen.

von Sebastian B. (opfer1983)


Lesenswert?

Also so weit so gut.Aber wie funktioniert das jetzt das ich die Leuchte 
nur einmal anschalte.Weil jetzt bleibt sie ja noch zur zeit an?

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.