Primero, algo que Olin notó también: los niveles son lo contrario de lo que generalmente produce un microcontrolador:
Nadadequepreocuparse,veremosquetambiénpodemosleerlodeestamanera.Solotenemosquerecordarqueenelalcanceunbitdeinicioserá1
yelbitdeparada0
.
Acontinuación,tienelabasedetiempoincorrectaparaleerestocorrectamente.9600bitsporsegundo(unidadesmásapropiadasqueBaud,aunqueesteúltimonoesincorrecto)es104\$\mu\$sporbit,quees1/10deunadivisiónensuconfiguraciónactual.Acercaryestableceruncursorverticalenelprimerborde.Eseeselcomienzodetubitdeinicio.Muevaelsegundocursoracadaunodelosbordessiguientes.Ladiferenciaentreloscursoresdebesermúltiplosde104\$\mu\$s.Cada104\$\mu\$sesunbit,primeroelbitdeinicio(1
),luego8bitsdedatos,eltiempototal832\$\mu\$s,yunbitdeparada(0
).
Noparecequelosdatosdelapantallacoincidanconel0x00
enviado.Deberíaverunbitde1
estrecho(elbitdeinicio)seguidodeunnivelbajomáslargo(936\$\mu\$s,8bitsdedatoscero+unbitdeparada).
Lomismoparael0xFF
queestásenviando;deberíaverunnivelaltolargo(nuevamente936\$\mu\$s,estavezelbitdeinicio+8bitsdedatos).Asíqueesodeberíasercasi1divisiónconsuconfiguraciónactual,peroesonoesloqueveo.
Parecemásbienqueenlaprimeracapturadepantallaestásenviandodosbytes,yenlasegundacuatro,conlasegundaylaterceraelmismovalor.
guesstimates:
0b11001111=0xCF
0b11110010=0xF2
0b11001101=0xCD
0b11001010=0xCA
0b11001010=0xCA
0b11110010=0xF2
editar
Olintienetodalarazón,estoesalgoasícomoASCII.Dehecho,eselcomplemento1deASCII.
0xCF~0x30='0'
0xCE~0x31='1'
0xCD~0x32='2'
0xCC~0x33='3'
0xCB~0x34='4'
0xCA~0x35='5'
0xF2~0x0D=[CR]
Estoconfirmaquemiinterpretacióndelascapturasdepantallaescorrecta.
edit2(cómointerpretolosdatos,apeticiónpopular:-))
Advertencia:estaesunalargahistoria,porqueesunatranscripcióndeloquesucedeenmicabezaCuandotratodedecodificarunacosacomoesta.Léalosolosiquiereaprenderunaformadeabordarlo.
Ejemplo:elsegundobyteenlaprimeracapturadepantalla,comenzandoconlos2pulsosestrechos.Comienzoconelsegundobyteapropósitoporquehaymásbordesqueenelprimerbyte,porloqueserámásfácilhacerlobien.Cadaunodelospulsosestrechosesaproximadamente1/10deunadivisión,porloquepodríaserde1bitdealtocadauno,conunbitbajoentreellos.Tampocoveonadamásestrechoqueesto,asíquesupongoqueessolounbit.Esaesnuestrareferencia.
Luego,despuésde101
hayunperíodomáslargoenelnivelbajo.Seveaproximadamenteeldobledeanchoquelosanteriores,porloquepodríaser00
.Elsiguientemáximoesnuevamenteeldobledeancho,porloqueserá1111
.Ahoratenemos9bits:unbitdeinicio(1
)más8bitsdedatos.Entonces,elsiguientebitseráelbitdeparada,perocomoes0
noesvisibledeinmediato.Entonces,aljuntartodotenemos1010011110
,incluidoslosbitsdeinicioyparada.Sielbitdeparadanofueracero,¡habríahechounamalasuposiciónenalgunaparte!
RecuerdequeunUARTenvíaelLSB(bitmenossignificativo)primero,asíquetendremosqueinvertirlos8bitsdedatos:11110010
=0xF2
.
Ahorasabemoselanchodeunbitsimple,unbitdobleyunasecuenciade4bits,yechamosunvistazoalprimerbyte.Elprimerperíodoalto(elpulsoancho)esligeramentemásanchoqueel1111
enelsegundobyte,porloquetendráunanchode5bits.Elperíodobajoyelperíodoaltoquelosiguensontananchoscomoelbitdobleenelotrobyte,porloqueobtenemos111110011
.Nuevamente9bits,porloqueelsiguientedeberíaserunbitbajo,elbitdeparada.Estábien,asíquesinuestraestimaciónescorrecta,podemosrevertirnuevamentelosbitsdedatos:11001111
=0xCF
.
EntoncesrecibimosunapistadeOlin.Laprimeracomunicaciónesde2bytesdelargo,2bytesmáscortosqueelsegundo.Y"0" también es 2 bytes más corto que "255". Así que probablemente sea algo como ASCII, aunque no exactamente. También tengo en cuenta que el segundo y tercer byte de "255" son los mismos. Genial, ese será el doble "5". ¡Lo estamos haciendo bien! (Debes animarte de vez en cuando). Después de decodificar "0", "2" y "5", observo que hay una diferencia de 2 entre los códigos de los dos primeros y una diferencia de 3 entre los últimos dos. Y finalmente, me doy cuenta de que 0xC_
es el complemento de 0x3_
, que es el patrón para los dígitos en ASCII.