2-Bit Zähler rückwerts zählen lassen

Gast #1964864
Lesenswert?

Hallo Forum,
Ich habe mir bei Pollin das AVR-Board gehohlt und wollte den 2-Bit 
Zähler aus dem Pollin Tut zum Rückwerts zählen bringen.
Nun mein Problem
Wenn ich einen Taster drücke leuchten die Led´s wie sie wollen.
Im Anhang packe ich mal meinen code rein er ist in C.
Besten dan im vorraus für eure Hilfe
Euer Holzwurm
Gast #1965311
Lesenswert?

Hallo,

an deinem Code fällt mir auf, daß du den Tasterzustand über das Register 
PINC abfrägst, in deiner Initialisierung aber DDRB konfigurierst. Dh. 
dein Input am Port C wird vermtl. "floaten" und deshalb irgendwelche 
Störsignale auffangen.

Sieh dir das mal an ...

Gruß
#1965698
Lesenswert?

1
#define   F_CPU     1e6
2
#include <util/delay.h>
3
#include <avr/io.h>
4

5

6
// LEDs sind high-active geschaltet
7
#define LED_DDR         DDRD
8
#define LED_PORT        PORTD
9
#define LED1            PD5
10
#define LED2            PD6
11
#define LED3            PD7
12
 
13
// TASTER ist high-active geschaltet
14
#define TASTER1         PC0      //hoch
15
#define TASTER2         PC1
16
#define KEY_PIN         PINC
17

18

19
uint8_t key_state;                              // debounced key state:
20
                                                // bit = 1: key pressed
21
uint8_t key_press;                              // key press detect
22

23

24
void debounce( void )                           // about every 10ms
25
{
26
  static uint8_t ct0 = 0xFF, ct1 = 0xFF;        // 8 * 2bit counters
27
  uint8_t i;
28

29
  i = KEY_PIN;                                  // read keys (high active)
30
  i ^= key_state;                               // key changed ?
31
  ct0 = ~( ct0 & i );                           // reset or count ct0
32
  ct1 = ct0 ^ (ct1 & i);                        // reset or count ct1
33
  i &= ct0 & ct1;                               // count until roll over ?
34
  key_state ^= i;                               // then toggle debounced state
35
  key_press |= key_state & i;                   // 0->1: key press detect
36
}
37

38

39
uint8_t get_key_press( uint8_t key_mask )
40
{
41
  key_mask &= key_press;                        // read key(s)
42
  key_press ^= key_mask;                        // clear key(s)
43
  return key_mask;
44
}
45

46
 
47
void ausgabe(uint8_t wert)
48
{
49
  LED_PORT = wert << 5;                         // PD5, 6, 7
50
  LED_DDR = 1<<LED1 | 1<<LED2 | 1<<LED3;
51
}
52

53

54
int main(void) 
55
{
56
  uint8_t count = 0;
57

58
  for(;;){
59
     _delay_ms( 10 );                           // debounce time
60
     debounce();
61

62
     if( get_key_press( 1<<TASTER1 ))
63
       count++;
64
     if( get_key_press( 1<<TASTER2 ))
65
       count--;
66
     ausgabe( count );
67
  }
68
}


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren