Forum: Mikrocontroller und Digitale Elektronik 8*4 Eingangsmatrix


von Anfäner (Gast)


Lesenswert?

Hallo
bin noch ein blutiger Anfänger in sachen µC ich programiere in Bascom da 
ich Basic schon ein wenig von der Schule kenne.
Meine Frage ich würde gerne eine Eingangsmatix schreiben für 32 Taster 
wäre das so OK:


' µC Deklarationen
$regfile = "m32def.dat"                                     ' 
ATMega32-Deklarationen
'$framesize = 32
'$swstack = 32
'$hwstack = 32                                               '
$crystal = 4000000                                          '4MHZ Quartz



' Variablen
Dim Kanal As Byte                                           'welcher 
Kanal soll bearbeitet werden
Dim S1 As Bit                                               'Schalter 
Variable
Dim S2 As Bit
Dim S3 As Bit
Dim S4 As Bit
Dim S5 As Bit
Dim S6 As Bit
Dim S7 As Bit
Dim S8 As Bit
Dim S9 As Bit
Dim S10 As Bit
Dim S11 As Bit
Dim S12 As Bit
Dim S13 As Bit
Dim S14 As Bit
Dim S15 As Bit
Dim S16 As Bit
Dim S17 As Bit
Dim S18 As Bit
Dim S19 As Bit
Dim S20 As Bit
Dim S21 As Bit
Dim S22 As Bit
Dim S23 As Bit
Dim S24 As Bit
Dim S25 As Bit
Dim S26 As Bit
Dim S27 As Bit
Dim S28 As Bit
Dim S29 As Bit
Dim S30 As Bit
Dim S31 As Bit
Dim S32 As Bit

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , 
Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2       'Config LCD
Config Lcd = 16 * 2                                         'configure 
lcd screen


' Ein-/Ausgänge
Ddra = &B1111110                                            '1 Ausgang, 
0 Eingang
Porta = &B0000000                                           '1 = PullUp 
aktiviert Eingang (Taster gegen Masse)
Config Portb = Output
Config Portc = Input                                        'Port B als 
Ausgang
                                                              'Port C 
als Eingang

'Eingänge
'Temp_mess Alias Porta.7                                     'Analog 
Eingang für Temperatur

Matrix_1 Alias Portc.0
Matrix_2 Alias Portc.1
Matrix_3 Alias Portc.2
Matrix_4 Alias Portc.3
Matrix_5 Alias Portc.4
Matrix_6 Alias Portc.5
Matrix_7 Alias Portc.6
Matrix_8 Alias Portc.7


'Ausgänge:
Matrix_a Alias Porta.0
Matrix_b Alias Porta.1
Matrix_c Alias Porta.2
Matrix_d Alias Porta.3
Leinwand_ab Alias Porta.4
Leinwand_stop Alias Porta.5
Leinwand_auf Alias Porta.6


Steckdose_1 Alias Portb.0
Steckdose_2 Alias Portb.1
Steckdose_3 Alias Portb.2
Steckdose_4 Alias Portb.3
Steckdose_5 Alias Portb.4
Steckdose_6 Alias Portb.5
Steckdose_7 Alias Portb.6
Steckdose_8 Alias Portb.7



' Timer0 für Multiplexeingabe
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+++On  Timer0 Matrix             'Interrupt-Routine für Timer0-Overflow
Config Timer0 = Timer , Prescale = 64
Enable Time                  'Timer0-Overflow-Interrupt einschalten
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+++



Cls

Locate 1 , 1 : Lcd "Starte..."
Locate 2 , 1 : Lcd "Bitte warten..."
Waitms 2000

Cls

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++
' Hauptprogramm
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++


Do                                                  'Start Hauptschleife

Locate 1 , 1 : Lcd "Test Line1"
Locate 2 , 1 : Lcd "Test Line2"

Cls

If S1 = 1 Then Toggle Steckdose_1
If S2 = 1 Then Toggle Steckdose_2
If S3 = 1 Then Toggle Steckdose_3
If S4 = 1 Then Toggle Steckdose_4
If S5 = 1 Then Toggle Steckdose_5
If S6 = 1 Then Toggle Steckdose_6
If S7 = 1 Then Toggle Steckdose_7
If S8 = 1 Then Toggle Steckdose_8

If S9 = 1 Then Toggle Leinwand_ab
If S10 = 1 Then Toggle Leinwand_stop
If S11 = 1 Then Toggle Leinwand_auf

Loop                                                        'Ende 
Hauptschleife


End                                                         'Programm 
Ende



Matrix:

If Kanal = 4 Then Kanal = 0   'bestimmt die Zeile (0 bis 3)
Incr Kanal


Select Case Kanal     'welche Zeile soll angesteuert werden
   Case 0 : Matrix_a = 1                             '1.Zeile 7 Kanäle
             Matrix_b = 0
             Matrix_c = 0
             Matrix_d = 0

   Case 1 : Matrix_a = 0                             '2.Zeile 7 Kanäle
             Matrix_b = 1
             Matrix_c = 0
             Matrix_d = 0

   Case 2 : Matrix_a = 0                             '3.Zeile 7 Kanäle
             Matrix_b = 0
             Matrix_c = 1
             Matrix_d = 0

   Case 3 : Matrix_a = 0                             '4.Zeile 7 Kanäle
             Matrix_b = 0
             Matrix_c = 0
             Matrix_d = 1
End Select

