Go Down

Topic: l'atmel display recuperato dal decoder (Read 8064 times) previous topic - next topic

Michele Menniti


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'8), parliamo di MINIMO 80mA che il pin comune con è in grado di erogare....
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

leo72




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 :)

Sicuramente

Michele Menniti

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:
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

tonid

#33
Jan 15, 2013, 09:59 am Last Edit: Jan 15, 2013, 10:02 am by tonid Reason: 1
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

tonid

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

astrobeed


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.

Michele Menniti

Devo averne ancora un bel po' di quella bellissima coppia 3161/3162 XD
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
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

tonid

#37
Jan 15, 2013, 10:18 am Last Edit: Jan 15, 2013, 10:20 am by tonid Reason: 1
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 :)
edit. hai ragione sulla R,ho visto male 8)

astrobeed


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.

vitoos


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: [Select]

#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: [Select]

   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

Michele Menniti



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 :D
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

tonid

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

tuxduino


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



16*3+8 = 56

Cosa cambia ?

Michele Menniti

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
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

tuxduino

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).

Go Up