Det här är mitt specialarbete, det är bara konverterat från word-dokument till HTML.
Gjort våren 99. Betyg: MVG. Här är en bild på hur hela uppkopplingen ser ut: (telefonkortsläsaren ej ansluten.)

 

Telefonkortsläsare

med display

 

 

Av Kent Sjögren EC96EK

kent.sjogren.ec96@kagg.gy-edu.kalmar.se

kent-sjogren@swipnet.se

http://home8.swipnet.se/~w-88876/kent/

 

Inledning *

Funktionsbeskrivning *

Hårdvaran *

Mjukvaran *

Sammanfattning *

Källförteckning *

Bilagor *

Minnestabell *

Programmet *

 

Inledning

Jag tyckte att det skulle vara roligt att bygga något som specialarbete, och jag funderade länge på att bygga något med en PIC16F84. Det är en 8-bitars mikrodator från Microchip med 14 in/utgångar. Jag hade redan en enkel programerare för denna krets, sedan fick jag en begagnad display av en kompis. Det var en 1x40 teckens Vacuum Fluorescent Display (VF-0140-13) från Babcock. Problemet var att jag inte hade någon aning om hur displayen skulle kopplas in. Jag hade sökt länge på Internet, men varken Babcock eller någon annan hade några datablad på sin hemsida. Då skrev jag ett e-mail till Babcock och frågade om dom visste var man kan få tag på ett datablad till en VF-0140-13. Med tanke på att denna displayen antagligen slutade tillverkas någon gång på 80-talet, så hade jag inga stora förhoppningar. Men det var inga problem, jag fick tillbaka ett e-mail där de frågade om min hemadress, så skulle jag få den hemskickad i min brevlåda. Så två veckor senare fick jag ett tjockt kuvert från Babcock i USA med ett datablad i. Med hjälp av det databladet fick jag igång displayen med PIC:en.

När jag bestämde mig för att göra det här arbetet, insåg inte jag hur mycket arbete jag hade framför mig. Att skriva lite text på en display med en PIC borde ju inte vara så svårt, tyckte jag. Men det var det! Det tog ett antal timmar innan jag över huvud taget lyckades få nåt tecken på displayen. Men jag har lärt mig en hel del om både PIC:en och displayen.

 

Funktionsbeskrivning

Hårdvaran

Till en början kopplade jag upp PIC:en på ett kopplingsdäck med en kristall och två kondensatorer, och flatkabeln från displayen. Den 8 bitar breda databussen kopplade jag till port B på PIC:en, och alla kontrollinjer till port A. Sen började jag skriva programmet, och det tog en stund innan jag lyckades få ut något vettigt på displayen. Det blev för många tecken av varje. Det visade sig sedan att det var glappkontakt i kopplingsdäcket. Då startade jag Quick Route och ritade en kretskortslayout, som jag skrev ut på en overheadfilm och fotograferade över till ett mönsterkortslaminat i min hemgjorda UV-låda. Efter framkallning, etsning och borrning lödde jag in alla komponenter, inklusive en spänningsregulator med tillhörande kondensatorer. För säkerhets skull tog jag med en spärrdiod som skyddar mot omvänd polaritet, och en lavindiod som överspänningsskydd. I annat fall hade jag garanterat kopplat polariteten fel och bränt upp allting en vacker dag.

Kretskortet exporterat från Quick Route 3.5.

 

Sedan kopplade jag in min gamla telefonkortsläsare, som jag gjort och haft till datorn tidigare. Då blev det plötsligt brist på I/O-ben, men när jag gick igenom programmet visade det sig att det bara var en kontrollinje till displayen som behövdes, resten låg konstant på samma nivå. Jag fick därför modifiera kretskortet med hjälp av kniv och kopplingstråd, så att jag fick ytterligare två I/O-ben lediga. Detta därför att jag behövde fyra till kortläsaren, en till brytaren som känner av om något kort sitter i läsaren, en reset, en clock och en datalinje.

 

 

Kopplingsschemat över hela kretsen. Ritat i AutoCAD R14.

 

Mjukvaran

