Hallo Community, Wie kann ich diese Entprellroutine (im GCC Tutorial vorgestellt) //////// entprellung( &PINB, (1<<PINB2) ); //////// in meinem Programm nutzen? Nehmen wir an ich habe meinen Taster an PIND2 dann würde ich doch die Entprellfunktion folgermaßen aufrufen: entprellung( &PIND, (1<<PD2) ); Wie kann ich nun prüfen ob dieser tatsächlich gedrückt wurde um beispielsweise ne LED an PC5 anzuschmeissen? ich dachte da an etwas wie if (entprellung( &PIND, (1<<PD2) )) > LED anschalten ähnlich Peter Danneggers : if( debounce( PINB, PB1 ) ) PORTB ^= 1<<PB2; haut aber nicht hin weil ich nen Fehler zu der Zeile mit dem IF bekomme. Einer nen Vorschlag? Gruß und danke! R.
r4m0n schrieb: > Einer nen Vorschlag? Ja. Wenn du Fehler erhältst, dann lies sie. Deswegen gibt der Compiler einen Fehlertext, der sogar meistens mit dem Problem korelliert. Wenn dir der Fehlertext nichts sagt, dann zeig den Code (aber nicht einen winzigen Ausschnitt) und den zugehörigen Fehlertext. Oder gehst du zum Arzt und sagst: Es tut weh! Was kann das sein?
PS: Nimm die auf der Seite "Entprellung" vorgestellten "Komfortroutinen", die mit dem Timer arbeiten. Die funktionieren am allerbesten.
Sorry hier ist mein Code + Fehlermeldung. Die Routinen über Interrupts sind mit Sicherheit alle besser, jedoch etwas schwierig nachzuvollziehen. Ich wollte mich erstmal so an das Thema rantasten und später bei besserem Verständniss umsteigen. ////////// #include <avr/io.h> #include <util/delay.h> #include <inttypes.h> #include "lcd-routines.h" void entprellung( volatile uint8_t *port, uint8_t maske ) { uint8_t port_puffer; uint8_t entprellungs_puffer; for( entprellungs_puffer=0 ; entprellungs_puffer!=0xff ; ) { entprellungs_puffer<<=1; port_puffer = *port; _delay_us(150); if( (*port & maske) == (port_puffer & maske) ) entprellungs_puffer |= 0x01; } } int main(void) { DDRC |= (1 << PC5); // Set LED as Output at PC5 DDRB |= (0 << PB1); // Set Switch PD2 as Input PORTC |= (1 << PC5); // Turn LED off PORTB |= (1 << PB1); // activate Pullup for Switch at PD2 for(;;) { if(entprellung( &PIND, (1<<PD2) )) { PORTC ^= (1 << PC5); //toggle LED at PC5 } } } ////////// Fehler im Compiler: Build started 27.4.2010 at 20:28:11 avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -fsigned-char -MD -MP -MT FlowMeter.o -MF dep/FlowMeter.o.d -c ../FlowMeter.c ../FlowMeter.c: In function 'main': ../FlowMeter.c:28: error: void value not ignored as it ought to be make: *** [FlowMeter.o] Error 1 Build failed with 1 errors and 0 warnings...
ops soll natürlich DDRD |= (0 << PD2); // Set Switch PD2 as Input PORTD |= (1 << PD2); // activate Pullup for Switch at PD2 statt DDRB |= (0 << PB1); // Set Switch PD2 as Input PORTB |= (1 << PB1); // activate Pullup for Switch at PD2 heißen...
r4m0n schrieb:
1 | > void entprellung( volatile uint8_t *port, uint8_t maske ) { |
passt nicht zu
1 | if(entprellung( &PIND, (1<<PD2) )) |
entprellung liefert keinen wert zurück, 4lt0r.
ups² so wirds dann wohl eher hinhauen. for(;;) { entprellung(&PIND, (1<<PD2) ); if (!(PIND & 1<<PD2)) { PORTC ^= (1 << PC5); //toggle LED at PC5 } } der Taster wird dann praktisch die ganze Zeit entprellt richtig? Gruß R.
r4m0n schrieb: > ups² > > so wirds dann wohl eher hinhauen. > for(;;) > { > entprellung(&PIND, (1<<PD2) ); > if (!(PIND & 1<<PD2)) > { > PORTC ^= (1 << PC5); //toggle LED at PC5 > } > } > > der Taster wird dann praktisch die ganze Zeit entprellt richtig? Jaein. Die Funktion entprellung wartet solange, bis sie 8 mal hintereinander (mit kleinen Wartezeiten dazwischen) vom Portpin denselben Wert eingelesen hat. Um das Erkennen von Tastendrücken musst du dich immer noch selbst kümmern. "Tastendrücken" versus ist die "Taste gedrückt" So wie in: Tastendrücken: Du drückst auf deiner TV Fernbedienung zwar den Umschaltknopf für 5 Sekunden, trotzdem schaltest du nur 1 Programm weiter. Taste gedrückt: Du drückst die Taste für Rolladen hoch und solange du den Finger auf der Taste hast, fährt der Rolladen hoch. Nimmst du den Finger runter, bleibt auch der Rolladen stehen.
Sind da nicht einfach ein paar schließende geschweifte Klammern zu viel? Zeile 28: da ist int main(void) zu Ende. Blackbird
Hallo Blackbird, Ich habe den Code etwas unübersichtlich reinkopiert. Bei genauerem Hinsehen schließen die Funktionen alle sauber ab. Gruß R.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.