mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Delay in if else funktion


Autor: Sebastian Besuch (opfer1983)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian Besuch (opfer1983)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst Du mal an einen beispiel mir das zeigen?

Autor: Karsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Außerdem wird die LED die ganze Nacht leuchten...

Autor: Sebastian Besuch (opfer1983)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt habe ich vertauscht gerade gemerkt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#ifndef F_CPU
#define F_CPU 3686400UL
#endif

#include <avr/io.h>
#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 &= ~( 1 << PD2 );        //Eingang

  while( 1 )
  {
    if( !( PIND & ( 1 << PD2 ) )
      PORTB |= ( 1 << PB0 );

    else
    {
      PORTB &= ~( 1 << PB0 );
      long_delay(1000);       // Eine Sekunde warten...
    }
  }

  return 0;
}

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

Autor: Sebastian Besuch (opfer1983)
Datum:

Bewertung
0 lesenswert
nicht 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'

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
  while( 1 )
  {
    if( !( PIND & ( 1 << PD2 ) )
    {
      PORTB |= ( 1 << PB0 );
      long_delay(1000);       // Eine Sekunde warten...
    }
    else
    {
      PORTB &= ~( 1 << PB0 );
    }
  }

Autor: Fabi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if( !( PIND & ( 1 << PD2 ) )


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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke.
Die Klammer ist beim editieren hier im Forum verschwunden.

Sollte aber klar sein, wo sie sein muss.

Autor: Sebastian Besuch (opfer1983)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Timmo H. (masterfx)
Datum:

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

Autor: Sebastian Besuch (opfer1983)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ich werde es in Zukunft versuchen.

Autor: Sebastian Besuch (opfer1983)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.