Probleme mit Tastenabfrage ATMEGA8 Pollin Board

#3248900
Lesenswert?

Hallo und guten Morgen,

Ich versuche gerade an PortB 6 Taster anzuschliessen doch leider wollen 
nur 4 Taster laufen und sie haben eine Verschiebung drin.

Nutze einen Mega8 auf dem Pollin Board inkl. Erweiterungsboard.

Angeschlossen sind nur die 6 Taster und gebe die Infos an der UART raus.
Der MEGA8 läuft mit 8Mhz.

Zur ansteuerung der UART nutze ich die Lib von Peter Fleury
Die Debounce kommt von Peter D.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <avr/interrupt.h>
4
//#include <lcd-routines.h>
5
#include "uart.h"
6

7

8
#define UART_BAUD_RATE      19200
9

10
// Defines der einzelnen Ports
11
// Buttons defines
12
#define BTN_PORT    PORTB
13
#define BTN_DDR      DDRB
14
#define BTN_SECOND_UP  PB5
15
#define BTN_SECOND_DOWN  PB4
16
#define BTN_MINUTE_UP  PB3
17
#define BTN_MINUTE_DOWN PB2
18
#define BTN_START    PB1
19
#define BTN_STOP    PB0
20
// Summer und Relais
21
#define OUT_POPRT    PORTD
22
#define OUT_DDR      DDRD
23
#define OUT_SUMMER1    PD5
24
#define OUT_SUMMER2    PD6
25
#define OUT_RELAIS    PD7
26
#define TEST_BLINC    PD6
27
#define TEST_POWER    PD5
28
#define TEST_SWITCH_LED  PD4
29
#define TEST_BTN    PD3
30
#define TEST_BTN2    PD2
31
#define TEST_LED2    PD1
32

33
#define debounce( port, pin )                          \
34
({                                        \
35
  static uint8_t flag = 0;      /* new variable on every macro usage */  \
36
  uint8_t i = 0;                                \
37
                                        \
38
  if( flag ){              /* check for key release: */      \
39
    for(;;){            /* loop ... */              \
40
      if( !(port & 1<<pin) ){    /* ... until key pressed or ... */    \
41
        i = 0;          /* 0 = bounce */            \
42
        break;                              \
43
      }                                  \
44
      _delay_us( 98 );      /* * 256 = 25ms */            \
45
      if( --i == 0 ){        /* ... until key >25ms released */    \
46
        flag = 0;        /* clear press flag */          \
47
        i = 0;          /* 0 = key release debounced */      \
48
        break;                              \
49
      }                                  \
50
    }                                    \
51
    }else{              /* else check for key press: */      \
52
    for(;;){            /* loop ... */              \
53
      if( (port & 1<<pin) ){    /* ... until key released or ... */    \
54
        i = 0;          /* 0 = bounce */            \
55
        break;                              \
56
      }                                  \
57
      _delay_us( 98 );      /* * 256 = 25ms */            \
58
      if( --i == 0 ){        /* ... until key >25ms pressed */    \
59
        flag = 1;        /* set press flag */          \
60
        i = 1;          /* 1 = key press debounced */      \
61
        break;                              \
62
      }                                  \
63
    }                                    \
64
  }                                      \
65
  i;        /* return value of Macro */                  \
66
})
67

68
ISR(TIMER0_OVF_vect)
69
{
70
  TCNT0 = 00;
71
  OUT_POPRT ^= (1 << TEST_BLINC);       
72
}
73

74
ISR(TIMER1_COMPA_vect)
75
{
76
  //Auflösung 1 Sekunde
77
  TCNT1 = 0;
78
  OUT_POPRT ^= (1 << OUT_RELAIS);  
79
}
80

81
void init(void)
82
{
83
    TIMSK |= (1<<TOIE0);
84
    TCCR0 |= (1<<CS02) |  (1<<CS00);   
85
    TCNT0 = 00;  
86
  
87
  //TCCR1B = (1 << WGM12) | (1 << CS12);
88
  //OCR1A = 62500;
89
  
90
  //TIMSK = (1 << OCIE1A) | (1 << TOIE0);
91
  TIMSK = (1 << TOIE0);
92
  
93
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
94
  uart_puts("Starting\r\n");  
95
}
96

