PIC-Microcontroller

Elektronik u. Mikrocontroller => Mikrocontroller => Thema gestartet von: ^Cobra in 27.02.2024, 06:42:42 CET

Titel: 4x4 Matrix Tastertur mit LED
Beitrag von: ^Cobra in 27.02.2024, 06:42:42 CET
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
Titel: Aw: 4x4 Matrix Tastertur mit LED
Beitrag von: Ottmar in 27.02.2024, 17:05:27 CET
Ist vielleicht von Dir schon zB mit dem Oszi geprüft:
Wilde Schwingungen im HF-Bereich auf den Pins?
Titel: Aw: 4x4 Matrix Tastertur mit LED
Beitrag von: ^Cobra in 28.02.2024, 09:40:34 CET
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...
Titel: Aw: 4x4 Matrix Tastertur mit LED
Beitrag 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.
Titel: Aw: 4x4 Matrix Tastertur mit LED
Beitrag von: ^Cobra in 28.02.2024, 15:09:57 CET
Also debuggt habe ich nicht, weiß aber grade nicht ob ich mein pickit3 raus genommen habe. Werde ich auf jedenfall versuchen. Danke 
Titel: Aw: 4x4 Matrix Tastertur mit LED
Beitrag von: ^Cobra in 29.02.2024, 19:57:55 CET
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