|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Oct 2000
Città: UK
Messaggi: 7458
|
Pic & Assembler: necessito suggerimenti!!!
Salve a tutti!
Ho bisogno di un suggerimento, anche solo a livello di idea, per fare una cosina con dei pic 16f84. La mia situazione è la seguente: Ho bisogno che da tastiera vengano immessi tre numeri, i primi due compresi tra 0 e 1000, il terzo non lo so, diciamo tra 0 e 9999, e questi tre numeri devono essere memorizzati da qualche parte e passati ripettivamente ad altri due pic e ad un contatore. Nello specifico, anche se non è rilevante, i primi due numeri sono la frequenza di due onde che devono essere generate dai due pic e il terzo è il ritardo in millisecondi tra un'onda e l'altra. Come posso fare? Il primo problema che devo affrontare è gestire l'ingresso da tastiera e riportalo sul display. Per far questo interfaccio la tastiera con un encoder che mi porta le nove cifre 1-9 su quattro bit, e lo 0 lo assegno ad un bit a sè (dannato encoder, hai quattro bit, ma fammi 10 combinazioni almeno! mah...). Avevo pensato quindi di assegnare un interrupt ai cambiamenti di stato sulla linea B (usata per il bus di comunicazione) per rilevare il momento in cui si premeva un tasto. Ricevuto l'interrupt, il PIC registrava la prima cifra e passava alla seconda. Già a questo punto ho un'altra possibilità: posso creare un circuitino con qualche or che mi dia un segnale alto nel momento in cui premo un qualunque tasto; questo segnale viene mandato sul bus sull'ottavo bit, tanto per dire, e nel momento in cui il pic legge questo segnale accetta il dato. Mi sembra molto più snella questa seconda soluzione... Ok, diciamo che ho preso dentro la prima cifra. Ora devo tradurla nel giusto codice perchè venga visualizzata sul display a led (sì, non è un lcd, ha 8 pin per i sette segmenti segmenti + il punto... che non mi serve, quindi 7 segnali), ovvero se abbiamo un 1, che arriverà come 00000001, dobbiamo farlo diventare un 00100001, un due che arriva come 00000010 deve diventare 10011011 e così via. Come posso fare questo lavoro? Sinceramente non ho molte idee per questo... un confronto bit a bit? Diventa una roba allucinante... il problema è che sulla tastiera ho 10 cifre: se avessi 10 linee disponibili per far arrivare direttamente i 10 segnali sarebbe una passeggiata, ma così sinceramente non so, perchè le dieci linee proprio non ce le ho. Altro problema: quando passo alla seconda cifra, devo praticamente fare 1a_cifra + 2a_cifra*10, e così via con la terza e con la quarta. Come posso fare? Infine, una volta fatto questo, come faccio a mandare il numero binario che ho trovato (che sarà di 10 bit, quindi avrò bisogno di passarlo con due cicli di clock) all'altro PIC? Insomma, ci sono diversi "dettagli" che dovrei approfondire ![]() Ho assolutamente bisogno di una manina... vi pregoooo!!
__________________
"Questo forum non è un fottuto cellulare quindi scrivi in italiano, grazie." (by Hire) ![]() Le mie foto su Panoramio - Google Earth |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2000
Città: UK
Messaggi: 7458
|
Mi dicono dalla regia che faccio troppe domande in una volta e vi intimorisco...
![]() ![]()
__________________
"Questo forum non è un fottuto cellulare quindi scrivi in italiano, grazie." (by Hire) ![]() Le mie foto su Panoramio - Google Earth |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
- 2 bit per selezionare il tasto premuto - 4 (o 5, stando al tuo tastierino) bit per il valore numerico, lasciano al controller il compito di trasformarlo nel valore decimale 0-9. Nota che, per dare tempo a tutte le logiche di stabilizzarsi, l'interrupt deve essere generato quando il monostabile torna "a riposo" (ovvero sul fronte di discesa).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Oct 2000
Città: UK
Messaggi: 7458
|
Quote:
la tastiera è collegata ad un encoder 10-4 che resitutisce un segnale di 4 bit pari alla codifica binaria della cifra premuta; quando si preme un tasto viene inviato un segnale sull'ottavo bit del bus; quando il PIC legge un valore alto sull'ottavo bit memorizza il dato presente su primi 4 (sfido qualcuno a premere due tasti in un microsecondo ![]() continua con le istruzioni successive. Mi pare che possa funzionate. Adesso sto costruendo il display con i latch e tutto il resto, sono a metà (e mi sono accorto che devo aggiungere una resistenza su ogni led, maremma porcella... quelli funzionano perfettamente anche direttamente sull'alimentazione, non fanno una piega, ma mi sono accorto che ogni segmento così ciuccia 150mA... per otto segmenti, per otto display fanno... ![]() ![]() ![]() Una volta che ho finito questo raccatto un tastierino e inizio a provare il tutto, sul simulatore funziona bene, almeno l'interfaccia col mondo esterno, ma non so se poi all'interno faccia quello che voglio io... non riesco a vedere i registri... ![]() Non è mica che qualcuno abbia un simulatore/emulatore/debugger per i PIC?
__________________
"Questo forum non è un fottuto cellulare quindi scrivi in italiano, grazie." (by Hire) ![]() Le mie foto su Panoramio - Google Earth |
|
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Jan 2001
Messaggi: 1976
|
Per esempio:
per l'input da tastiera: web.tiscali.it/i2viu/electronic/tastiera.htm per la visualizzalizzazione su display: web.tiscali.it/i2viu/esami/display.htm www.nutchip.com/progetti/counter.htm comunque dovresti potere fare TUTTO con il microcontrollore. (senza necessariamente passare al PIC16F87 o ST6265: AD converter, generatore PWM, ...) |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Oct 2000
Città: UK
Messaggi: 7458
|
Quote:
Ho guardato il codice ma è scritto in assembler per l'ST mentre io devo usare un PIC, comunque vedo come lo fa e prendo spunto! Grazie ![]()
__________________
"Questo forum non è un fottuto cellulare quindi scrivi in italiano, grazie." (by Hire) ![]() Le mie foto su Panoramio - Google Earth |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Oct 2000
Città: UK
Messaggi: 7458
|
Quote:
Visto che la cosa si sta complicando non poco e non posso mettere altri microcontrollori e robette varie... per cui, da quello che mi dici, potrei piazzare una fila di condensatori per filtrare i "disturbi" e tenere il segnale più costante ed evitare il problema dei glitch. Comunque ho quasi finito di costruire il display, raccatto un tastierino (dovrei averlo da qualche parte...) e provo... ![]()
__________________
"Questo forum non è un fottuto cellulare quindi scrivi in italiano, grazie." (by Hire) ![]() Le mie foto su Panoramio - Google Earth |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#10 | |
Bannato
Iscritto dal: Jan 2001
Messaggi: 1976
|
Quote:
|
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#12 | |
Bannato
Iscritto dal: Jan 2001
Messaggi: 1976
|
Quote:
e poi se non deve andare sullo Shuttle (e anche se ci deve andare ...) qualche rischio (almeno sul prototipo) lo prenderei. |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Oct 2000
Città: UK
Messaggi: 7458
|
Quote:
![]() Comunque adesso ho finito il display, devo andare a prendere un paio di cosucce, sistemo la logica del bus indirizzi e direi che posso iniziare a provare il programma ![]()
__________________
"Questo forum non è un fottuto cellulare quindi scrivi in italiano, grazie." (by Hire) ![]() Le mie foto su Panoramio - Google Earth |
|
![]() |
![]() |
![]() |
#14 | |
Bannato
Iscritto dal: Jan 2001
Messaggi: 1976
|
Quote:
Che te frega! Tanto al peggio rimani attaccato al Triac e la Philips ArenaVision da 1800W si accenderà e spegnerà a causa di qualche glitch di comunicazione tra ipotalamo e muscolo dell'ulna. ![]() ![]() |
|
![]() |
![]() |
![]() |
#15 |
Bannato
Iscritto dal: Jan 2001
Messaggi: 1976
|
a proposito: meglio PIC o ST6 ?
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Oct 2000
Città: UK
Messaggi: 7458
|
Quote:
__________________
"Questo forum non è un fottuto cellulare quindi scrivi in italiano, grazie." (by Hire) ![]() Le mie foto su Panoramio - Google Earth |
|
![]() |
![]() |
![]() |
#17 | |
Bannato
Iscritto dal: Jan 2001
Messaggi: 1976
|
Quote:
chiediamolo a ilsensine che mi sembra più glue implied ![]() |
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Oct 2000
Città: UK
Messaggi: 7458
|
Ok, montato tutto.
Primo problema: non funziona una mazza. ![]() Causa primo problema: o il decoder degli indirizzi dei latch o i latch stessi non sono quello che vogliono sembrare dai datasheet e non ce la fanno a star dietro ai comandi del pic. Il datasheet parla di 25ns come tempo minimo di permanenza del dato o di decodifica, il pic fa una istruzione ogni microsecondo quindi dovrebbe starci larghissimo... e invece nisba... Adesso devo fare un po' di prove per mettere un delay tra la scrittura su una periferica e l'istruzione successiva, che scatole... Mi sa tra l'altro che dovrò snellire qualcosa perchè sono a 850 istruzioni su 1024 disponibili e devo ancora fare alcune cosette... Beh, per adesso, accantonato il programma principale, sono riuscito a fargli scrivere "12345678" sul display (grande soddisfazione ![]() ![]() ![]()
__________________
"Questo forum non è un fottuto cellulare quindi scrivi in italiano, grazie." (by Hire) ![]() Le mie foto su Panoramio - Google Earth |
![]() |
![]() |
![]() |
#19 |
Bannato
Iscritto dal: Jan 2001
Messaggi: 1976
|
quante porte usi per i display ?
che driver usi per pilotare i display ? |
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: Oct 2000
Città: UK
Messaggi: 7458
|
Quote:
![]() A forza di prova-programma-debugga (santo debugger, perchè non ci sei mai quando mi servi?! ![]() Ah il display è una cosa fatta così: ho quattro bit di indirizzi, le porta A:0-3, che vanno al decoder dei chip select e che mi servono per selezionare il Latch Enable del latch associato ad ogni display a otto segmenti (sette + il punto). I latch sono collegati sul bus e ognuno al suo display: non faccio altro che mettere fuori l'indirizzo del display, aspettare un attimino che il decoder metta disponibile l'indirizzo, mettere i dati sul bus e rilasciare l'indirizzo. Sto usando un ciclo di wait da 128uS per dare tempo al decoder di funzionare, stando al datasheet è un'eternità rispetto a ai nanosecondi di cui parla, ma tant'è, con un microsecondo non funziona. Potrei sicuramente farlo andare più veloce ma non importa, così va perfettamente. Poi il chip select è collegato anche al buffer per la tastiera (quasi finita, ah, ho messo i condensatori e ho fatto fare la pic un doppio controllo sul rilascio e pressione del tasto a distanza di un po' di tempo per eliminare i disturbi e funziona utilizzando un filo per chiudere li contatto -quindi glitch a profusione ![]() ![]() Appena riesco vi posto una foto del prototipo ![]()
__________________
"Questo forum non è un fottuto cellulare quindi scrivi in italiano, grazie." (by Hire) ![]() Le mie foto su Panoramio - Google Earth |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:08.