Forum: Mikrocontroller und Digitale Elektronik Die Anfänger Fragen..


von Huber M. (michael_h784)


Lesenswert?

Hallo,

ich bin Anfänger, habe mir jetzt ein Buch zu gelegt. Und wollte hier 
einen Thread eröffnen in dem ich verschiedene Fragen stellen kann. Damit 
ich nicht jedes mal einen neuen eröffnen muss. Wäre euch dankbar, wenn 
ihr mir die ein oder andere Frage beantworten würdet. Auch nochmal ein 
Dank die mir die letzten wochen versucht haben zu helfen.

nun wird hier ein Speedbutton behandelt. der zwischen gedrückten Zustand 
und loslassen die Zeit misst, und je nachdem eine Led einschaltet, eine 
bei 100ms, eine bei 200ms und eine bei 300ms. Und wenn man den Button 
1sec. lang drückt (löscht er alles wieder) und  es kann wieder von vorne 
losgehen.

am Anfang des Kapitels steht das die pin im Polling verfahren alle 10ms 
abgefragt werden. Aber ich komme nicht darauf wie sich das mit den 
zeiten zb. 100ms mit X in den if abfragen decken. Oder
1
else if (x > 300000)    // wenn x > 300000 (Langer Tastendruck -> Neues Spiel)
300000 soll eine Sekunde sein, wie kommt man denn auf diese werte ich 
dachte immer 1000ms = 1Sec.
1
/*
2
 * speed_button_1.c
3
 * Controller: ATmega88 @ 8MHz
4
 */
5
#define F_CPU 8000000UL
6
#include <avr/io.h>
7
 
8
int main(void)
9
{
10
    DDRB = 0xFF;                    // Richtungsregister PORTB auf Ausgang
11
    DDRD &= ~(1<<PD2);               // Richtungsregister PORTD PinD2 auf Eingang
12
  PORTD = (1<<PD2);
13
     
14
    uint8_t tastenzustand = 0;      // Flag für Tastenzustand definieren
15
    uint32_t x=0;                   // Datentyp für x = unsigned long (Wertebereich 0 bis 4 294 967 295)
16
     
17
    while(1)
18
    {
19
        if (!(PIND & (1<<PD2)))       // wenn PinD2 = low (gedrückt)
20
        {
21
            PORTB |= (1<<PB0);        // LED1 ON
22
            x++;                    // Zählvariable x um 1 erhöhen
23
            tastenzustand = 1;      // Flag für "Taster wurde gedrückt" setzen
24
        }
25
         
26
        else if ((PIND & (1<<PD2)) && (tastenzustand == 1))       // wenn PinD2 = high und Taster losgelassen
27
        {
28
            PORTB &= ~(1<<PB0);       // LED1 OFF
29
            tastenzustand = 0;      // Flag für den Tastenzustand zurücksetzen
30
             
31
            if ((x > 5000) && (x <= 40000))       // wenn x > 5000 (Tasterprellen abwarten) und <= 40000
32
            {
33
                PORTB |= (1<<PB7);    // LED4 ON (Anzeige für Superschnell!)
34
                x=0;                // Zählvariable x zurücksetzen
35
            }
36
             
37
            else if ((x > 40000) && (x <= 60000)) // wenn x > 40000 und <= 60000
38
            {
39
                PORTB |= (1<<PB2);                    // LED3 ON (Anzeige für Schnell!)
40
                x=0;                                // Zählvariable x zurücksetzen
41
            }
42
             
43
            else if ((x > 60000) && (x <= 80000)) // wenn x > 60000 und <= 80000
44
            {
45
                PORTB |= (1<<PB1);                    // LED2 ON (Anzeige für Langsam!)
46
                x=0;                                // Zählvariable x zurücksetzen
47
            }
48
             
49
            else if (x > 300000)    // wenn x > 300000 (Langer Tastendruck -> Neues Spiel)
50
            {
51
                x=0;            // Zählvariable x zurücksetzen
52
                PORTB &= ~((1<<PB7)|(1<<PB2)|(1<<PB1));       // Bit 1,2 und 7 löschen (LED 2,3 und 4 OFF)
53
            }
54
        }
55
    }
56
}