Det var nu det svåra började, att läsa av 256 bitar från telefonkortet, översätta till klartext, och skriva ut det på displayen. Läsa av en bit i taget från kortet gick bra, men att översätta hexadecimala tal till decimala, och sen till ASCII som displayen förstår, det var inte lätt. För att spara programminne så känner den bara igen svenska telefonkort, det kändes onödigt att ha med halva världens länder när jag (och andra som jag har frågat) bara har svenska kort. Det är enkelt att lägga till ett eller flera länder om det skulle behövas. Sen visade det sig att vissa nya kort har en annan tillverkarkod som jag inte känner till. Schlumberger har ju två olika koder, en äldre och en nyare, det är möjligt att det är en ännu nyare kod, så att Schlumberger har gjort även dessa kort. Detta kan jag bara spekulera i.

Programmet börjar med att definiera vilken processor som används, ställa alla fuses rätt, dvs. att programmet inte ska vara lässkyddat i PIC:en, att den reset:ar sig själv vid uppstart, och att vi använder en kristalloscillator. Sedan definieras alla nödvändiga variabler och konstanter. Vilka ben som är utgångar och vilka som är ingångar måste också ställas. Annars blir alla portar definierade som utgångar. Efter det väntar vi en stund, så displayen hinner starta upp. Det decimala talet 10 lagras i variabeln vanta, och den variabeln används senare av universalför-dröjningsloopen. Det ställer antalet varv loopen ska göra. WR på displayen måste göras hög så den inte börjar skriva tecken med en gång. Sen ska vi ha nordisk teckenuppsättning, det görs genom att skriva 1f på dataporten till displayen. Nu är det bara att skriva på displayen! Det görs genom att först ladda ackumulatorn med tecknet som ska skrivas ut (genom att skriva ett a före bokstaven så vet assemblatorn att det är ett tecken i ASCII-format) och sedan anropa proceduren skicka. Den lägger ut tecknet i ackumulatorn på port B, och klockar in tecknet i displayen genom att göra WR låg, och sedan hög igen. För att inte ingångsbufferten på displayen ska bli full så är det en loop direkt efter som väntar en stund. Genom att öka tiden på den loopen kan man även få scrollande text, eftersom displayen flyttar alla tecken ett snäpp vänster när displayen är fylld. När välkomst-meddelandet är utskrivet, så väntar programmet på att ett kort ska sättas in i läsaren. När det sker, så kommer det en fördröjning, som ser till att kortet hinner sättas i ordentligt innan det blir läst. Då sätter vi clock och reset till 0. Genom att sedan pulsa clock hög, så blir kortet resetat. För att börja läsa måste reset bli 1. Då läggs första biten ut på utgången. Sedan är det bara att pulsa clock hög, så kommer nästa bit och så vidare. Vi börjar med att bara klocka fram dom första 8 bitarna, eftersom de är ointressanta. Nästa 8 bitar, vilket blir byte 2, är korttypen. Om det inte är ett telefonkort, så står det Ej telefonkort i displayen, och programmet börjar om. Om det var ett telefonkort, så kollas hur många markeringar kortet hade på från början, vem som har tillverkat kortet, serie-numret skrivs ut, vilket land kortet kommer ifrån, och hur många markeringar som är kvar visas på displayen. För en mer precis beskrivning, kolla kommentarerna i källkoden.

Jag upptäckte även något som verkar vara en bugg. Jag stal en bit kod från ett program som jag har hittat på Michrochips hemsida. Det var för att koppla en Hitachi LCD-display till en PIC. Det var bra skrivet, för att skriva ett tecken tog bara en programrad. Genom att öka programräknaren med tex. 2, så hoppar programmet exakt två programrader framåt. På den raden vi då hamnar, fanns kommandot retlw, vilket betyder "return with literal in W", alltså hoppade programmet tillbaka igen. Och då hoppar den 3 steg framåt, och så vidare tills alla tecken var utskrivna. Det är lite svårt att förklara, men genom att läsa programmet så förstår man lättare. Hursomhelst så funkade det inte i mitt program, istället för att hoppa till rad 317 så hoppade programmet till rad 17. Alltså nollställs den övre byten på programräknaren om man ökar programräknaren manuellt! Det stod det ingenting om nånstans där jag har läst. Men genom att lägga hela proceduren i början av programmet, så fungerade det. Men jag använde det inte för att skriva tecken på displayen, utan för att räkna ut hur många markeringar det är kvar. Som sagt, läs programmet för en exakt förklaring.

 

