Interfaccia seriale->parallela “di emergenza”

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

 

Interfaccia seriale di emergenza con CD4094

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()
#___________________________________________________________

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *