Pages: 1 2 [3] 4 5 ... 7   Go Down
Author Topic: l'atmel display recuperato dal decoder  (Read 6586 times)
0 Members and 1 Guest are viewing this topic.
Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12661
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

A occhio,guardando le foto del cs che hai messo all'inizio si notano nella foto vista da sotto 4 transistor che sono probabilmente usati per abilitare i 4 display mentre i segmenti saranno pilotati direttamente dagli I/0 dell' attiny.
Ecco perchè vedo logico il discorso di astro,ognuno dei 4 byte che invii dovrebbero essere messi in memoria dell'attiny ed in base al valore di esso abilita il transistor relativo (ad esempio byte 1=transistor1)e trasferisce sul portx i dati relativi ai 7 segmenti(a,b,c,d,e,f,g) ad una data frequenza e continua a farlo finchè non cambi il valore dei byte.
Prova e facci sapere,ciao.
Sul discorso dei transistor però potremmo anche pensare che stiano semplicemente svolgendo il loro ruolo di amplificatori in corrente del catodo/anodo comune e non necessariamente di "interruttori"; chiaro che il micro gestisce i 4 display in sequenza, per necessità di multiplexing; però se accende tutti i LED di una cifra contemporaneamente (l'smiley-cool, parliamo di MINIMO 80mA che il pin comune con è in grado di erogare....
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

sarebbe bello capire cosa hanno scritto dentro all'attiny
Se il firmware non è protetto da lettura, potresti collegarti alla porta SPI del micro e fare il dump della memoria. Poi prendi un disassemblatore e trasformi il file binario in sorgente assembly e cerchi di studiarti il protocollo.
Molto difficile, ma non impossibile.

Secondo me si fa prima a fare un reverse eng dell'hardware e riscrivere il codice da zero smiley
Sicuramente
Logged


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12661
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Certamente, e il gusto dov'è? aver recuperato tre euro di materiale a proprio uso e consumo? Prima di arrivare a tanto le proverei tutte per farlo funzionare così com'è smiley-sweat
Logged


Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Sul discorso dei transistor però potremmo anche pensare che stiano semplicemente svolgendo il loro ruolo di amplificatori in corrente del catodo/anodo comune e non necessariamente di "interruttori"; chiaro che il micro gestisce i 4 display in sequenza, per necessità di multiplexing; però se accende tutti i LED di una cifra contemporaneamente (l', parliamo di MINIMO 80mA che il pin comune con è in grado di erogare....
Giusto quello che dici ma se noti sulla scheda i pin di uscita del micro hanno una R in serie con i segmenti di 1K che abbassa notevolmente il valore totale di corrente.

edit. anche se credo che ogni pin gestisce un solo segmento
« Last Edit: January 15, 2013, 04:02:16 am by tonid » Logged

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Senza microcontrollore si faceva così
http://www.johnstaybank.esmartbiz.com/circuits/dvm_3_digit.htm
e credo che abbiano fatto così usando un micro per comandare i display e l'I2C per prendere i dati
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 137
Posts: 9751
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sul discorso dei transistor però potremmo anche pensare che stiano semplicemente svolgendo il loro ruolo di amplificatori in corrente del catodo/anodo comune e non necessariamente di "interruttori";

Direi proprio di no, in questo tipo di applicazioni si usa sempre il multiplexing dei display.
In pratica i sette segmenti delle quattro cifre sono collegati in parallelo tra loro e tramite i quattro transistor si alimenta il comune dei display in modo alternato facendo accendere solo una cifra per per volta.
La cosa è facilmente visibile, se muovi velocemente il display ottieni una sorta di effetto stroboscopico che ti fa vedere il display acceso in posizioni diverse invece di una strisciata uniforme.
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12661
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Devo averne ancora un bel po' di quella bellissima coppia 3161/3162 smiley-lol
Comunque le R che vedo io sono da 100 ohm, sull'altro lato la foto fa schifo, sembrerebbero proprio 8 (segmenti più d.p.), ovvio che ogni pin comanda un segmento, la cifra viene generata in un sol colpo, poi si attiva il catoto/anodo DEL display da accendere; ma mentre un pin di segmento eroga la corrente del segmento, un pin di anodo/catodo eroga/assorbe la somma delle correnti dei segmenti e dell'eventuale dp. 100 ohm dovrebbero limitare a circa 3mA, un po' pochi, d'altra parte il display di vede, e effettivamente la somma totale per display sarebbe di 24mA, quindi il transistor non servirebbe. Non sono convinto della storia dell'interruttore perché puoi farlo direttamente dal pin del micro, ecco perché penso comunque ai TR come amplificatori
Logged


Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No Michele,il transistor funge solo da interruttore per permettere l'accensione dei segmenti nel solo display che si vuole accendere,così come nello schema che ho linkato di cui sicuramente conosci i chip che ormai sono difficili da trovare smiley
edit. hai ragione sulla R,ho visto male smiley-cool
« Last Edit: January 15, 2013, 04:20:26 am by tonid » Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 137
Posts: 9751
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

segmenti e dell'eventuale dp. 100 ohm dovrebbero limitare a circa 3mA, un po' pochi, d'altra parte il display di vede, e effettivamente la somma totale per display sarebbe di 24mA, quindi il transistor non servirebbe. Non sono convinto della storia dell'interruttore perché puoi farlo direttamente dal pin del micro, ecco perché penso comunque ai TR come amplificatori

Mi sa che stamattina non hai ancora preso il caffè  smiley-mr-green
Con 100 ohm su un led verde passano quasi (5-2)/100 = 30 mA e non 3 mA, cosa possibile senza problemi proprio per via del multiplexing che accende i segmenti solo per 1/4 del tempo, è come pilotarli con un duty cycle del 25%.
Il transistor è indispensabile perché oltre a fare da switch deve reggere la corrente che passa sul comune, se sono accesi tutti 8 i segmenti (dot incluso) sono la bellezza di 240 mA.
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 103
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao,dal ragionamento che ti ha fatto astro che secondo il mio parere risulta logico
Quote
In base a quello che appare direi che è molto probabile che vengono controllati i singoli segmenti di ogni cifra in funzione dei bit del valore che invii, ovvero un byte è composto da 8 bit e 7 di questi corrispondono ai segmenti del display, se c'è anche il punto è legato all'ottavo bit.
Se invii una serie di valori dove metti a 1 solo un bit per volta per ogni byte in un attimo hai la codifica, usa il formato binario "0b00000000" mettendo a 1 solo un bit per volta.
Devi inviare 4 byte per volta, uno per ogni cifra del display, e non singoli byte per ogni invio.
dovresti fare una cosa simile a questa
Code:
#include <Wire.h>
 
void setup()
 {
   Wire.begin(); // join i2c bus
 }
 
void loop()
 {
   Wire.beginTransmission(56); // transmit to device #44 (0x2c)
                               // device address is specified in datasheet
   Wire.write ((byte)0x00) ;             // primo byte
   Wire.write ((byte)0x00) ;             // secondo byte
   Wire.write ((byte)0x00) ;             // terzo byte
   Wire.write ((byte)0x00) ;             // quarto byte
   Wire.endTransmission();
  
   delay (1000);
 }
In questo modo hai inviato 4 byte consecutivi tutti impostati a zero ed in teoria i segmenti del display dovrebbero risultare tutti spenti.
In ogni caso in base al risultato che otterrai potrai cercare di capire la codifica che è stata usata cambiando il valore dei byte come per esempio,se invii
Code:
   Wire.write ((byte)0x39) ;             // primo byte
   Wire.write ((byte)0x30) ;             // secondo byte
   Wire.write ((byte)0x37) ;             // terzo byte
   Wire.write ((byte)0x3F) ;             // quarto byte
e se non ho sbagliato i conti dovrebbe apparirti la scritta CIAO

allora ho provato anche questo ma non va, il display da sempre caratteri incomprensibili, ho provato a portare il delay a 3 secondi e si è stabilizzata la lettura, cioè si visualizzano sempre gli stessi simboli. ho provato anche a mandare 4 byte uguali per vedere se visualizzava 4 caratteri uguali ma non è così sono tutti a caso
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12661
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

segmenti e dell'eventuale dp. 100 ohm dovrebbero limitare a circa 3mA, un po' pochi, d'altra parte il display di vede, e effettivamente la somma totale per display sarebbe di 24mA, quindi il transistor non servirebbe. Non sono convinto della storia dell'interruttore perché puoi farlo direttamente dal pin del micro, ecco perché penso comunque ai TR come amplificatori

Mi sa che stamattina non hai ancora preso il caffè  smiley-mr-green
Con 100 ohm su un led verde passano quasi (5-2)/100 = 30 mA e non 3 mA, cosa possibile senza problemi proprio per via del multiplexing che accende i segmenti solo per 1/4 del tempo, è come pilotarli con un duty cycle del 25%.
Il transistor è indispensabile perché oltre a fare da switch deve reggere la corrente che passa sul comune, se sono accesi tutti 8 i segmenti (dot incluso) sono la bellezza di 240 mA.
preso, ma sono comunque troppo rinco.... almeno mi consolo perché alla fine avevo ragione io: i transistor servono come amplificatori di corrente e non per la "scelta" del display da accendere (anche se ovviamente fanno pure questa funzione), che è gestita direttamente da controller. avevo calcolato 2,3V per i led verdi ed il risultato 0,027 mi ha ingannato smiley-mr-green MOGLIEEEE, altro caffé nero e bollente smiley-grin
Logged


Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@ vitoos
prova a sostituire nel loop
Code:
Wire.beginTransmission(56);
con
Code:
Wire.beginTransmission(0x38);
Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@ vitoos
prova a sostituire nel loop
Code:
Wire.beginTransmission(56);
con
Code:
Wire.beginTransmission(0x38);


16*3+8 = 56

Cosa cambia ?
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12661
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Come valore nulla, d'altra parte se quello è l'indirizzo non ne puoi usare un altro. Il dubbio di tonid è che il protocollo adottato nel tiny preveda che gli si debba dare l'indirizzo I2C in formato esadecimale invece che decimale, non si sa mai...
Io un'altra prova che farei sarebbe quella di cambiare completamente indirizzo, per vedere se il display reagisce comunque o rimane correttamente spento
Logged


Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Direi che 56(dec) == 70(oct) == 38(hex) == 00111000(bin).
A quanto ne so, il compilatore non si cura della base in cui viene specificato un int literal (a parte l'ovvia distinzione sintattica).
Logged

Pages: 1 2 [3] 4 5 ... 7   Go Up
Jump to: