Forum: Mikrocontroller und Digitale Elektronik Probleme mit Tastenabfrage ATMEGA8 Pollin Board


von Daniel S. (cyber)


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?

von Hubert G. (hubertg)


Lesenswert?

Wenn du das Schaltbild des Pollin-Boards betrachtest, dann wirst du 
feststellen das PB6 und PB7 des Mega8-Sockel nur zum Quarz gehen.
Am Erweiterungsboard liegt dann PB0 auf PB3(da dort mit PB1 begonnen 
wird) und so weiter aufsteigend.

Die Tasten hast du umgebaut? Standardmässig schalten sie nach +5V.

von Daniel S. (cyber)


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.

von Hubert G. (hubertg)


Lesenswert?

Ich verwende das Board schnell mal zum testen recht gerne. Die kleinen 
Macken muss man halt akzeptieren.
Der Tastenumbau ist gar nicht so aufwändig, siehe hier:
http://www.schorsch.at/de/technik/mikrokontroller/35-atmel-evaluations-board.html

von Daniel S. (cyber)


Lesenswert?

Naja das war mal schnell zusammen gelötet. Find ich jetzt etwas weniger 
Aufwand als am Board selber rum zu fuchteln.

von Daniel S. (cyber)


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.

von Hubert G. (hubertg)


Lesenswert?

Daniel S. schrieb:
> itoa(Minuten, buf, 3);

Wieso hier die 3? Sollte hier nicht das Zahlensystem sein?

von Bastler (Gast)


Lesenswert?

Die Dezimalzahl 59 hat zur Basis 3 (0..2)  sicher mehr als 3Stellen.
Und buf ist nochmal wie groß?
Statt 3 eine 10 als Basis wählen, dann passen Minuten auch in 2 Zenichen 
(+\0).

von Daniel S. (cyber)


Lesenswert?

Die 2 wird doch angezeigt es geht um die Zeile da da drunter.

Habe aber den Fehler nun gefunden... Alles in einer Zeile ist scheinbar 
zu lang. Current Time Delay + Minute + Min ist für eine Zeile zu lange. 
Wenn ich das Current weg lasse erscheint auch die min.

von Daniel S. (cyber)


Lesenswert?

OK der Puffer der UART war zu klein.
1
#define UART_RX_BUFFER_SIZE 128
 Nun klappt es. :)

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.