controllare max7219 con un microcontrollore

ciao a tutti sto cercando di pilotare 5 display collegati a un max7219 con un microcontrollore bx24 programmabile in picbasic, da quello che ho letto sul datasheet bisogna inviare al max7219 le informazioni sul numero da visualizzare e su quale display inviandogli un pacchetto da

16 bit per ogni cifra e una volta inviato portare a livello alto il pin LOAD dell'integrato per farglielo accettare. Il problema =E8 che per=F2 i display continuano a visualizzare cifre a caso probabilmente perch=E8 sbaglio la procedura per inviare i pacchetti di 16 bit. Sempre nel datasheet ho visto che per ogni procedura al posto di inviare i 16 bit posso inviare al max7219 un numero esadecimale, ma non ho capito come si fa. C'=E8 per caso qualcuno che ha gi=E0 avuto eseperienze con il max7219 e sa spiegarmi un p=F2 come funziona l'invio delle informazioni dal microcontrollore al max7219?

ciao e grazie in anticipo :) luca

Reply to
quattro.luca
Loading thread data ...

Ho usato varie volte il MAX7219 in passato. La fig.1 (pag. 6) del datasheet ufficiale mi sembra molto chiara. Esattamente cosa c'=E8 che non torna? Se puoi, scrivi una stringa tipo che cerchi di inviare al MAX e dimmi cosa invece compare.

=2E Sempre nel datasheet ho visto che per ogni procedura al

Puoi pilotare il MAX in due modi: "grafico" (ogni singolo segmento) ed HEX (si avvale di una decodifica 7 segmenti interna). Credo di non essermi mai avvalso della possibilit=E0 dell'HEX, modo che ritengo indirizzato per microcontrollori di davvero scarsa potenza o per impieghi decisamenti stringati. Nel caso del PIC potresti, per=F2, avere qualche beneficio. Di solito ci si crea un bitmap dei numeri nel micro.

Hai controllato bene le temporizzazioni dei 3 segnali (frpnte di salita del clock in presenza di dato stabile, ad esempio)?

Piccio.

Reply to
Piccio

ciao Piccio graqzie della risposta. Allora io nel programma che ho scritto per il micro comunico con il pic usando la funzione shiftout che mi permette di inviare otto bit serialmente al max7219 ecco il programma

 const DIN as byte =3D 13  'il piedino 13 del micro =E8 collegato al piedino DIN del max7219 const CLK as byte =3D 14 'il piedino 14 del micro =E8 collegato al piedino CLK del max7219 const LOAD as byte =3D 15   'il piedino 15 del micro =E8 collegato al piedino LOAD del max7219

Public Sub Main() call decodeMode() 'richiamo la routine per settare la modalit=E0 di decodifica call shutDownMode() 'richiamo la routine per settare la modalit=E0 di utilizzo (in questo caso normale) call displayTestMode() 'richiamo la routine per settare la modalit=E0 di test (in questo caso normale) call scanLimit() 'richiamo la routine per impostare quanti display voglio utilizzare call intensity() 'richiamo la routine per settare la luminosit=E0 dei display

'digit 0 call shiftout(DIN, CLK, 8, 00000001) 'invio i primi 8 bit per l'indirizzo call shiftout(DIN, CLK, 8, 00000001) 'invio altri 8 bit per inviare il numero da visualizzare Call PulseOut(LOAD, 1.5E-3, 1) ' mando un'impulso di 1.5 millisecondi al pin LOAD per far accettare i dati inviati call sleep(40)

'digit 1 call shiftout(DIN, CLK, 8, 00000010) call shiftout(DIN, CLK, 8, 00000010) Call PulseOut(LOAD, 1.5E-3, 1) call sleep(40)

'digit 2 call shiftout(DIN, CLK, 8, 00000011) call shiftout(DIN, CLK, 8, 00000011) Call PulseOut(LOAD, 1.5E-3, 1) call sleep(40)

'digit 3 call shiftout(DIN, CLK, 8, 00000100) call shiftout(DIN, CLK, 4, 00000011) Call PulseOut(LOAD, 1.5E-3, 1) call sleep(40)

'digit 4 call shiftout(DIN, CLK, 8, 00000101) call shiftout(DIN, CLK, 8, 00000011) Call PulseOut(LOAD, 1.5E-3, 1) call sleep(40)

End Sub

private sub decodeMode() call shiftout(DIN, CLK, 8, 00001001) call shiftout(DIN, CLK, 8, 00000000) Call PulseOut(LOAD, 1.5E-3, 1) End Sub

private sub shutDownMode() call shiftout(DIN, CLK, 8, 00001100) call shiftout(DIN, CLK, 8, 00000001) Call PulseOut(LOAD, 1.5E-3, 1) End Sub

private sub scanLimit() call shiftout(DIN, CLK, 8, 00001011) call shiftout(DIN, CLK, 8, 00000100) Call PulseOut(LOAD, 1.5E-3, 1) End Sub

private sub intensity() call shiftout(DIN, CLK, 8, 00001010) call shiftout(DIN, CLK, 8, 00000001) Call PulseOut(LOAD, 1.5E-3, 1) End Sub

private sub displayTestMode() call shiftout(DIN, CLK, 8, 00001111) call shiftout(DIN, CLK, 8, 00000000) Call PulseOut(LOAD, 1.5E-3, 1) End Sub

anche se carico questo programma nel micro il max7219 continua a visualizzare cifre a caso oppure visualizza tutti 8

volevo chiedere anche un'altra cosa: non ho ben capito cosa serve la "decode mode", comunque io l'ho impostata a "no decode for digits 7-0"

grazie di tutto ciao luca

Reply to
quattro.luca

Premetto che utilizzo la famiglia AVR e non conosco il tuo ambiente di sviluppo, comunque mi risulta chiaro.

Accertati che "shiftout" generi le temporizzazioni in modo compatibile col MAX7219, ovvero caricamento DIN su rising edge di CLK.

Non conosco, come gi=E0 detto, le direttive specifiche, ma di solito non si indica il pin fisico, ma quello logico, tipo: P1.3 (porta 1, bit

3). Controlla anche questo. Controlla anche il settaggio dei singoli pin (input od output, pull-up od open drain, ecc.).

Io inserirei in questo punto una forzatura dei livelli dei pin in modo che siano tutti a 0. Soprattutto, invocherei "Call PulseOut(LOAD, 1.5E-3, 1)" per sincronizzare il MAX.

di

dei

e

Forse il vero problema =E8 qua: la sintassi. Controlla che il compilatore accetti i numeri binari senza suffisso. Di solito si indicano con "0b00110011" oppure "00110011b". Senza il suffisso, vengono letteralmente interpretati come decimali. Alcuni compiler se trovano lo 0 davanti, interpretano addirittura come ottale.

=2E.. ecc, ecc.

Con la decode, puoi esprimere i digit in BCD, ovvero, con soli 4 bit. Da 0b00000000 a 0b00001111 ottieni caratteri preimpostati (gi=E0 decodificati) il cui bitmap vedi a pag. 8. La particolarit=E0 =E8 che puoi definire un certo range di decodificati (pag. 7). Se ne hai la possibilit=E0, non decodificarli e creati tu stesso i bitmap: conferisce pi=F9 elasticit=E0 e compatibilit=E0 al software per altri display driver.

Non c'=E8 di che.

Piccio.

Reply to
Piccio

io uso il max7219 con i pic e picbasic pro che però vedo essere un pò diverso dal tuo, nel mio caso dopo aver settato le variabili ne setto i parametri interni:

ADDRESS = $0C : DATAREG = $01 : gosub MaxWrite 'normal operation ADDRESS = $09 : DATAREG = $FF : gosub MaxWrite 'decode mode Code B-digits

3-0 ADDRESS = $0A : DATAREG = $01 : gosub MaxWrite 'intensity 0..15 ADDRESS = $0B : DATAREG = $07 : gosub MaxWrite 'scan limit 0..7 ADDRESS = $0F : DATAREG = $00 : gosub MaxWrite 'display normal format

MaxWrite: shiftout porta.0,porta.2,1,[ADDRESS,DATAREG] (shifta i dati nel MAX7219 prima l'indirizzo poi il dato) pulsout porta.1,1 (carica i dati nel MAX7219) return

ADDRESS = 1 :DATAREG = dati DIG 0(dati digit 0) gosub MaxWrite

ADDRESS = 2 :DATAREG = dati DIG 1(dati digit 1) gosub MaxWrite

etc....

ha scritto nel messaggio news: snipped-for-privacy@l42g2000hsc.googlegroups.com... ciao a tutti sto cercando di pilotare 5 display collegati a un max7219 con un microcontrollore bx24 programmabile in picbasic, da quello che ho letto sul datasheet bisogna inviare al max7219 le informazioni sul numero da visualizzare e su quale display inviandogli un pacchetto da

16 bit per ogni cifra e una volta inviato portare a livello alto il pin LOAD dell'integrato per farglielo accettare. Il problema è che però i display continuano a visualizzare cifre a caso probabilmente perchè sbaglio la procedura per inviare i pacchetti di 16 bit. Sempre nel datasheet ho visto che per ogni procedura al posto di inviare i 16 bit posso inviare al max7219 un numero esadecimale, ma non ho capito come si fa. C'è per caso qualcuno che ha già avuto eseperienze con il max7219 e sa spiegarmi un pò come funziona l'invio delle informazioni dal microcontrollore al max7219?

ciao e grazie in anticipo :) luca

Reply to
franco_5

effettivamente era questo il problema, prima del numero binario dovevo scrivere "bx", quindi bx00111001

inoltre dovevo inizialmente anche settare i pin 13, 14 e 15 a 0 altrimenti non funzionava

grazie mille Piccio per la disponibilit=E0 :) e anche Franco_5 per la risposta

ciao luca

Reply to
quattro.luca

effettivamente era questo il vero problema: dovevo mettere prima della cifra binaria la sigla "bx" e dopo il numero binariio, quindi: bx00001101

inoltre all'inizio dovevo settare i pin 13, 14 e 15 a livello logico 0 altrimenti non funzionava

Grazie mille Piccio per la disponibilit=E0 :) e anche a Franco_5 per la risposta

ciao luca

Reply to
quattro.luca

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.