Forum: Mikrocontroller und Digitale Elektronik wie Code verbessern?


von Robin F. (gehacktes)


Lesenswert?

Schönen guten Abend,

ich habe mir einen Code geschrieben, um aus einem Taster, einen Schalter 
zu machen.
Kann man diesen Code noch irgendwie verbessern?

#include <avr/io.h>
#include <util/delay.h>

int main()
{
    DDRB=0xff;
    DDRC=0x00;
    PORTB=0x00;
    PORTC=0x00;

    while(1)
    {
        if( PINC &(1<<PC0)){
             PORTB=PORTB ^ 1;
            _delay_ms(50);
            _delay_ms(50);
        }
    }

        return 0;
    }

Das Programm funktioniert soweit...aber manchmal blinkt die LED am 
Ausgang! Kann man das irgendwie umgehen per Software oder mithilfe von 
Hardware?

Gruß Robin

von Turbotoni (Gast)


Lesenswert?

Ja, in dem man den Taster enrprellt.

von Ulrich Radig (Gast)


Lesenswert?

Hallo,

füge zwischen deinen beiden Delays while(PINC &(1<<PC0)); ein. Das ist 
noch nicht optimal sollte dir aber weiter helfen.

Gruß
Uli

von Robin F. (gehacktes)


Lesenswert?

Danke Uli!

Meinst du es so?

#include <avr/io.h>
#include <util/delay.h>

int main()
{
    DDRB=0xff;
    DDRC=0x00;
    PORTB=0x00;
    PORTC=0x00;

    while(1)
    {
        if( PINC &(1<<PC0)){
            _delay_ms(5);
            PORTB=PORTB ^ 1;
            _delay_ms(50);
            while(2)
            {
                (PINC &(1<<PC0));
            }
            _delay_ms(50);
            }
    }

        return 0;
}
Wenn ja, dann passt das nicht! So bleibt die LED nach dem Tasten druck 
dauerhaft leuchten und lässt sich nicht mehr beim zweiten drücken  aus 
schalten.

Gruß Robin

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Klar, Du hast ja auch eine Endlosschleife gebaut. In den Klammern hinter 
While steht nämlich die Bedingung, unter der die Schleife wiederholt 
wird - und alles außer 0 (=FALSCH) ist WAHR. Also wird deine 
While(2)-Schleife nie verlassen. Und das in der While-Schleife ist auch 
ziemlicher Käse. Schau dir doch mal an, was ein Flag und was Entprellung 
ist. Und was ein Timer ist.


Gruß
Jonathan

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Jonathan Strobl schrieb:
> Und das in der While-Schleife ist auch
> ziemlicher Käse.

Zumindest dort, wo Du ihn hingeschrieben hast - nicht, dass sich Ulrich 
Radig noch auf den Schlips getreten fühlt ;)

So hat er das gemeint:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
int main()
5
{
6
    DDRB=0xff;
7
    DDRC=0x00;
8
    PORTB=0x00;
9
    PORTC=0x00;
10
11
    while(1)
12
    {
13
        if( PINC &(1<<PC0)){
14
            PORTB=PORTB ^ 1;
15
            _delay_ms(50);
16
17
           while(PINC&(1<<PC0)) {}
18
19
            _delay_ms(50);
20
        }
21
    }
22
23
        return 0;
24
    }

von Robin F. (gehacktes)


Lesenswert?

Okay danke!

Ich bin gerade dabei Entprellung besser zu verstehen

Melde mich später nochmal ob es geklappt hat oder nicht ;).

Grüße und schönen Abend noch
Robin

von Karl H. (kbuchegg)


Lesenswert?

Nimm dein Originalprogramm
1
    while(1)
2
    {
3
        if( PINC &(1<<PC0)){
4
             PORTB=PORTB ^ 1;
5
            _delay_ms(50);
6
            _delay_ms(50);
7
        }
8
    }

und teste es:
Drück auf die Taste und bleib mit dem Finger auf der Taste und halte sie 
gedrückt. Deine LED wird wie verrückt blinken.

Warum?

Weil dein Code innerhalb des then-Zweiges vom if ausgeführt wird SOLANGE 
eine Taste gedrückt ist. Das willst du aber nicht. Du willst einen 
Tastendruck erkennen. Wenn also die Taste den Übergang von nicht 
gedrückt zu gedrückt macht.

Dazu gibt es 2 Möglichkeiten
* entweder du lässt das Programm aus dem if-Zweig solange nicht herraus, 
solange die Taste immer noch gedrückt ist
* oder aber, du vergleichst den Pinzustand mit demselben Pinzustand im 
unmittelbar vorhergehenden Durchlauf durch die while Schleife. Dazu 
musst du dir diesen Zustand natürlich merken. Wenn du in einer Zimmer 
reinschaust und da brennt das Licht drinnen und du WEISST, dass es eine 
halbe STunde vorher (als du das letzte mal nachgesehen hast) nicht 
gebrannt hat, dann muss in der Zwischenzeit wohl jemand das Licht 
aufgedreht haben.

von Robin F. (gehacktes)


Lesenswert?

Ah okay danke Jonathan so klappt es.
Ich werde trotzdem die 3 Punkte die du angesprochen hast, mir zu gemüte 
führen.

Euch allen einen schönen Abend

von Robin F. (gehacktes)


Lesenswert?

Genau Karl Heinz das war der Fehler.

Ich werde mal ein wenig weiter daran rum spielen und versuchen es mit 
beiden Methoden hin zu bekommen :)

Vielen Dank von allen

von Martin (Gast)


Lesenswert?

Wenn du mit dem µC noch andere Dinge vorhast, als ihn in den 
Delay-Zeittotschlageschleifen vollzeit mit dem Taster zu beschäftigen, 
solltest du über einen Timer nachdenken, der per IRQ regelmäßig einen 
Blick auf die Tasten wirft und die Tasten auch gleich entprellt.
http://www.mikrocontroller.net/articles/Entprellung#Interrupt-Verfahren_.28nach_Peter_Dannegger.29
Beitrag "Tasten entprellen - Bulletproof"

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.