Sammanfattning

Projektet som det är nu är egentligen ganska värdelöst, att läsa ett telefonkort har man ju inte så kollosalt stor användning av, däremot displayen och PIC:en kan man justera för andra användningsområden. Jag har haft vissa funderingar på att bygga in displayen på instrumentpanelen på bilen. Sedan koppla några temperaturgivare, en flödesgivare, och en A/D-omvandlare så har man en komplett färddator med bensinförbrukning, motortem-peratur, utetemperatur, batterispänning m.m. En idé är att lägga datorn i bilen och koppla displayen till parallell-porten och sedan spela MP3-musik. Det är inte konstigt att enchipsdatorer som PIC:en har blivit så populära, försök att hitta en mångsidigare krets för 32 kronor! Och för 50 kronor kan man bygga sig en enkel men funk-tionell serieportsprogrammerare till datorn. Det är en sådan som jag har använt mig av under mitt bygge.

 

 

Källförteckning

Datablad på displayen VF-0140-13. BABCOCK Dislay Products, Inc. Printed in USA.

Allt Om Elektronik nr. 8/97.

Databladet på PIC16F84. http://www.microchip.com/Download/Lit/PICmicro/16F8X/30430c.pdf

En textfil om telefonkort, hemsidan där jag hittade den har upphört.

MPASM USER’S GUIDE with MPLINK and MPLIB Microchip Technology Inc.

 

 

Bilagor

Minnestabell

 

Här är tabellen jag har använt mig av när jag gjorde programmet. Den visar vilken bit som är vad i telefonkortet.

Byte nr. ( bit nr. ) : Funktion.

1 ( 1..8 ) : Check-summa = 216 - ( summan ettor i intervallet bit 9 till bit 96 ).

2 ( 9..16 ) : Typ av kort. 83 hex = telefonkort.

3..4 ( 17..32 ) : Antal markeringar ( + 2 som provbränns på fabrik ). Första hex-siffran verkar alltid vara 1, de tre

följande anger antalet markeringar decimalt ( hundratal, tiotal, ental ). Exempel : 1052 hex. Första siffran skippas, kvar står 052 hex vilket skall tolkas som 0*100 + 5*10 + 2*1 = 52 markeringar. Alltså ett 50-markeringars kort (med 2 st. provbrända från start ).

5 ( 33..40 ) : Tillverkare av chip.

o $00 : Schlumberger ( t.ex. Sverige )

o $01 : Schlumberger ( nyare variant )

o $10 : Solaic

o $30 : Gemplus ( t.ex. Finland )

o $40 : Gemplus

6..10 ( 41..80 ) : Serienummer.

11..12 ( 81..96 ) Landskod.

o Byte 11 = $10, Byte 12 :

+ $15 : Djibouti

+ $16 : Franska polynesien

o Byte 11 = $11, Byte 12 :

+ $1D : Franska Cin ( ? Que ? )

+ $1E : Sverige

+ $22 : Spanien

+ $30 : Norge

+ $31 : Nya Kaledonien

+ $32 : Kamerun

+ $33 : Andorra

+ $39 : Luxemburg

+ $3C : Irland

+ $3D : Gambia

+ $47 : Portugal

+ $55 : Jugoslavien

+ $5C : Argentina

+ $5D : Burkina

+ $5E : Mali

+ $5F : Gabon

+ $65 : Finland

+ $86 : Slovakien

+ $E0 : Ungern

+ $E1 : Kamerun (Camtel)

+ $E2 : Marocko

13..32 ( 97..256 ) : Plats för markeringar. De två första fabriksbrända.

 

Programmet

Här finns källkoden i DOS textformat.