von Sascha_ (Gast)


Lesenswert?

Ein didaktisch sehr fragwürdiges Beispiel.

Auf die 30000 kommt man, wenn man weiss dass der Controller bei 8MHz 
läuft, für fast jeden Befehl einen Takt braucht und die while(1) 
schleife x Takte braucht.

Da kann an als blutiger Anfänger aber eigentlich kaum drauf kommen.

von Joachim B. (jar)


Lesenswert?

arbeite Debouncing 8 Keys von Author: Peter Dannegger durch
https://www.mikrocontroller.net/articles/Entprellung

dann hat du eine Tastenentprellung und eine Zeitbasis in einem!

wenn das funktioniert ist der Rest einfach

von besucher47 (Gast)


Lesenswert?

die geforderten Aufgabe funktioniert genausogut wenn man die taste nicht 
enprellt..

von Teo D. (teoderix)


Lesenswert?

besucher47 schrieb:
> die geforderten Aufgabe funktioniert genausogut wenn man die taste nicht
> enprellt..
EDIT:
> die geforderten Aufgabe entprellt...

von Joachim B. (jar)


Lesenswert?

mir fehlt halt das Zeitnormal und was bedeutet loslassen wenn eine Taste 
nicht entprellt ist?

OK ich gestehe ich habe die Aufgabe dann nicht verstanden denn wenn sie 
so funktioniert wie im Erstposting gibt es ja keine Probleme, 
freilaufende loop und wüste Zahlen.

Huber M. schrieb:
> 300000 soll eine Sekunde sein

weil der Prozzi mit 8MHz vielleicht so viele Schleifendurchläufe/s 
schafft?

Ich bleibe dabei, arbeite die Tasatenentprellung mit Timer durch auf 
10ms und zähle nach sicherer Erkennung die 10ms Durchlaufe um auf deine 
100, 200, 300 ms zu kommen.

Stichwort Statemachine!

von Boris O. (bohnsorg) Benutzerseite


Lesenswert?

Huber M. schrieb:
> Und wollte hier
> einen Thread eröffnen in dem ich verschiedene Fragen stellen kann. Damit
> ich nicht jedes mal einen neuen eröffnen muss.

So funktioniert ein Forum nicht. Je Thread eine Frage, ein 
aussagekräftiger Titel und eine variable Anzahl mehr oder weniger 
praktischer Antworten. Wie stellst du es dir vor, die verschiedenen 
Fragen in einen Thread den zeitlich sortierten Antworten zuzuordnen?

von Peter D. (peda)


Lesenswert?

Huber M. schrieb:
> 300000 soll eine Sekunde sein, wie kommt man denn auf diese werte ich
> dachte immer 1000ms = 1Sec.

Da hat sich jemand die unnötige Arbeit gemacht und das händisch 
ausgemessen.
Gilt aber nur für eine ganz bestimmte CPU-Frequenz, Compilerversion und 
Optimierungslevel.

Mach ein _delay_ms(1); in die Schleife und schon kannst Du ziemlich 
genau in 1ms zählen (1000 = 1s usw.).

von Joachim B. (jar)


Lesenswert?

Peter D. schrieb:
> Mach ein _delay_ms(1); in die Schleife und schon kannst Du ziemlich
> genau in 1ms zählen (1000 = 1s usw.).

und wenn er aufs delay verzichtet und deine Entprellroutine nimmt mit 
10ms Zeitbasis hat er ein Zeitnormal ohne delay

von Komplettverweigerer (Gast)


Lesenswert?

To schreibt im Titel : "Die Anfänger Fragen", hat sich ein Buch gekauft 
und ist am Anfang des Kapitels.
Der Autor des Buches hat sich bei dem Code mit Sicherheit was gedacht 
und wird aufbauend arbeiten. Da ist ein copy&paste Code, den man als 
Anfänger schonmal gar nicht verstehen kann wohl ein wenig blöd.

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.