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
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
Ich hätte den Tasten eine Widerstandskette und Konstantstromquelle spendiert und sie mit dem ADC eingelesen. ...
würdest du das mit 32 Tasten machen? ADC Tastendekodierung habe ich immer nur bis 16 Tasten gemacht? Gruß
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ß ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.