5x7-Dot-Matrix-Ansteuerung mit dem MAX7219 (für PIC-Mikrocontroller, Elektronik)


zurück zu Elektronik, Homepage


4. Software (in Assembler)

Die Aufgabe der Software ist das beschriebene Protokoll (Abschnitt 3. Ansteuerung des MAX7219) umzusetzen.

nach oben

4.1. Benötigte Register und Portdefinition

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 
nach oben

4.2. Initialisierung (Unterprogramm INIT)

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 
nach oben

4.3. Unterprogramme für die Ansteuerung des MAX7219

Zur Ansteuerung des MAX7219 sind 2 Unterprogramme notwendig:

Nun aber zu den einzelnen Unterprogrammen im Detail:

nach oben

4.3.1. Unterprogramm MAX7219_INIT

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.

nach oben

4.3.2. Unterprogramm MAX7219_KOMMANDO

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:

nach oben


zurück zu Elektronik, Homepage

Autor: Buchgeher Stefan
Erstellt: 6. April 2006
Letzte Änderung: 25. September 2008