Programm um Ausgang zu verzögern.

OP #4374582
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();
    }
}
#4374605
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.
#4374625
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.
#4374655
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
OP #4374657
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
#4374671
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.
OP #4374678
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren