Forum: Mikrocontroller und Digitale Elektronik Programm um Ausgang zu verzögern.


von Daniel S. (daniel_s943)


Lesenswert?

Hallo miteinander,

Ich würde gerne eine simplen beeper welcher am PB0 meines Atiny13 hängt 
beepen lassen sobald dieser über den PB1 ein high bekommt. Des weiteren 
soll es die möglichkeit geben den beeper zu muten (30 Sekunden ca) 
sobald der Controller am PB2 ein high bekommt.

Leider funktioniert das Ganze nicht so wie ich es gerne hätte.

Bitte um Hilfe.

#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000UL


int indicator (void)
{
  if (!(PINB & (1<<PINB1)))
  {
    PORTB = ~0b00100000;
  }

  if (!(PINB & (1<<PINB2) & (1<<PINB1)))
  {
    PORTB = 0x04;


    _delay_ms(1000);
  }

  else
  {
    PORTB=0x00;
  }
}








int main(void)
{
  DDRB=0xFF;                  //Alles an PORTB als Ausgang definieren
  DDRB &= ~((1 << DDB1) | (1 << DDB2));    //PORTB 1 / 2 als Eingang 
umdefiniert

  PORTB = (1<<PORTB0);


    while (1)
    {
    indicator();
    }
}

: Bearbeitet durch User
von Dennis S. (eltio)


Lesenswert?

Was genau funktioniert denn und was funktioniert nicht?

von Daniel S. (daniel_s943)


Lesenswert?

Eigentlich funktioniert bisher nichts richtig.

von Dennis S. (eltio)


Lesenswert?

Nichts ist nicht viel.. Kompilieren und flashen geht?

Fang vorne an und taste dich langsam vorwärts:
Ich würde erstmal ein Struktogramm anfertigen bis du sowas "im Kopf" 
kannst. Danach einzelne Funktionalitäten implementieren:
- einzelne Ports in Abhängigkeit von Pins toggeln
- erstmal nur die Ausschaltverzögerung realisieren

Gruß
Dennis

Edit: Wenn du Code-Tags nutzt ist das Posting übersichtlicher.

: Bearbeitet durch User
von Jürgen D. (poster)


Lesenswert?

Und vermeide die Verwendung von "delay".
An so einer Stelle bleibt das Programm solange stehen und macht nichts 
anderes. Starte einen Interrupt gesteuerten Timer der nach Ablauf z.B. 
ein Flag setzt. Das verwendest du in deiner Hauptschleife um was 
auszulösen, aber nicht um in einer Schleife darauf zu warten.

von Route_66 H. (route_66)


Lesenswert?

Daniel S. schrieb:
> #include <util/delay.h>
> #define F_CPU 8000000UL

Muß hier nicht die Reihenfolge umgekehrt sein?

von Daniel S. (daniel_s943)


Angehängte Dateien:

Lesenswert?

Hallo Dennis,

re-edit: kompilieren und flashen geht

habe Versucht ein PAP zu erstellen. Komme aber trotzdem noch nicht 
weiter da ich es irgendwie nicht schaffe die ein und ausgänge richtig zu 
definieren.

LG

: Bearbeitet durch User
von Dennis S. (eltio)


Lesenswert?

Okay... Unabhängig wie das Ergebnis aussehen soll passt dein Quelltext 
schonmal nicht zu deinem PAP.

Du sagst, du hast Probleme die GPIO zu definieren. In dem Fall lies dir 
nochmal das Kapitel [1] durch und schreib ein Programm, mit dem du ganz 
bewusst und zielgerichtet einen einzelnen Port oder Pin ansprichtst. Du 
hast nämlich drei Aufgaben:
1) Wie beherrschie ich die Toolchain? (Scheint zu klappen?!)
2) Wie beherrschie ich die Programmiersprache und den Controller? 
(Nachzulesen im AVR-GCC-Tutorial.)
3) Wie realisiere ich die Programmlogik? (PAP ist ein Anfang.)

Gruß
Dennis

[1] AVR-GCC-Tutorial

Edit: Typo

: Bearbeitet durch User
von Daniel S. (daniel_s943)


Lesenswert?

Jürgen D. schrieb:
> Und vermeide die Verwendung von "delay".
> An so einer Stelle bleibt das Programm solange stehen und macht nichts
> anderes. Starte einen Interrupt gesteuerten Timer der nach Ablauf z.B.
> ein Flag setzt. Das verwendest du in deiner Hauptschleife um was
> auszulösen, aber nicht um in einer Schleife darauf zu warten.


Wäre normalerweise auch mein Vorschlag, jedoch hat das Programm nur 
diese eine Funktion, d.h., dass es keine Rolle spielt in meinem Fall.

Aber vielen Dank, sonst irgendetwas gesehen im Syntax vieleicht?

LG

von Daniel S. (daniel_s943)


Lesenswert?

Route 6. schrieb:
> Daniel S. schrieb:
>> #include <util/delay.h>
>> #define F_CPU 8000000UL
>
> Muß hier nicht die Reihenfolge umgekehrt sein?

Ich weiss nicht ob das eine Rolle spielt?

von Karl H. (kbuchegg)


Lesenswert?

Daniel S. schrieb:
> Route 6. schrieb:
>> Daniel S. schrieb:
>>> #include <util/delay.h>
>>> #define F_CPU 8000000UL
>>
>> Muß hier nicht die Reihenfolge umgekehrt sein?
>
> Ich weiss nicht ob das eine Rolle spielt?

Sagen wir mal so.
Wenn du vorher 2 Stunden vor dem Ofen wartest und erst hinterher 
erfährst, dass Muffins nur 20 Minuten im Rohr sein sollen, dann wird das 
wohl nicht so sinnvoll sein.

von Daniel S. (daniel_s943)


Lesenswert?

Karl H. schrieb:
> Daniel S. schrieb:
>> Route 6. schrieb:
>>> Daniel S. schrieb:
>>>> #include <util/delay.h>
>>>> #define F_CPU 8000000UL
>>>
>>> Muß hier nicht die Reihenfolge umgekehrt sein?
>>
>> Ich weiss nicht ob das eine Rolle spielt?
>
> Sagen wir mal so.
> Wenn du vorher 2 Stunden vor dem Ofen wartest und erst hinterher
> erfährst, dass Muffins nur 20 Minuten im Rohr sein sollen, dann wird das
> wohl nicht so sinnvoll sein.

Das klingt plausibel, äußerst plausibel.

Hut ab für den Vergliech :'D

LG

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.