Die Aufgabe der Software ist das beschriebene Protokoll (Abschnitt 3. Ansteuerung des MAX7219) umzusetzen.
Register:
Für die Realisierung des Softwareprotokolls werden neben einigen PIC internen Registern
(SFR, Spezielle Funktions-Register) noch zwei Übergaberegister (TEMP1 und
TEMP2) für den Aufruf von Unterprogrammen und ein Hilfsregister
(TEMP3) benötigt. Diese drei Register (TEMP1 bis
TEMP3) sind so genannte temporäre Register. D.h. Sie
werden nur kurzzeitig verwendet und können daher auch in beliebigen anderen
Unterprogrammen verwendet werden.
Portdefinition:
Im Allgemeinen wird bei jeder Anwendung der MAX7219 an anderen Portpins angeschlossen.
Damit dies in der Software nur an einer Stelle berücksichtigt werden muss befindet sich in der
Software eine Portdefinition für den MAX7219. Dieser besteht aus den folgenden 5 Parametern:
Eine mögliche Portdefinition für einen PIC-Mikrocontroller aus der PIC16Fxx-Familie ist:
MAX7219PORT equ PORTB MAX7219TRIS equ TRISB MAX7219DIN equ 5 MAX7219CLK equ 4 MAX7219LOAD equ 2
Bei Verwendung eines PIC-Mikrocontrollers aus der PIC12Fxx-Familie lautet diese Portdefinition wie folgt:
MAX7219PORT equ GPIO MAX7219TRIS equ TRISIO MAX7219DIN equ 5 MAX7219CLK equ 4 MAX7219LOAD equ 2
Dieses Unterprogramm dient zur Initialisierung des Mikrocontrollers. Bei diesem Beispiel ist nur die Umschaltung der Comparatoreingänge auf digitale Ein- oder Ausgänge und die Definition der verwendeten Portpins (für die Ansteuerung des MAX7219) als Ausgang notwendig.
Der folgende Programmausschnitt zeigt eine mögliche Initialisierungsroutine für den PIC12F629.
INIT clrf GPIO movlw 0x07 ;Alle Comparatoreingaenge movwf CMCON ; auf digital I/O umschalten bsf STAT,RP0 ;Registerseite 1 clrf TRISIO ;Port als Ausgang definieren bcf STAT,RP0 ;Registerseite 0 clrf GPIO ;Port loeschen return
Zur Ansteuerung des MAX7219 sind 2 Unterprogramme notwendig:
Nun aber zu den einzelnen Unterprogrammen im Detail:
Aufgabe:
MAX7219 initialisieren
Vorgehensweise:
Übergibt nacheinander die Befehle zur Initialisierung an den MAX7219:
Z.B.
Hier das Unterprogramm:
MAX7219_INIT ; Addresse 0B movlw 0x0b ;Adresse 0bh in Register TEMP1 kopieren movwf TEMP1 movlw 0x04 ;Wert 04h in Register TEMP2 kopieren movwf TEMP2 call MAX7219_KOMMANDO ;Adresse und Wert an den MAX7219 uebergeben ; Addresse 0C movlw 0x0c ;Adresse 0ch in Register TEMP1 kopieren movwf TEMP1 movlw 0x01 ;Wert 01h in Register TEMP2 kopieren movwf TEMP2 call MAX7219_KOMMANDO ;Adresse und Wert an den MAX7219 uebergeben ; Addresse 09 movlw 0x09 ;Adresse 09h in Register TEMP1 kopieren movwf TEMP1 movlw 0x00 ;Wert 00h in Register TEMP2 kopieren movwf TEMP2 call MAX7219_KOMMANDO ;Adresse und Wert an den MAX7219 uebergeben ; Addresse 0A movlw 0x0a ;Adresse 0ah in Register TEMP1 kopieren movwf TEMP1 movlw 0x0f ;Wert 0fh in Register TEMP2 kopieren movwf TEMP2 call MAX7219_KOMMANDO ;Adresse und Wert an den MAX7219 uebergeben return
Anmerkung:
Die Werte (Daten) der einzelnen Register hängen von der jeweiligen Anwendung ab. Im
Demonstrationsbeispiel 1 (Abschnitt 5)
wird zum Beispiel das Scan Limit (Register 0Bh) mit 04h geladen, während es im
Demonstrationsbeispiel 2 (Abschnitt 6)
mit 05h geladen wird.
Aufgabe:
Dieses Unterprogramm sendet ein Kommando an den MAX7219. (gemäß Bild 3.2.) Ein
Kommando besteht dabei aus acht Adressbits (A7 - A0; befinden sich im
Übergaberegister TEMP1) und aus acht Datenbits (D7 - D0; befinden sich
Übergaberegister TEMP2):
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ MSB LSB
Vorgehensweise:
Übergabeparameter:
Hier das Unterprogramm:
MAX7219_KOMMANDO ;Schritt 1: Steuerleitung LOAD loeschen bcf MAX7219PORT,MAX7219LOAD ;Steuerleitung LOAD loeschen ;Schritt 2: Die Adresse (TEMP1) an den MAX7219 senden movlw .8 ;Schleifenzaehler (TEMP3) mit dem Wert 8 movwf TEMP3 ; laden MAX7219_SCHL1 rlf TEMP1,f ;Alle Bits im Uebergaberegister TEMP1 auf ; die naechst hoehere Stelle schieben btfss STAT,C ;ist das soeben ins Carry geschobene Bit ; 1? goto MAX7219_WEITER1 bsf MAX7219PORT,MAX7219DIN ;ja: Datenleitung DIN = 1 goto MAX7219_WEITER2 MAX7219_WEITER1 bcf MAX7219PORT,MAX7219DIN ;nein: Datenleitung DIN = 0 MAX7219_WEITER2 bsf MAX7219PORT,MAX7219CLK ;Takt (positive und negative bcf MAX7219PORT,MAX7219CLK ; Flanke) erzeugen decfsz TEMP3,f ;Diesen Vorgang 8mal durchfuehren goto MAX7219_SCHL1 ;Schritt 3: Data (TEMP2) auf die gleiche Weise wie die ; Adresse (TEMP1) an den MAX7219 senden movlw .8 ;Schleifenzaehler (TEMP3) mit dem Wert 8 movwf TEMP3 ; laden MAX7219_SCHL2 rlf TEMP2,f ;Bits im Uebergaberegister TEMP2 auf die ; naechst hoehere Stelle schieben btfss STAT,C ;ist das soeben ins Carry geschobene Bit 1? goto MAX7219_WEITER3 bsf MAX7219PORT,MAX7219DIN ;ja: Datenleitung DIN = 1 goto MAX7219_WEITER4 MAX7219_WEITER3 bcf MAX7219PORT,MAX7219DIN ;nein: Datenleitung DIN = 0 MAX7219_WEITER4 bsf MAX7219PORT,MAX7219CLK ;Takt (positive und negative bcf MAX7219PORT,MAX7219CLK ; Flanke) erzeugen decfsz TEMP3,f ;Diesen Vorgang 8mal durchfuehren goto MAX7219_SCHL2 ;Schritt 4: Die Steuerleitung LOAD wieder setzen, und eine ; positive Taktflanke erzeugen bsf MAX7219PORT,MAX7219LOAD ;Steuerleitung LOAD wieder bsf MAX7219PORT,MAX7219CLK ; setzen und eine positive ; Taktflanke erzeugen return
Anmerkungen: