Signalsidan
Henry's signalsida
Programmeringsteknik – Hur mikroprocessorn upptäcker en signal
Alla mikroprocessorer har ett antal ben som kan användas som diskreta in- och/eller utgångar, och de fungerar på TTL-nivå.
I början av programmet talar man om huruvida benet ska vara in- eller utgång, och det ben där DCC- eller Motorolasignalen
är ansluten – med en optobrygga emellan – är en ingång.
Nästan alla processorer stödjer något som kallas interrupt. Ett interrupt är en yttre eller inre ”händelse” i processorn som
får den att hoppa till en speciell programrutin, göra klart den programrutinen, och sedan fortsätta med vad den nu höll på med.
Kärnan i programmet i processorn, som ska avkoda DCC/Motorola-signalen, är att när benet där signalen kommer in, orsakar ett
interrupt när signalen går från låg (0V) till hög (+5V). Eftersom DCC/Motorola ingången ger 0V när det är ”tyst” på linan,
så ägnar sig inte processorn åt att lyssna efter signaler heller, den gör annat.
Så fort det händer något på linan, så stiger spänningen till +5V, och då måste vi OMEDELBART agera.
Vad vi då gör att att starta en s.k. TIMER på processorn. En timer är ett slags ”ägg-ur”, som i sig genererar ett nytt interrupt, alltså exekverar en annan programrutin, när den räknat upp till sitt maxvärde. När detta sker, läser vi av signalnivån på DCC/Motorola-pinnen.
DCC fungerade ju så att en 1:a var hög i 58 mikrosekunder, och låg i 58 mikrosekunder. En 0:a var hög i minst 100 mikrosekunder och låg i minst 100 mikrosekunder.
Detta händer:
1. Ledningen befinner sig i vilotillståndet 0V. Plötsligt stiger den till +5V.
2. SMACK! En interrupt-rutin exekveras.
3. Dessa interruptrutin stänger av sig själv, sätter timern till 80 mikrosekunder och slår på timern.
4. SMACK! Interruptrutinen för timern exekveras. Den läser av nivån på pinnen som är kopplad till DCC signalen.
Om pinnen är låg så har vi en DCC 1:a, eftersom den ska ha trillat ner till 0V redan efter 58 mikrosekunder.
Är den fortfarande hög är det en DCC 0:a. När vi konstaterat vilket av detta som gäller, så slår vi av interruptet
för timersn, och slår sedan på interruptet som ska känna av en stigande signalnivå.
5. Om vi nu mätte en DCC 0:a, så kommer nivån att trilla från +5V till 0V ungefär 20 mikrosekunder senare, ,men vi
bryr oss inte om fallande flanker (+5V till 0V) så vi väntar bara på nästa STIGANDE flank. Den inträffar ju först
när NÄSTA bit kommer.
För Motorola är det annorlunda eftersom vi har två ”olika” protokollhastigheter för lok och växeldekodrar.
1. Ledningen befinner sig i vilotillståndet 0V. Plötsligt stiger den till +5V.
2. SMACK! En interrupt-rutin exekveras.
3. Dessa interruptrutin nollställer timern, och startar sedan timern. Den stänger dock inte av sig själv.
4. SMACK! Nu trillar signalen från +5V till 0V, vi har alltså en fallande flank. I DCC-fallet struntade vi i detta,
men i Motorolafallet är vi mycket intresserade! Nu läser vi av hur långt timern har tickat.
Ca 13 mikrosekunder? Detta är en Motorola 0:a för växeldekodrar.
Ca 26 mikrosekunder? Detta är en Motorola 0:a för lokdekodrar.
Ca 91 mikrosekunder? Detta är en Motorola 1:a för växeldekodrar
Ca 182 mikrosekunder? Detta är en Motorola 1:a för lokdekodrar