hallo
hab scho wieder a problem, diesmal mit debounce!
hab für die tastenabfrage zuerst meinen eigenen code verwendet,
1 | PORTB &= ~(1<<PB0);
|
2 | if (PINB & (1<<PINB1)) {
|
3 | PORTB&= ~(1<<PB0);
|
4 | }
|
5 | else {
|
6 | PORTB|=(1<<PB0);
|
7 | }
|
mit diesem hab ich natürlich ein prellen dabei
ok, die debounce routine ausm turtorial genommen und eingebaut, jedoch
klappt diese leider nicht.
ganz zu beginn kann ich den taster drücken und der ausgang wird
geschalten.
hab ich mir schon gedacht dann mach ich einen else zweig else wo wieder
zurückgesetzt wird
1 | if (debounce(&PINB, PB1))
|
2 | {PORTB = PINB ^ ( 1<<PINB0);}
|
3 | else{
|
4 | PORTB|=(1<<PB0);
|
5 | }
|
bzw zu beginn der while schleife setz ich den ausgang mauell auf 0
1 | while(1)
|
2 | {PORTB &= ~(1<<PB0);
|
3 | .
|
4 | .
|
5 | }
|
leider hilft alles nix, ich muss zugeben mit pointer die in der debounce
auch vorkommen kenn ich mich fast nicht aus!
vielleicht kann mir wer einen tipp geben.
der taster wird gegen GND geschalten und mittels µc pullup auf 1
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 | #include <stdlib.h>
|
4 |
|
5 | inline uint8_t debounce(volatile uint8_t *port, uint8_t pin);
|
6 |
|
7 | int main(void)
|
8 | {
|
9 | DDRB = (1<<DDB0); //PinB0 als Ausgang
|
10 | DDRB &= ~(1<<DDB1); //PinB1 als Eingang
|
11 | PORTB &= ~(1<<PB0);// PibB0 auf 0
|
12 | PORTB |= (1<<PB1); // PINB1 PullUp auf vcc
|
13 |
|
14 | while(1)
|
15 | {
|
16 | /*PORTB &= ~(1<<PB0);
|
17 | if (PINB & (1<<PINB1)) {
|
18 | PORTB&= ~(1<<PB0);
|
19 | }
|
20 | else {
|
21 | PORTB|=(1<<PB0);
|
22 | }
|
23 | */
|
24 | if (debounce(&PINB, PB1))
|
25 | {PORTB = PINB ^ ( 1<<PINB0);}
|
26 |
|
27 | }
|
28 |
|
29 | }
|
30 |
|
31 | inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
|
32 | {
|
33 | if ( ! (*port & (1 << pin)) )
|
34 | {
|
35 | /* Pin wurde auf Masse gezogen, 100ms warten */
|
36 | _delay_ms(50); // max. 262.1 ms / F_CPU in MHz
|
37 | _delay_ms(50);
|
38 | if ( *port & (1 << pin) )
|
39 | {
|
40 | /* Anwender Zeit zum Loslassen des Tasters geben */
|
41 | _delay_ms(50);
|
42 | _delay_ms(50);
|
43 | return 1;
|
44 | }
|
45 | }
|
46 | return 0;
|
47 | }
|
mfg
low