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
Ist vielleicht von Dir schon zB mit dem Oszi geprüft:
Wilde Schwingungen im HF-Bereich auf den Pins?
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...
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.
Also debuggt habe ich nicht, weiß aber grade nicht ob ich mein pickit3 raus genommen habe. Werde ich auf jedenfall versuchen. Danke
Zitat von: vloki in 28.02.2024, 10:01:18 CETZitat 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