Sommario:

Come interfacciare una matrice LED 8x8 guidata MAX7219 con il microcontrollore ATtiny85: 7 passaggi
Come interfacciare una matrice LED 8x8 guidata MAX7219 con il microcontrollore ATtiny85: 7 passaggi

Video: Come interfacciare una matrice LED 8x8 guidata MAX7219 con il microcontrollore ATtiny85: 7 passaggi

Video: Come interfacciare una matrice LED 8x8 guidata MAX7219 con il microcontrollore ATtiny85: 7 passaggi
Video: How to Blink multiple LED using Embedded Learner Board 2024, Luglio
Anonim
Come interfacciare una matrice LED 8x8 guidata MAX7219 con il microcontrollore ATtiny85
Come interfacciare una matrice LED 8x8 guidata MAX7219 con il microcontrollore ATtiny85

Il controller MAX7219 è prodotto da Maxim Integrated è un driver per display a catodo comune di ingresso/uscita seriale compatto che può interfacciare microcontrollori a 64 LED singoli, display LED numerici a 7 segmenti fino a 8 cifre, display con grafici a barre, ecc. Incluso su -chip sono un decodificatore codice BCD-B, circuiti di scansione multiplex, driver per segmenti e cifre e una RAM statica 8×8 che memorizza ogni cifra.

I moduli MAX7219 sono molto comodi da usare con microcontrollori come ATtiny85, o, nel nostro caso, la Tinusaur Board.

Passaggio 1: l'hardware

L'hardware
L'hardware
L'hardware
L'hardware

I moduli MAX7219 di solito hanno questo aspetto. Hanno un bus di ingresso da un lato e un bus di uscita dall'altro. Ciò consente di collegare in cascata 2 o più moduli, ovvero uno dopo l'altro, per creare configurazioni più complicate.

I moduli che stiamo utilizzando sono in grado di collegarsi in catena utilizzando 5 piccoli ponticelli. Vedi l'immagine qui sotto.

Passaggio 2: piedinatura e segnali

Il modulo MAX7219 ha 5 pin:

  • VCC – alimentazione (+)
  • GND – massa (-)
  • DIN – Ingresso dati
  • CS – Selezione chip
  • CLK – Orologio

Ciò significa che abbiamo bisogno di 3 pin sul lato del microcontrollore ATtiny85 per controllare il modulo. Quelli saranno:

  • PB0 – collegato al CLK
  • PB1 – connesso al CS
  • PB2 – collegato al DIN

Questo è sufficiente per collegarsi al modulo MAX7219 e programmarlo.

Passaggio 3: il protocollo

Il Protocollo
Il Protocollo

Comunicare con il MAX7219 è relativamente semplice: utilizza un protocollo sincrono, il che significa che per ogni bit di dati che inviamo c'è un ciclo di clock che indica la presenza di quel bit di dati.

In altre parole, inviamo 2 sequenze parallele ai bit, una per l'orologio e l'altra per i dati. Questo è ciò che fa il software.

Passaggio 4: il software

Il software
Il software

Il modo in cui funziona questo modulo MAX7219 è questo:

  • Scriviamo byte nel suo registro interno.
  • MAX7219 interpreta i dati.
  • MAX7219 controlla i LED nella matrice.

Ciò significa anche che non dobbiamo girare continuamente attraverso la serie di LED per accenderli: il controller MAX7219 si occupa di questo. Potrebbe anche gestire l'intensità dei LED.

Quindi, per utilizzare i moduli MAX7219 in modo conveniente, abbiamo bisogno di una libreria di funzioni per questo scopo.

Innanzitutto, abbiamo bisogno di alcune funzioni di base per scrivere sui registri MAX7219.

  • Scrivere un byte sul MAX7219.
  • Scrivere una parola (2 byte) sul MAX7219.

La funzione che scrive un byte nel controller ha questo aspetto:

void max7219_byte(uint8_t data) { for(uint8_t i = 8; i >= 1; i--) { PORTB &= ~(1 << MAX7219_CLK); // Imposta CLK su LOW if (data & 0x80) // Maschera l'MSB dei dati PORTB |= (1 << MAX7219_DIN); // Imposta DIN su HIGH else PORTB &= ~(1 << MAX7219_DIN); // Imposta DIN su LOW PORTB |= (1 << MAX7219_CLK); // Imposta CLK su dati HIGH <<= 1; // Sposta a sinistra } }

Ora che possiamo inviare byte al MAX7219 possiamo iniziare a inviare comandi. Questo viene fatto inviando 2 bye: il primo per l'indirizzo del registro interno e il secondo per i dati che vorremmo inviare.

Ci sono più di una dozzina di registri nel controller MAX7219.

L'invio di un comando, o di una parola, è fondamentalmente l'invio di 2 byte consecutivi. L'implementazione della funzione è molto semplice.

void max7219_word(indirizzo uint8_t, dati uint8_t) { PORTB &= ~(1 << MAX7219_CS); // Imposta CS su LOW max7219_byte(address); // Invio dell'indirizzo max7219_byte(data); // Invio dati PORTB |= (1 << MAX7219_CS); // Imposta CS su HIGH PORTB &= ~(1 << MAX7219_CLK); // Imposta CLK su BASSO }

È importante notare qui la riga in cui riportiamo il segnale CS su HIGH – questo segna la fine della sequenza – in questo caso, la fine del comando. Una tecnica simile viene utilizzata quando si controllano più matrici collegate in una catena. Il passaggio successivo, prima di iniziare ad accendere e spegnere i LED, è inizializzare il controller MAX7219. Questo viene fatto scrivendo determinati valori in determinati registri. Per comodità, durante la codifica potremmo inserire la sequenza di inizializzazione in un array.

uint8_t initseq = { 0x09, 0x00, // Decode-Mode Register, 00 = No decodifica 0x0a, 0x01, // Intensity Register, 0x00.. 0x0f 0x0b, 0x07, // Scan-Limit Register, 0x07 per mostrare tutte le righe 0x0c, 0x01, // Registro di spegnimento, 0x01 = Funzionamento normale 0x0f, 0x00, // Registro di test display, 0x00 = Funzionamento normale };

Abbiamo solo bisogno di inviare i 5 comandi sopra in una sequenza come coppie indirizzo/dati. Passaggio successivo: accendere una fila di LED.

Questo è molto semplice: scriviamo solo un comando dove il 1° byte è l'indirizzo (da 0 a 7) e il 2° byte sono gli 8 bit che rappresentano gli 8 LED nella riga.

void max7219_row(uint8_t address, uint8_t data) { if (address >= 1 && address <= 8) max7219_word(address, data); }

È importante notare che questo funzionerà solo per 1 matrice. Se colleghiamo più matrici in una catena, tutte mostreranno gli stessi dati. La ragione di ciò è che dopo aver inviato il comando riportiamo il segnale CS su HIGH, il che fa sì che tutti i controller MAX7219 nella catena si blocchino e mostrino qualunque sia stato l'ultimo comando.

Consigliato: