4x4 Matrix Tastertur mit LED

Begonnen von ^Cobra, 27.02.2024, 06:42:42 CET

Vorheriges Thema - Nächstes Thema

^Cobra

Ich wollte "mal eben" eine 4x4 Matrix in Betrieb nehmen.
Diese neinhaltet 16 Taster sowie 16 LEDs.
Ingesamt gibt es 16 Anschlusspins womit also Eingangs Matrix von Ausgangsmatix getennt ist.
Ich habe nun die Anschöüsse zusammen gelegt sodass es eine Matrix mit 8 Anschlüssen gibt.
Zum ansteuern der LEDs:
Reihe1 =>RB1... Spalte1 => RB4... Spalte4 => RB7
Die LEDs sind so angeordnet das der Stromfluss von Reihe nach Spalte erfolgen muss.
Es werden alle Anschlüsse als Ausgänge difniert,alle Ausgänge auf 1 gesetzt und nun die erste Spalte
auf 0V geschaltet und die Reihen entsprechend des LEDs zustandes geschaltet. wenn alle spalten durch sind gehts
von vone los.

Wo ich  vor vielen Jahren das mal in Betrieb genommen hatte, hatte ich Probleme das die LEDs,welche NICHT 
angesteuert werden sollen, leicht und schwach am leuchten waren. Daraufhin habe ich mit Transistoren mir
abhilfe geschafft indem dann die gesamte LED Matix abgeschaltet wurde. Ich ging nun davon aus das es damals an
die 5V Versorgung lag und es mit 3V welche jetzt anliegen funktioniert. Leider nein,leider garnicht. Auch mit 1,8V für 
die Matrix leuchten auch LEDs die nicht leuchtetn sollten.

Will nicht verlangen das ihr mein Code durchgeht, aber falls danach gefragt wird hier wärere er:

#include GeneralConfigs.inc

    ;Baustein für eine LEDmatrix 4x4
    ;Polung Reihe-> Spalte
    ;2 Register enthalten den Sollzustand der LEDs
    ; LEDMatrixL => 1-8 || LEDMatrixH 9-16
    ;Über Timer0 werden die LEDs nacheinaner durchgeschaltet und
    ;der Zustand angezeigt
    
;		Spalten1-4
    ;Reihe1 RB0	1--2--3--4	
    ;Reihe2 RB1	5--6--7--8
    ;Reihe3 RB2	9--10-11-12
    ;Reihe4 RB3	13-14-15-16
    ;		RB4	 RB7
    
    ;LEDMatrixL	0 0 0 0|0 0 0 0
;		| | | | | | | |
; LED14		+ | | | | | | |
; LED10		  + | | | | | |
; LED6		    + | | | | |
; LED2 		      + | | | |
; LED13		        + | | |
; LED9		          + | |
; LED5		            + |
; LED1		              +

    ;LEDMatrixH	0 0 0 0|0 0 0 0
;		| | | | | | | |
; LED16		+ | | | | | | |
; LED12		  + | | | | | |
; LED8		    + | | | | |
; LED4 		      + | | | |
; LED15		        + | | |
; LED11		          + | |
; LED7		            + |
; LED3		              +  
    
    #Define LEDPort  LATB
    #Define LEDTris  TRISB
    #Define Reihe1   RB0   
    #Define Reihe2   RB1   
    #Define Reihe3   RB2   
    #Define Reihe4   RB3   
    #Define Spalte1  RB4   
    #Define Spalte2  RB5   
    #Define Spalte3  RB6   
    #Define Spalte4  RB7    
    
;#Define LED1    LEDMatrixL,0
;#Define LED2    LEDMatrixL,4
;#Define LED3    LEDMatrixH,0
;#Define LED4    LEDMatrixH,4
;#Define LED5    LEDMatrixL,1
;#Define LED6    LEDMatrixL,5
;#Define LED7    LEDMatrixH,1
;#Define LED8    LEDMatrixH,5
;#Define LED9    LEDMatrixL,2
;#Define LED10   LEDMatrixL,6
;#Define LED11   LEDMatrixH,2
;#Define LED12   LEDMatrixH,6
;#Define LED13   LEDMatrixL,3
;#Define LED14   LEDMatrixL,7
;#Define LED15   LEDMatrixH,3
;#Define LED16   LEDMatrixH,7
   
    EXTERN Temp0,Temp1,Temp2,Temp3  
    GLOBAL  LEDMatrixL,LEDMatrixH,LEDMatrixAnzeigen

		UDATA
