Tjena på er!
Jag har tidigare byggt en nummerpresentatör till datorn, men fick den aldrig att fungera som jag ville och nu när jag hittade Andys konstruktion som såg lite säkrare ut med en bla en linjetransformator mellan telenätet och kretsen så blev jag lite sugen på att ge mig på projektet igen och göra ett nytt försök.
Målsättningen är att ha hårdvaran kopplad till en serverdator som står på dygnet runt och när ett inkommande telefonsamtal kommer så skickas ett meddelande ut till husets alla datorer där det står nummer och vem det är som ringer (självklart måste man ju programmera in detta först i en adressbok)
Till skillnad från Andy så använder jag mig av Windows XP och programmeringen sker i det "enkla" programmet Visual Basic som de flesta nog har stött på någon gång.
Jag började med att beställa alla komponenterna ifrån ELFA och detta gick enkelt och smidigt tack vare Andys inköpslista.
http://numpres.minserver.net/01.jpg
Jag rotatde fram en liten bit kretskort och började fundera lite över komponenternas placering och därefter var det bara att fatta lödpennan och löda ihop det hela och såhär blev resultatet:
http://numpres.minserver.net/02.jpg
http://numpres.minserver.net/03.jpg
Efter lite provmätningar monterades kretsen i sin sockel och hårdvaran kopplades in till datorn.
VB startades och efter lite knapptryckningar på telefonen så dök det upp lite siffror i programmet, trevligt det visade sig att hårdvaran fungerade!
Nu tog jag kontakt med Andy för att få lite tips angående utläsningen av siffror/bokstäver/tecken ifrån hårdvaran och han var mycket hjälpsam och informativ. Mina kunskaper av bitar mm är lite begränsade, så koden skulle nog gå att optimera något, men det funkar iaf
Skapa ett nytt projekt i VB, lägg in en timer och sätt Interval=40
infoga sedan nedanstående kod:
Option Explicit
'Definierar skrivarportens tre linjer
Dim DataLinje As Integer
Dim StatusLinje As Integer
Dim KontrollLinje As Integer
'Håller decimal data läst ifrån StatusLinjen
Dim InData As Byte
'Håller decimal data läst ifrån Statuslinjen vid förra rutinen
Dim Tidigare As Byte
'Håller Q1-Q4 i decimal form
Dim QData As Byte
'Håller de siffror/bokstäver/tecken som hämtats in mha QData och tabellen
Dim Nummer As String
'Håller tabellen som beskriver alla siffror/bokstäver/tecken som kan förekomma
Dim nummerdata(15) As String
'Inp and Out declarations for direct port I/O
'in 32-bit Visual Basic 4+ programs.
Private Declare Function Inp Lib "inpout32.dll" _
Alias "Inp32" (ByVal Portadress As Integer) As Integer
Private Declare Sub Out Lib "inpout32.dll" _
Alias "Out32" (ByVal Portadress As Integer, ByVal Value As Integer)
Private Sub Form_Load()
'Adresserar skrivarportens tre linjer till LPT 1
DataLinje = 888 'basadress+0 eller &H378 i hex
StatusLinje = 889 'basadress+1 eller &H379 i hex
KontrollLinje = 890 'basadress+2 eller &H37A i hex
'Spänningsmatar kretsen igenom att dra pin 2+3+4 höga (binär 1+2+4=7)
'alla andra datapin är låga
Out DataLinje, 7
'Kontrollinjen används inte i detta projekt, men vi kan lika gärna sätta alla dessa
'pinnar låga (de flesta på kontrollinjen är inverterade, därav värdet 203)
Out KontrollLinje, 203
'Ger fönstret en rubrik och sätter mått så att rubriken får plats
Form1.Caption = "Här kommer siffor/bokstäver/tecken om allt fungerar som det ska"
Form1.Width = 8000
Form1.Height = 1000
'Tabellen som beskriver alla siffror/bokstäver/tecken som kan förekomma
nummerdata(0) = "D"
nummerdata(1) = "1"
nummerdata(2) = "2"
nummerdata(3) = "3"
nummerdata(4) = "4"
nummerdata(5) = "5"
nummerdata(6) = "6"
nummerdata(7) = "7"
nummerdata(8) = "8"
nummerdata(9) = "9"
nummerdata(10) = "0"
nummerdata(11) = "*"
nummerdata(12) = "#"
nummerdata(13) = "A"
nummerdata(14) = "B"
nummerdata(15) = "C"
End Sub
Private Sub Timer1_Timer()
'Läser data ifrån statuslinjen
InData = Inp(StatusLinje)
'Om datan är oförändrad mot tidigare, återgå till att vänta.
'Skulle vi inte ha med denna rad skulle rutinen nedan köras varje gång, även om
'datan på statuslinjen vore oförändrad, och det vore ju onödigt + att det skulle ta
'onödigt med CPU
If InData = Tidigare Then Exit Sub
'Om nu datan skulle vara förändrad mot tidigare så fortsätter vi i rutinen nedan
'Nollställer variabeln QData som motsvarar Q1-Q4 i decimal form
QData = 0
'Kontrollerar pin 13 (bitvärde 16) som är kopplat till StD
'Är inte StD hög så går vi till slutet på rutinen, skulle vi inte ha med denna rad
'så skulle tex en siffra/bokstav/tecken kunna läsas av flera gånger trots att den
'igentligen bara förekom en gång.
'
'Denna hindrar också att någon skräpdata tas emot första gången rutinen körs och
'inget har hunnit hända än.
If Not InData And 16 Then GoTo slut
'Här nedan kontrollerar vi de fyra utgångarna ifrån MT8870 (Q1-Q4) och omvandlar
'det binära värdet som vi får in till ett värde i decimal form som vi senare kan
'använda oss av för att få reda på vilken siffra/bokstav/tecken som har tagits emot
'genom att jämföra det decimala talet med tabellen.
'Bitvärde: 1 2 4 8 16 32 64 128
'Pin LPT: X X X 8 13 12 10 11
'MT8870: X X X Q3 StD Q2 Q1 Q4
'Kontrollerar pin 10 (bitvärde 64) som är kopplat till Q1
If InData And 64 Then QData = QData + 1
'Kontrollerar pin 12 (bitvärde 32) som är kopplat till Q2
If InData And 32 Then QData = QData + 2
'Kontrollerar pin 15 (bitvärde 8) som är kopplat till Q3
If InData And 8 Then QData = QData + 4
'Kontrollerar pin 11 (bitvärde 128) som är kopplat till Q4
If Not InData And 128 Then QData = QData + 8
'Nu är Q1-Q4 kontrollerade och vi har fått ut ett decimalt tal, vi använder detta
'talet mot tabellen nummerdata för att få fram vilken siffra/bokstav/tecken det var
'som togs emot och därefter lägger vi till den siffran i variabeln nummer.
Nummer = Nummer + nummerdata(QData)
'Visar numret i Statusbaren
Form1.Caption = Nummer
slut:
'Sparar läst data ifrån StatusLinjen för att kunna hålla reda på om den ändrats
'eller ej nästa gång timern körs.
Tidigare = InData
End Sub
Direktåtkomsten till skrivarporten är som sagt lite begränsad, därför måste en DLL som heter inpout32.dll läggas i c:\windows\system32 för att projektet ska fungera, denna fil finns att ladda ned lite här och var på nätet (kommer inte ihåg någon adress just nu)
Programmet är mycket enkelt och avsett som en grund att bygga vidare på, alla inkommande / utgående data presenteras i statusbaren för att man ska se att hårdvaran fungerar som den ska.
Detta kanske gav XP användarna lite mera kött på benen angående nummerpresentatör till datorn. Jag slänger kanske upp en helt egen sida med lite mera programexempel mm vid senare tillfälle.