[GCC] Timer0 CTC Problem

Hi,
gut ich probier das mal zu ändern.
Von der Logik her sollte meine Entprellung aber funktionieren oder?
 
Von der Logik her sollte meine Entprellung aber funktionieren oder?

Hallo Finn,

Code:
if ( [COLOR=DarkRed][B](PINB | (1<<PB0))[/B][/COLOR])             
{                 
  entprellcounter++;             
} else {
  entprellcounter = 0;             
}

das geht nicht (rot). Die Bedingung ist immer wahr! Richtig wäre hier zum Beispiel

if ((PINB & (1<<PB0)) == 0)

Weiter habe ich mir deinen Code jetzt nicht ansehen können.

Dirk
 
Hallo Finn,

da das Relais sich wie ein bedienerseitiger Tastendruck verhält, kannst Du doch eine Entprellung wie bei einer Tastenabfrage verwenden. Wenn Du dann die ganze Timersteuerung den Käfer machen läßt, kannst Du im main die "taste" abfragen, z.B. so:

Code:
// einfache Tastenentprellung
inline uint8_t tastenabfrage(volatile uint8_t *port, uint8_t pin)
{
    if ( !(*port & (1 << pin)) )
    {
        // Pin wurde auf Masse gezogen, z.B.: 100ms warten
        _delay_ms(50);   // 2x50, weil 50 der Maximalwert an _delay_ms ist
        _delay_ms(50);   
        if ( *port & (1 << pin) )
        {
            // Zeit zum Loslassen geben
            _delay_ms(50);
            _delay_ms(50); 
            return 1;
        }
    }
    return 0;
}

Mit den Zeiten mußt Du experimentieren. Kommt darauf an, wie lange Dein Relaisimpuls ist.
2. Möglichkeit wäre das Relais an einen externen Takteingang eines Timers anzuschließen und dort den Flankenwechsel zu zählen.

Viel Erfolg
Michael
 
Hallo Finn,

Code:
if ( [COLOR=darkred][B](PINB | (1<<PB0))[/B][/COLOR])             
{                 
  entprellcounter++;             
} else {
  entprellcounter = 0;             
}

das geht nicht (rot). Die Bedingung ist immer wahr! Richtig wäre hier zum Beispiel

if ((PINB & (1<<PB0)) == 0)

Weiter habe ich mir deinen Code jetzt nicht ansehen können.

Dirk

Die Bedingung sollte nicht immer war sein.
Kurz zur Schaltung:
Relais Platine -> Per Funk -> Relais als Stromstoßrelais schalten.
Also muss ich ja, wenn ich jeden Tastendruck auswerten möchte, erkennen, wenn sich das Signal ändert.

Einmal halt: 0 => 1 und 1 => 0
if ((PINB & (1<<PB0)) == 0)

Das == 0 kann ich doch eigentlich weglassen oder?
Ich frage doch mit dem "&" schon ab, ob das Bit an PINB0 gelöscht ist oder nicht?
Daher bin ich auf den Gedanken gekommen, dass "if ( (PINB | (1<<PB0))) " heißen müsste, dass wenn Bit PINB0 gesetzt ist, mache...

michaelkorb schrieb:
Mit den Zeiten mußt Du experimentieren. Kommt darauf an, wie lange Dein Relaisimpuls ist.
Ich habe wie schon erwähnt ein Stromstoßrelais, also ist der "Impuls" solange, wie das Programm "an" sein soll.
Die nächste Änderung kommt erst, wenn ein neues Programm ausgewählt wird.
 
Hallo Finn,
Das == 0 kann ich doch eigentlich weglassen oder?

nein, du kannst es nicht weglassen!

if ((PINB & (1<<PB0)) == 0)

oder

if (!(PINB & (1<<PB0)))

Die Bedingung ist dann wahr, wenn PINB0 nicht gesetzt ist (wenn der Taster gedrückt wird).

"Veroderst" du mit irgeneinem Wert ungleich Null (zB. 1<<PB0),
if ( (PINB | (1<<PB0)))
ist der Gesamtausdruck immer wahr, also größer 0, egal was in PINB ist.

Dirk
 
Ich habe wie schon erwähnt ein Stromstoßrelais, also ist der "Impuls" solange, wie das Programm "an" sein soll.
Die nächste Änderung kommt erst, wenn ein neues Programm ausgewählt wird.
Heißt das, das es bei jeder Änderung einen Flankenwechsel gibt?
Also 1. Wechsel - Flanke 0 auf 1, nächste Programmanwahl - Flanke von 1 auf 0?
Wenn dem so ist, nimm doch einfach einen externen Interrupteingang.

Michael
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)