Ovviamente sono un nerd, quindi ecco le soluzioni che è meno probabile che vengano implementate da te, ma vale la pena menzionarle per il gusto di farlo:
Shenanigans basati sul registro dei turni
Le seguenti idee si basano su registri a scorrimento da seriale a parallelo.
Pin di uscita -> Ingresso dati
Puoi semplicemente spostare i tuoi dati sull'ingresso dati seriale del tuo registro a scorrimento.
Problem: I registri a scorrimento hanno bisogno di un orologio per sapere quando "campionare" l'input.
Solution: Genera un impulso di clock ogni volta che l'input cambia.
N Nuovo problema: OK, possiamo farlo con una semplice porta logica AND, combinando il tuo DataIN e una versione minimamente ritardata del suo output (ritardo attraverso componenti discreti, ad esempio un filtro RC). Ma: allora possiamo avere solo schemi di bit alternati.
Solution: La sequenza di output del tuo pin deve essere sempre
0->1 [lungo] ->B [breve] ->0
.
Quello che succede qui è che il primo 1
carica un condensatore (da qui il "lungo" 1), la tensione attraverso quel tappo innesca un one-shot ritardato (ad esempio, attraverso un NE555) quando attraversa una soglia, che quindi provoca un impulso di clock per il registro a scorrimento.
Nel momento in cui si verifica l'impulso, hai già impostato il bit di uscita desiderato B
sull'uscita. Deve essere più breve di 1 "fisso" per evitare di attivare nuovamente l'impulso di clock.
Fai quanto sopra due volte per spostare in due diversi bit B1 e B2 nel registro a scorrimento.
È possibile implementare lo schema di invio di cui sopra
0b1111BB00
con l'unità UART (se il tuo microcontrollore lo ha).
Se guardi da vicino, questo è molto simile a quello che fanno le cose "neopixel" di WSxxxx per comunicare: 0->1
segna l'inizio di un punto e la quantità di 1
all'interno di quel periodo imposta se è uno 0 logico o 1.
Pulsazione popolare passiva polinomiale
Questo richiedeva un titolo in rima. In verità, questo dovrebbe probabilmente essere chiamato "generazione di registro a scorrimento a retroazione lineare di una sequenza di output" o giù di lì.
L'idea è che quando si utilizza un registro a scorrimento e si collega il suo ingresso a una combinazione logica delle sue celle interne, è possibile costruire qualcosa che cicla tutti i possibili stati di uscita (se si sceglie la funzione di feedback in modo appropriato). Lo spiegherei qui, ma meh, pigro, quindi leggi l'articolo di wikipedia sui registri di spostamento del feedback lineare.
Da asporto: se puoi avere un LFSR di questo tipo, puoi, semplicemente attivando il suo clock, ottenere tutti gli output (cambia solo il giusto numero di volte).
Doh '. È carino, ma è più difficile da spiegare di un contatore
Ovviamente, quanto sopra è molto interessante (perché ha numerose applicazioni, ad esempio nella comunicazione, nel controllo dell'integrità dei dati e così via), ed è molto efficace in termini di numero di porte di cui hai bisogno per questo, ma:
Puoi anche acquistare o costruire un contatore a 2 bit (o più). E conta le levette della tua spilla Attiny. L'output di bit parallelo del contatore può essere il tuo 2 pin di output (o più).
Penso che la dice lunga ho pensato prima a LFSR invece che a contatori.
Discriminazione basata sulla frequenza
Filterbank con due frequenze discrete
L'idea è semplice:
- Genera due frequenze diverse con il pin, ad esempio, attivandolo con una frequenza di 1 kHz (cioè ogni 1 ms l'uscita si ripete, devi alternare ogni 500 µs), oppure a 2 kHz (alternare ogni 250 µs) o il somma logica di entrambe le oscillazioni (un po 'difficile da fare nella testa, ma si riduce ad avere periodi alti e lunghi alternati).
- Filtra l'output con due filtri diversi:
- un filtro passa-basso che lascia passare solo tutto ciò che è sotto, diciamo 1.2 kHz, un RC andrà bene
- un filtro passa banda che lascia passare 2 kHz, ma non 1 kHz né 3 kHz.
- rettifica e filtra passa-basso l'uscita di questi due filtri. Tada, hai costruito un ricevitore 2FSK a 2 toni, se sei così incline.
- Questi sono i tuoi due segnali di uscita; utilizzare un dispositivo di soglia, un "discriminatore" (diodo Zener, comparatore) per convertirli in binario 0 o 1.
Bonus
Se non usi 1 e 2 kHz, ma un paio di MHz, puoi effettivamente sostituire il cavo di collegamento con antenne adatte e farlo trasferire via etere. Infrangeresti la legge anche abusando dello spettro per il quale non hai licenza.
PWM che
Idea: come sopra, ma più semplice.
Lascia che ci siano due informazioni indipendenti:
- Ciclo di lavoro in uscita> 50%
- Tutte le modifiche all'output
Puoi avere il ciclo di lavoro> 50% sia
- cambiare il pin costantemente alto (ciclo di lavoro 100%) o basso (0%) o di
- impostare l'unità PWM in modo da ottenere un ciclo di lavoro del 25% o del 75%.
Quindi, come sopra, un filtro passa basso, seguito da un discriminatore che commuta a metà dell'intervallo di tensione di uscita, fornisce il primo bit di uscita.
Un filtro passa-alto, seguito da un raddrizzatore, un condensatore e un discriminatore ti danno il secondo bit.