>>> LINK A PAGINA AGGIORNATA <<<
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
Questo circuito è nato per scherzo sul newsgroup it.hobby.elettronica. Permette di “caricare” uno shift register CD4094 tramite una porta seriale senza usare logica programmabile esterna. Sfrutta lo stesso principio di funzionamento dei vecchi integrati “decodifica apricancello”, cioè timer comandati dagli impulsi in arrivo.
Per ogni bit da trasmettere si trasmette un intero byte con tutti i bit a uno o a zero. I fronti di discesa di degli start-bit attivano due timer (contenuti in un integrato CD5438). Un timer comanda il clock dello shift register, scade dopo mezzo byte (130µs) e serve per campionare il valore presente sulla linea seriale al centro di ogni byte.
Un secondo timer, retriggerabile, scade dopo circa 1.2ms dall’ultimo fronte di discesa ricevuto, e genera la conferma (strobe) per lo shift register.
Opzionalmente altri due timer in cascata possono essere attivati dallo strobe per generare un nuovo impulso di strobe di 10µs, ritardato di 10µs dal precedente.
Il transistor trasforma i livelli di tensione di una RS232 standard in livelli TTL 5V. Se si usa un convertitore USB/seriale a livelli TTL allora il transistor può essere omesso, e il terminale TX del convertitore si può collegare direttamente agli ingressi degli integrati.
Come estensione, è possibile collegare diversi CD4094 in serie, e caricarli inviando un numero maggiore di “byte-bit”.
Il funzionamento è stato testato su breadboard usando il seguente programma Python come sorgente di dati seriali. Il cuore è la funzione ‘make_frame’, che riceve un valore intero tra 0 e 255 e lo trasforma in una stringa di otto byte da trasmettere via seriale (stringa standard in Python2 e oggetto bytes in Python3).
#___________________________________________________________ # # Programma luci avanti/indietro con interfaccia # seriale/parallela di emergenza. CONTROL+C per finire. # By C.Fin 2010 #___________________________________________________________ import serial, time, struct #___________________________________________________________ def make_frame(n): data = [] for _ in range(8): data.append(255 * (n & 1)) n >>= 1 return struct.pack('B'*len(data), *data) # Py2 & Py3 #___________________________________________________________ s = serial.Serial('com1', 38400, 8, 'N', 1, timeout=1) v = 128 right_dir = True try: while True: s.write(make_frame(v)) time.sleep(0.02) v = v >> 1 if right_dir else v << 1 if v == 1: right_dir = False if v == 128: right_dir = True except KeyboardInterrupt: pass s.write(make_frame(0)) s.close() #___________________________________________________________