Select Case Kanal
   Case 0:
      If Matrix_1 = 1 Then S1 = 1
      If Matrix_2 = 1 Then S2 = 1
      If Matrix_3 = 1 Then S3 = 1
      If Matrix_4 = 1 Then S4 = 1
      If Matrix_5 = 1 Then S5 = 1
      If Matrix_6 = 1 Then S6 = 1
      If Matrix_7 = 1 Then S7 = 1
      If Matrix_8 = 1 Then S8 = 1


   Case 1:
      If Matrix_1 = 1 Then S9 = 1
      If Matrix_2 = 1 Then S10 = 1
      If Matrix_3 = 1 Then S11 = 1
      If Matrix_4 = 1 Then S12 = 1
      If Matrix_5 = 1 Then S13 = 1
      If Matrix_6 = 1 Then S14 = 1
      If Matrix_7 = 1 Then S15 = 1
      If Matrix_8 = 1 Then S16 = 1


   Case 2:
      If Matrix_1 = 1 Then S17 = 1
      If Matrix_2 = 1 Then S18 = 1
      If Matrix_3 = 1 Then S19 = 1
      If Matrix_4 = 1 Then S20 = 1
      If Matrix_5 = 1 Then S21 = 1
      If Matrix_6 = 1 Then S22 = 1
      If Matrix_7 = 1 Then S23 = 1
      If Matrix_8 = 1 Then S24 = 1


   Case 3:
      If Matrix_1 = 1 Then S25 = 1
      If Matrix_2 = 1 Then S26 = 1
      If Matrix_3 = 1 Then S27 = 1
      If Matrix_4 = 1 Then S28 = 1
      If Matrix_5 = 1 Then S29 = 1
      If Matrix_6 = 1 Then S30 = 1
      If Matrix_7 = 1 Then S31 = 1
      If Matrix_8 = 1 Then S32 = 1

End Select

Return

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+++



Die Schaltung sied so aus:

        1     2     3     4     5     6     7     8    <- PortC
        |     |     |     |     |     |     |     |
a-------|-----|-----|-----|-----|-----|-----|-----|
        |     |     |     |     |     |     |     |
b-------|-----|-----|-----|-----|-----|-----|-----|
        |     |     |     |     |     |     |     |
c-------|-----|-----|-----|-----|-----|-----|-----|
        |     |     |     |     |     |     |     |
d-------|-----|-----|-----|-----|-----|-----|-----|
        |     |     |     |     |     |     |     |
^
|
PortA

Meine Frage ist ob das so funktioniert oder ob ich eher eine Lösung per 
I²C -Bus machen soll? Nur leider finde ich kein Tutorium in Bascom für 
eine Porterweiterung?
Vielen Dank schonmal;-)

lg.Michael

von Holger (Gast)


Lesenswert?

Hallo Michael,

du solltest auf Dioden an den 4 Leitungen von Port A legen (es gibt 
einen Kurzschluss wenn zwei Tasten gleichzeitig gedrückt sind.

Du kannst alternativ auch nur den aktiven Eingang der A-Leitungen auf 
Ausgang schalten und die anderen  als Eingang (mit PullUp) 
konfigurieren.

Ausserdem solltest du die Polarität ändern. D.h. alle Leitungen von A=1, 
nur die aktive auf 0. Am C-Port müssen dann die Pull-Ups aktiviert 
werden. Nur so kannst Du auf externe Widerstände verzichten. Ein offener 
Eingang liefert nicht zuverlässig 0! (Natürlich muss dann auch in der 
Auswertung die Polarität gedreht werden).

Holger

von Hannes L. (hannes)


Lesenswert?

Ich hätte den Tasten eine Widerstandskette und Konstantstromquelle 
spendiert und sie mit dem ADC eingelesen.

...

von juppi (Gast)


Lesenswert?

würdest du das mit 32 Tasten machen?

ADC Tastendekodierung habe ich immer nur bis 16 Tasten gemacht?

Gruß

von Hannes L. (hannes)


Lesenswert?

juppi schrieb:
> würdest du das mit 32 Tasten machen?

Ich denke mal ja. Einen Versuch wäre es wert.

>
> ADC Tastendekodierung habe ich immer nur bis 16 Tasten gemacht?

Ich auch, aber ohne Einsatz einer Konstantstromquelle (PNP, R, LED) und 
ich hatte trotzdem ausreichend Reserve. Mit einer Konstantstromquelle 
auf die eine Seite aller Taster, der Widerstandskette auf der anderen 
Seite der Taster gegen GND und dem offenen Ende der Kette am ADC 
(interne Referenz) sollte ein halbwegs linearer Verlauf möglich sein, 
der die Auswertung vereinfacht. Bei unbetätigten Tasten fließt auch kein 
Querstrom. Bei mehreren gleichzeitig betätigten Tasten "gewinnt" die, 
die näher an Masse liegt.

Es ist aber auch kein Akt, zwei ADC-Kanäle dafür zu benutzen.

>
> Gruß

...

von Peter D. (peda)


Lesenswert?

Anfäner schrieb:
> bin noch ein blutiger Anfänger

Auch Anfänger dürfen die Postingregeln lesen.
Also Dateianhang benutzen!

Quelltext wird auch überhaupt nicht lesbarer, wenn man 100 Leerzeilen 
einfügt.

In der Codesammlung habe ich ein Matrixbeispiel in C, ist aber 
warscheinlich nichts für Anfänger:

Beitrag "Tasten-Matrix entprellen"


Peter

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.