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.