97
int main(void)
98
{
99
  init();
100
  sei();
101
  
102
  OUT_DDR |= ((1 << OUT_RELAIS) | (1 << TEST_BLINC) | (1 << TEST_POWER)  | (1 << TEST_SWITCH_LED)  | (1 << TEST_LED2));
103
  OUT_DDR |= ((1 << OUT_RELAIS) | (1 << TEST_BLINC) | (1 << TEST_POWER)  | (1 << TEST_SWITCH_LED));
104
  //OUT_DDR &= ~((1 << TEST_BTN) | (1 << TEST_BTN2));
105
  //PORTD |= ((1 << TEST_BTN) | (1 << TEST_BTN2));
106
  
107
  BTN_DDR &= ~((1 << BTN_START) | (1 << BTN_STOP) | (1 << BTN_SECOND_UP) | (1 << BTN_SECOND_DOWN) | (1 << BTN_MINUTE_UP) | (1 << BTN_MINUTE_DOWN));
108
  BTN_PORT |= ((1 << BTN_START) | (1 << BTN_STOP) | (1 << BTN_SECOND_UP) | (1 << BTN_SECOND_DOWN) | (1 << BTN_MINUTE_UP) | (1 << BTN_MINUTE_DOWN));
109
  
110
  PORTD |= ((1 << TEST_POWER));
111
  
112
    while(1)
113
    {
114
    if (debounce(PINB, BTN_MINUTE_DOWN))
115
    {
116
      uart_puts("MIN_DOWN\r\n");
117
    }
118
    
119
    if (debounce(PINB, BTN_MINUTE_UP))
120
    {
121
      uart_puts("MIN_UP\r\n");
122
    }
123
    
124
    if (debounce(PINB, BTN_SECOND_DOWN))
125
    {
126
      uart_puts("SECOND_DOWN\r\n");
127
    }
128
    
129
    if (debounce(PINB, BTN_SECOND_UP))
130
    {
131
      uart_puts("SECOND_UP\r\n");
132
    }    
133
    
134
    if (debounce(PINB, BTN_START))
135
    {
136
      uart_puts("START\r\n");
137
    }
138
    
139
    if (debounce(PINB, BTN_STOP))
140
    {
141
      uart_puts("STOP\r\n");
142
    }
143
        
144
    }
145
}

Tastendruck enspricht aber links gedrückter Port, rechts die Ausgabe:
PB5 = MIN_UP(PB3)
PB4 = MIN_DOWN(PB2)
PB3 = START(PB1)
PB2 = STOP(PB0)
PB1 und PB0 sind ohne Funktion

Benutze externe Taster an dem Pollin Board gegen Masse geschaltet mit 
internem Pullup.
Der RS232 ISP ist nicht bestückt. Gejupmert ist nur die AURT sonst sind 
alle Jumper entfernt worden.

Könnte mir jemand helfen den Fehler zu lokalisieren? Habe ich in dem 
Source einen Fehler drin oder liegt es ggf. am Board?
#3249042
Lesenswert?

Guten Morgen,

bin gerade mal die Schaltplände durchgegangen und da hab ich es dann 
auch gesehen.
Das ist ja der letzte ... Wer tut so etwas...

Vielen Dank. Ich hätte sonst noch wer weiß wo den Fehler vermutet.

Ich bin hier schon einen ganzen Tag am suchen gewesen. Die Taster 
geprüft den Fehler an anderen Bauteilen gesucht und den Source x mal 
geprüft aber auf die Idee das die Pins nicht 1 zu 1 übernommen sind wäre 
ich nicht gekommen.

Umgebaut habe ich die Taste nicht, das war mir zu "dreckig". Ich habe 
sie ausgelötet und auf einer kleinen Lochraster Platine 8 Taster 
aufgelötet gegen Masse.
#3249280
Lesenswert?

Kleine Frage nebenbei...

Könnte mir jemand sagen wie ich den Doppelpunkt über die UART ausgebe?
Mein Controller stellt wohl seine Funktion ein wenn ich
1
  uart_puts("Starting\r\n");  
2
  uart_puts("Current Time Delay ");
3
  itoa(Minuten, buf, 3);
4
  uart_puts(buf);
5
  uart_puts(" min");
6
  //itoa(Sekunden, buf, 3);
7
  //uart_puts(buf);
8
  //uart_puts(" sec\r\n");
 versuche.
Das " min" wird nicht mehr geschrieben.

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