Newsgroup: it.hobby.elettronica.digitale
Titolo: Decodifica manchester con PIC/AVR [lungo]

per realizzare un progettino che avevo in mente ho dovuto scrivere un codice 
(programmo in C a livello hobbistico) per implementare un encoder e un 
decoder manchester a 8 kbps su di un PIC 18f452 cloccato a 40 mhz. L'encoder 
funziona perfettamente; il decoder funziona discretamente ma mi rimane 
piuttosto sensibile ai disturbi dato che il flusso dati viaggia su un canale 
radio UHF modulato in fsk. E' vero che i dati trasmessi e poi ricevuti sono 
protetti da un algoritmo di controllo e correzione degli errori, ma quello 
che vorrei fare è migliorare ulteriormente il decodificatore in maniera da 
renderlo il più immune possibile dai disturbi dovuti al fading del segnale 
ricevuto. Dopo settimane di ricerche sulla rete ho trovato questo:
http://www.mathworks.com/products/modelsim/demos.html?file=/products/demos/shipping/modelsim/manchestertutorial.html
dove è spiegato quello che sembra essere il miglior algoritmo per 
decodificare un flusso dati manchester: il problema è che non sono 
assolutamente riuscito a capirne il concetto di base, cioè come funziona: 
inphase/quadrature waveform, convolved IQ, (???) non tanto per la lingua 
inglese ma per i concetti matematici descritti che proprio, perdonatemi, non 
riesco a comprendere.
Se qualcuno ha già avuto esperienze con l'algoritmo di decodifica descritto 
nel link riportato sopra non è che potrebbe.. ehm diciamo spiegarmelo in 
maniera + comprensibile? Poi mi arrangerò a tradurlo in C, l'importante è 
riuscire a capirne il concetto di base .... grazie!
Alessandro

 riesco a comprendere.
Lascia stare, è effettivamente complicato e ti servirebbe
avere a disposizione un ricevitore che ti fornisca i segnali
in quadratura. Questo a sua volta ti imporrebbe di
realizzare un loop di correzione degli offset di fase e
frequenza... Insomma, un gran casino.
La cosa migliore che puoi fare è rendere più "soft" il tuo
algoritmo di decodifica. Cioè non considerare il segnale
che ricevi come 0 o 1, ma leggilo per un intero periodo
e decidi alla fine se vale 0 o 1, ad esempio in base a
quanto tempo si è mantenuto ad uno dei due livelli. Nello
stesso modo non prendere come riferimento tutte le
transizioni, ma aspetta che dopo una transizione il segnale
si mantenga stabile per un pò prima di darla per vera.
Un altro accorgimento è quello di "scombinare" i bit
prima di trasmetterli, in modo che bit vicini nel messaggio
originale si trovino lontani in aria. Questo aumenta la
probabilità che per ciascuna parola del codice ti ritrovi
soltanto un errore (facilmente correggibile) in presenza
di disturbi a burst.
Questi due accorgimenti migliorano molto la ricezione,
altre tecniche sono troppo complicate per essere
implementate su un micro...
A.D.

 quanto tempo si è mantenuto ad uno dei due livelli.
Ok perfetto, mi tengo il decodificatore così com'è e provo a modificarlo 
secondo i tuoi consigli.
Ti ringrazio tanto, ciao.
Alessandro 

 l'importante è riuscire a capirne il concetto di base .... grazie!
Come ti ha detto A.D. quello che è spiegato là è un po' troppo complicato da 
realizzare su un micro.....
Tempo fa ho dovuto implementare la codifica manchester sia in trasmissione 
sia in ricezione.
Io feci così:
- prepari un buffer di lunghezza doppia rispetto al dato da trasmettere o 
ricevere
- preparato il dato da trasmettere lo codifichi manchester, cioè se hai un 1 
scrivi 10 e se hai uno 0 scrivi 01
http://www.mathworks.com/products/demos/shipping/modelsim/manchestertutorial_tab1_thumbnail.png
- nel caso della ricezione invece ricevi tutto (magari vedi se trasmettere 
una stringa nota di sincronizzazione) e riempi il tuo buffer, dopodichè 
decodifichi (se trovi 01 scrivi 0, se trovi 10 scrivi 1)
et voilà :) E' molto semplice implementare una cosa del genere in C...
Il segnale che ottieni ha bitrate doppio di quello che otterresti senza 
codifica:
http://www.mathworks.com/products/demos/shipping/modelsim/manchestertutorial_image005_thumbnail.png
Ma è l'ideale per essere trasmesso via radio con una modulazione OOK (per 
esempio), visto che per lunghe sequenze di zeri eviti di tener spento il 
trasmettitore per molto tempo (e scombinare il funzionamento ottimale del 
classico AGC del ricevitore)
Ciao
CG