LEDMatrixL	Res 1
LEDMatrixH	Res 1
ActSpalte	Res 1 ;Welche Spalte als nächsten angezeigt wird	
    CODE                      ; let linker place main program

    
LEDMatrixAnzeigen   
  MOVLW   B'11111111'
  MOVWF   LEDTris	    ; Alles Output
  MOVWF   LEDPort	    ; Alle Ausgänge 1  
  movlw	D'3'
  movwf PCLATH
  MOVF	ActSpalte,W  
  rlncf   WREG, W 
  ADDWF PCL,F
  Incf ActSpalte,f 
  BRA Spalte1Anzeigen	
  BRA Spalte2Anzeigen
  BRA Spalte3Anzeigen
  BRA Spalte4Anzeigen
  CLRF ActSpalte	
  BSF LEDPort,Spalte4   
  Incf   ActSpalte,f
  
Spalte1Anzeigen    
    MOVLW B'11110000'	    
    IORWF LEDMatrixL,W	    ;Reihe Laden
    MOVWF LEDPort	    ;
    BCF	LEDPort,Spalte1	  
    Incf   ActSpalte,f	;spalte1 (RB4) als erste aktiv
    return 
    
Spalte2Anzeigen 
    BSF	LEDPort,Spalte1	   
    SWAPF LEDMatrixL,W
    IORLW B'11110000'	    
    MOVWF LEDPort
    BCF	LEDPort,Spalte2	  
    Incf   ActSpalte,f	;spalte1 (RB4) als erste aktiv
    return
 
Spalte3Anzeigen    
    BCF	LEDPort,Spalte2
    MOVLW B'11110000'	    
    IORWF LEDMatrixH,W	    ;Reihe Laden
    MOVWF LEDPort	    ;
    BCF	LEDPort,Spalte3	  
    Incf   ActSpalte,f	;spalte1 (RB4) als erste aktiv
    return 
    
Spalte4Anzeigen 
    BSF	LEDPort,Spalte3	
    SWAPF LEDMatrixH,W
    IORLW B'11110000'
    MOVWF LEDPort
    BCF	LEDPort,Spalte4	  
    Incf   ActSpalte,f	;spalte1 (RB4) als erste aktiv
    return  
    
    END

Als nächstes Wollte ich dann die Tasten ebenfalls Testen. Im Grunde läuft es ja ähnlich ab,
die Spalten werden auf Eingang geschaltet, die pull Ups eingeschaltet, die aktive Reihe wird auf V gesetzt.
Bei Tastendruck wird die entsprechende Reihe auf Low gezogen und somit die Taste ermitteltn.
Im Grunde funktioniert es scheinbar auch, allerdings wollen die 2 letzten Pullups nicht einschalten bzw. der PORTB,6
und PORTB,7 sind immer low und somit  wird da immer taste gedrückt gemeldet.
#include GeneralConfigs.inc

    ;Baustein für das Abfragen einer Tasterturmatrix 4x4
    ;Enthält auch eine LED Matix, Polung Reihe-> Spalte
    ;Pullups aktiv bei Spalten
    ;es 
;		Spalten1-4
    ;Reihe1	1--2--3--4	
    ;Reihe2	5--6--7--8
    ;Reihe3	9--10-11-12
    ;Reihe4	13-14-15-16
		
    #Define Reihe1   PORTB,RA0   
    #Define Reihe2   PORTB,RA1   
    #Define Reihe3   PORTB,RA2   
    #Define Reihe4   PORTB,RA3   
    #Define Spalte1  PORTB,RA4   
    #Define Spalte2  PORTB,RA5   
    #Define Spalte3  PORTB,RA6   
    #Define Spalte4  PORTB,RA7
 
 EXTERN Temp0,Temp1   
 GLOBAL MatrixTastenInit,MatrixTastenAbfrage
 CODE                      ; let linker place main program

;Inizalisieren
MatrixTastenInit
    bcf	INTCON2,RBPU ;Puppups einschalten
    movlw B'11110000'  ;alle einschalten die mit Spalte verbunden sind
    movwf WPUB
    movlw B'00001111'	;Spalten Eingang, Reihen Ausgang
    movwf TRISB
    movlw B'00001111'	;Ausgange alle setzen
    movwf LATB
    return
    
;Matrix Tasten abfragen ob Taste gedrückt wurde
;Es wird Reihenweise abgefragt ob eine Taste gedrückt wurde   
MatrixTastenAbfrage   
  CLRF Temp0	;Temp0 als Speicher für gedrückte Taste
  movlw D'4'	;4x4 Matrix
  movwf Temp1;
  BCF	LATB,0	;Reihe 1 Abschalten
TasteSuchen
  
    btfss   Spalte1
    goto    TasteGefunden
    incf    Temp0,f
    btfss   Spalte2
    goto    TasteGefunden
    incf    Temp0,f
    btfss   Spalte3
    goto    TasteGefunden
    incf    Temp0,f
    btfss   Spalte4
    goto    TasteGefunden
    incf    Temp0,f   
    RLNCF   LATB,f      ; nächte Zeile
    decfsz  Temp1,f
    goto    TasteSuchen           ; alle 4 Zeilen testen  
 
TasteGefunden
    movf Temp0,w
    return  ;Ergebnis steht in W
    END

Im Datenblatt habe ich nur gefunden das diese beiden Pinne auch PGD und PGC sind, also die Schnittstelle zum Programmieren, ansonsten konnte ich kein Grund finden warum das nicht geht. Auch in der Simulation funktioniert es. Da die LEDs richtig schalten (außer mit dem glimmen der anderen) schließe ich eig. ein HW defekt aus. Auch wurde ein neuer Controller schonmal benutzt. (Gleicher Typ 18F44K20).
Eine Idee woran das liegt? Oder eventuell eine alternative der Ansteuerung der Matrix? Ich würde schon gern alles an 1 Port betreiben wollen...

Danke fürs mit grübeln.
Cobra

Ottmar

Ist vielleicht von Dir schon zB mit dem Oszi geprüft:
Wilde Schwingungen im HF-Bereich auf den Pins?

^Cobra

Schwingungen die ein LOW Signal also den pin auf 0V ziehn?
Ich kam noch nicht dazu Messinstrumente dran zu machen. Kommt jetzt als nächstes wenn ich zuhause bin. Bin grade Beruflich mal wieder unterwegs...

vloki

Zitat von: ^Cobra in 27.02.2024, 06:42:42 CETIm Datenblatt habe ich nur gefunden das diese beiden Pinne auch PGD und PGC sind, also die Schnittstelle zum Programmieren...
Ja, das Programmier/Debug-Tool musst du natürlich entfernen, damit die PGx Pins normal reagieren.
Like Like x 1 View List
MPLABX  XC8  KiCAD

^Cobra

Also debuggt habe ich nicht, weiß aber grade nicht ob ich mein pickit3 raus genommen habe. Werde ich auf jedenfall versuchen. Danke 

^Cobra

#5
Zitat von: vloki in 28.02.2024, 10:01:18 CET
Zitat von: ^Cobra in 27.02.2024, 06:42:42 CETIm Datenblatt habe ich nur gefunden das diese beiden Pinne auch PGD und PGC sind, also die Schnittstelle zum Programmieren...
Ja, das Programmier/Debug-Tool musst du natürlich entfernen, damit die PGx Pins normal reagieren.
das war wohl der Hauptgrund, danke fürs mit denken. Ich habe scheinbar echt Pickit immer drin gelassen.
Ohne PicKit lief es dann zu 90%. Denn: Die LED anzeige welche mir Binär die gedrückte Taste anzeigte, zeigte einige Tasten Falsch.
Wild am Programm am suchen, habe ich mir dann meine... puh äh sehr alte LED Platine in Fädeltechnik mal angeschaut. Da haben sich doch echt 3 gelöst,
2 davon haben ein Fackelkontakt gehabt, daher wurde mal die richtige Taste angezeigt und mal nicht und einer wär ganz ab.
Nun geht es und das eigendliche wird nun vorran getrieben: Die Steuerung der Servos mittels Tastenfeld. Muss mir da noch überlegen wie ich das ganze (erstmal) Aufbaue.

P.S. das Problemchen mit den LEDs bleibt allerdings. Ist nicht tragisch, wüsste aber gern woher das kommt und wie mans weg kriegen würde...

Danke und Gruß
Cobra

Schnellantwort

Name:
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau

Similar topics (5)