Denna gång blir det back to basics med en grundläggande förklaring av vad bitar och bytes är och hur dessa bitar ser ut på ett oscilloskop. Vi ska nämligen titta på seriell data med ett oscilloskop och även se hur vi kan “spela in” datan så att vi kan läsa av dataströmmen i efterhand.

Uppkoppling av laborationen

För att demonstrera detta och kunna visa dataströmmen har jag valt att använda en Raspberry Pi och en USB TTY-enhet till min dator. USB TTY-enheten kopplas samman med Raspberry Pi:ens RX/TX pinnar så att vi kan använda datorns skärm och tangentbord till Pi:en. På vårt breadboard kopplar vi in vårt oscilloskop så att vi kan se data som överförs. Vi kommer inte att avkoda datan vi ser, detta är helt eget kapitel för sig. Däremot kommer vi att se riktig seriell data, alltså bitarna, var för sig. Vi kommer också att kunna se hastigheten på den seriella datan, liksom hur hög spänning Raspberry Pi:en kommunicerar med. Således kommer vi att se alla de viktigaste detaljerna för att bättre kunna förså datorn och vad en bit är för något. Detta är grunderna för all datorvetenskap. Detta är den lägsta nivån vi kan komma till, nämligen nollor och ettor.

Vi börjar med att ta en titt på hur jag har kopplat upp min laboration. Det är en väldigt enkel setup som ni kan se på ritningen här nedanför. Kabeln du ska koppla från USB-TTY till Raspberry Pi:ens TX är oftast vit och den till RX är oftast grön.

Ritning över laborationen

En först titt på datan

Nu när vi har kopplat upp vår laboration är det dags att att börja titta på oscilloskopet. Det första vi kommer att märka när vi kopplar in vårt oscilloskop är att det ritar en rak linje som är +3.3 volt. Detta är helt riktigt. Detta kallas att det är inverterat mot vad man normalt skulle tro. Ingen data, alltså 0, = +3.3v och data (1) = 0v. Detta går egentligen mot allting vi lärt oss eftersom man annars alltid säger att på = 1 och av = 0. Och så är det också, generellt sett. Men just med vår seriella data är detta inverterat. För att vi verkligen ska se någon data måste vi skriva något på tangentbordet. Nackdelen med detta är att vi knappast hinner se något innan datan är färdigsänd. För att råda bot på detta så att vi får en stabil utsignal på oscilloskopet gjorde jag ett litet Bash-script som hela tiden skriver ut en rad ettor på skärmen. Eftersom det är TX, alltså transmitt vi mäter så är det det på skärmen vi kommer att få se på oscilloskopet. Om vi då tar vårt Bash-skript som skriver ut ettor på skärmen så är det just den data (ettorna) som vi kommer att se på oscilloskopet. Skriptet ser ut som nedan.

#!/bin/bash
while true
do
echo 1
sleep 0.03
done

Nu kör vi detta skriptet för att få ut våra ettor på skärmen och startar upp vår oscilloskop. Jag kommer att börja med standardinställningarna i Raspberry Pi:en, vilket är 115200 bps, eller 115.2 kbps. Om vi nu tittar på detta i ett oscilloskop så kommer vi sedan bilden här nedanför.

Seriell data

Mitt oscilloskop har stöd för cursors och betyder att vi direkt på skärmen kan visa spänning och frekvens. När jag markerar början och slutet på en av dessa bitar (kom ihåg att en bit är detsamma som en av/på, eller 0/1) så ser vi att överförningshastigheten är just 115.2 kbps, fast det visas här istället som 116 khz, vilket i vårt fall är precis samma sak, 155200 bps ≈ 116 khz. Här ser vi också tydliget var en bit är. Varje vertikalt streck på oscilloskopet är alltså en bit. Ett långt streck kan vara två eller tre bitar, man får kontrollera med en enstaka bit hur lång den ska vara, eller göra som jag gjort, mäta upp längden på en bit. Åtta sådana här bitar, bildar en byte. Med andra ord, åtta på/av är samma sak som en byte. Bitarna är alltså den lägsta möjliga enhet vi kan mäta i datorsammanhang.

Seriell data med cursors

Så här kan vi alltså titta på vår seriella data och med blotta ögat faktiskt se datatrafiken. Det finns alltså inga siffror, inga bokstäver och inga färger. Allting som överförs på kabeln är bitar, där varje bit består utav ett - eller av-läge. Nu har jag bara ett analogt oscilloskop vilket betyder att jag inte kan spara ner datan som jag ser. Detta betyder alltså att jag egentligen inte kan utläsa själva data som överförs på kabeln, jag kan alltså bara se så att datan ser korrekt ut, vilken överföringshastighet den har och vilken spänning den har.

Spela in, eller spara, datan

Om jag verkligen skulle vilja spara ner data och avkoda den måste jag på något sätt spara den. Även med ett analogt oscilloskop är detta faktiskt möjligt. Många analoga oscilloskop har en CH1 output på baksidan i form av en BNC-kontakt. Fixar vi en BNC till 3.5mm-plugg kan vi faktiskt spela in datan på vår dator med hjälp av ljudkortet. OBS: Kontrollera alltid utspänningen från ditt oscilloskop och den maximala inspänning på ditt ljudkort innan du kopplar ihop dessa, annars kan du bränna din line-in på ljudkortet. När vi väl kopplat samman oscilloskopet med ljudkortet uppstår nästa problem. Mitt ljudkort kan bara hantera maximalt ca 44khz. Detta innebär att vi inte kommer att se någon data när vi spelar in det, eftersom ljudkortet så att säga inte hänger med. För att kunna spela in riktig data från oscilloskopet till ljudkortet krävs att vi sänker överföringshastigheten på Rasberry Pi:en. Detta kan vi enkelt göra genom att ändra i filen /boot/cmdline.txt. Här ändrar vi 115200 till 9600. Filen ska nu se ut som nedan.

dwc_otg.lpm_enable=0 console=ttyAMA0,9600 console=tty1 root=/dev/mmcblk0p2 
rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

Nu startar vi om vår Raspberry Pi och justerar vårt oscilloskop så att vi det matchar den långsammare överföringshastigheten. Nu ser vi också att vi är nere på 9.6 khz, vilket motsvarar våra 9600 bps.

9600 bps

Om vi nu spelar in datan med till exempel Audacity så får vi följande inspelning (efter att vi zoomar in rejält). Som ni ser så lutar den lite i början, detta beror på störning från elnätet. Men vi har ändå lyckats spela in datan, även om det är ganska mycket störningar i den.

Inspelad data i Audacity

Kort om binär data

Det vi ser, våra av/på-cykler är alltså 0/1. Ettor och nollor är alltså binär data. Denna binära datan omvandlas sen till tecken i datorn. Att omvandla den datan vi har läst av med oscilloskopet är lite utanför denna artikelns räckvidd, då vi måste ta i beaktande det seriella protokollet med startbitar, stoppbitar, och annan overhead. Men vi kan istället visa hur man omvandlar vanliga tal och tecken till och från binära talsystemet med hjälp av ASCII-tabellen. En ACSII-tabell behövs då för omvandligen. Vi kan ta bokstaven a för enkelhetens skull. Bokstaven a i ACSII-tabellen är 97 i vårt decimala talsystem. Då börjar vi med att ställa upp det hela. Vi börjar bakifrån med 1, 2, 4, 8, 16 osv. Sedan sätter vi en etta där vi behöver den aktuella siffran, och en nolla om den siffran inte behövs.

-------------------------------------
|128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|0   | 1  | 1  | 0  | 0 | 0 | 0 | 1 |
-------------------------------------

64+32+1=97. Alltså är bokstaven a i binärt 01100001.