LPT-Pin über Mega8 abfragen Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
LPT-Pin über Mega8 abfragen |
|
|
|
|
BID = 810825
gang-himself Gelegenheitsposter
Beiträge: 50 Wohnort: Regensburg
|
|
Hallo Leute,
erstmal vorweg, bin ein ziemlicher Elektronik-Laie und brauche eure Hilfe.
Ich habe hier eine komerzielle PC-Software, die über Pin 2 des LPT-Ports eine externe Hardware-Komponente steuert, indem sie diesen Pin wahlweise auf Hi oder Lo setzt.
Nun wird die Komponente bei mir demnächst nicht mehr in der Nähe des PCs sein, sondern über eine Cat-Leitung verbunden, über die ich ein VGA und ein RS232-Signal schicke. Ich brauche also eine Schaltung, die den Pin-Zustand in einen RS232-Befehl umsetzt.
Soweit so gut, habe ich mit dem MyAVR-Board gebaut und programmiert, funktioniert auch fast.
ABER:
Der LPT-Pin auf Hi liegt auf +5V gegen LPT-Masse und wird vom Mega-8 korrekt erkannt.
Der LPT-Pin auf Lo liegt auf +0,07V gegen LPT-Masse und dann springt der Mega-8 ständig zwischen Hi und Lo hin und her.
Ich habs mit und ohne gesetztem internen Pull-Up probiert, und auch mal einen externen Pull-Down (zw. 10k und 1,6k hab ich probiert) gesetzt. Hat alles nichts gebracht.
Wenn ich die LPT-Masse nicht mit der Mega8-Masse verbinde, sondern über einen Spannungsteiler etwas höher setze, geht leider auch der LPT-Pin entsprechend höher (war leider ein Denkfehler).
Da ja der LPT-Port relativ empfindlich ist, weiß ich nicht genau, was ich tun soll. Ich spiele momentan mit dem Gedanken, einfach über einen Transistor ein Relais bedienen zu lassen, das wiederum quasi als Schalter am Mega8-Port anliegt...
Oder gibts da eine schönere/einfachere Lösung.
Oder hab ich einfach nur einen Fehler gemacht, und es müsste sowieso gehen, den LPT-Out-Pin direkt an den Mega8-In-Pin zu hängen?
Oder brauch ich da wirklich einen Optokoppler? Wenn ja, wie verbau ich den (die Dinger kenn ich gar nicht...)
LG und Danke,
Wolfgang
P.S.: Hab natürlich die Suche benutzt, bin aber ein relativer Elektronik-Laie und hab (darum?) nichts brauchbares gefunden. |
|
BID = 810834
gang-himself Gelegenheitsposter
Beiträge: 50 Wohnort: Regensburg
|
|
Hab mich mal ein bischen über Optokoppler informiert und kann mir vorstellen, dass das doch das sinnvollste wäre.
Leider bin ich da schon wieder überfordert, welches Bauteil (z.B. von Conrad oder noch lieber von RS-online.com) für mich da passend wäre...
LG,
WOlfgang |
|
BID = 810835
Offroad GTI Urgestein
Beiträge: 12742 Wohnort: Cottbus
|
Zitat :
| Der LPT-Pin auf Lo liegt auf +0,07V gegen LPT-Masse und dann springt der Mega-8 ständig zwischen Hi und Lo hin und her. |
Dies ist aber sehr ungewöhnlich.
Eigentlich sollte er Spannungen <0,8V schon als LOW erkennen. 70mV sollten demnach erstrecht erkannt werden.
Was mach denn der Eingang, wenn du ihn direkt auf Masse legst?
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber.
[ Diese Nachricht wurde geändert von: Offroad GTI am 19 Jan 2012 10:46 ]
|
BID = 810838
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Wie sieht vor allem der Quellkode aus?
Du musst zunächst den Pin als Eingang definieren (Register DDRx), und den Zustand über das Register PINx abfragen.
Ein zusätzlicher Widerstand ist ratsam.
_________________
|
BID = 810849
gang-himself Gelegenheitsposter
Beiträge: 50 Wohnort: Regensburg
|
Zitat :
| Wie sieht vor allem der Quellkode aus? |
Sorry, hab ich vergessen...
Quellcode kommt heute Nachmittag.
Aber wenn ich nicht mit dem LPT verbinde, sondern den Pin direkt mit Masse oder +5V verbinde, klappt es einwandfrei...
Das komische ist auch, dass er nicht schnell hin und her springt, sondern oft ein paar Sekunden vergehen, bis er wieder springt...
Wolfgang
|
BID = 810866
gang-himself Gelegenheitsposter
Beiträge: 50 Wohnort: Regensburg
|
So, der relevante Teil des Quellcodes...
Wie gesagt, bin definitiv kein Profi, drum vielleicht einiges unschönes im Code.
Anregungen seh ich gerne...
Code : |
$regfile = "m8def.dat" ' we use the M8
$crystal = 3686400
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40
Config Portb.5 = Input
Portb.5 = 1
Dim M As Long , L As Byte , Q As String * 1 , S As String * 25 , U As Bit , V As Long , W As Byte , X As Bit , Y As Bit , Z As Byte , Charwait As Byte
Config Serialin = Buffered , Size = 25
Config Serialout = Buffered , Size = 25
Enable Interrupts
Declare Sub Prb51
Do
Debounce Pinb.5 , 0 , Prb50 , Sub
If Pinb.5 = 1 Then Call Prb51
Loop
Prb50:
If U = 1 Then Print "C0E" 'Shutter auf
Reset U
Return
Sub Prb51:
If U = 0 Then Print "C0D" 'Shutter zu
Set U
End Sub
|
|
Wie bereits geschrieben, hab ich es auch schon ohne den internen Pull-Up versucht, testweise stattdessen auch einen externen Pull-Down...
Wolfgang
|
BID = 810946
K. Gesprächig
Beiträge: 116 Wohnort: Leipzig
|
gibt es noch einen anderen Grund warum RS232? Oder ist es einfach dem Übertragungsweg geschuldet?
Wenn es nur der eine Pin ist, könnte man den auch einfach so auf die RS232 des Medienchangers legen... der Zustand würde ja drüben genauso wieder anliegen...
[ Diese Nachricht wurde geändert von: K. am 20 Jan 2012 0:52 ]
|
BID = 810974
clembra Inventar
Beiträge: 5404 Wohnort: Weeze / Niederrhein
|
Ein Optokoppler wäre auch wegen der daraus folgenden Potentialtrennung (sofern es keine anderen Verbindungen gibt) sinnvoll. Ich habe für solche Zwecke bisher den CNY-17 eingesetzt.
Hast du mal einen Spannungsmesser oder, falls vorhanden, Oszilloskop parallel zum ATmega-Eingang angeklemmt?
Wenn es nur das eine Signal ist und der RS-232 wirklich -/+12V braucht hilft ein MAX232, der erzeugt auch die nötigen Spannungen.
_________________
Reboot oder be root, das ist hier die Frage.
|
BID = 810984
gang-himself Gelegenheitsposter
Beiträge: 50 Wohnort: Regensburg
|
RS232 weil ich damit dann einen Beamer ansteuere.
Vielleicht war es einfach irreführend, nur die relevanten Code-Teil anzugeben. Hier nochmal der gesamte Code...
Code : |
$regfile = "m8def.dat" ' we use the M8
$crystal = 3686400
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40
Config Portd.2 = Input
Config Portd.3 = Input
Config Portd.4 = Input
Config Portd.5 = Input
Config Portd.6 = Input
Config Portd.7 = Input
Config Portb.0 = Input
Config Portb.1 = Input
Config Portb.2 = Input
Config Portb.3 = Input
Config Portb.4 = Input
Config Portb.5 = Input
'Config Portc.0 = Input
'Config Portc.3 = Input
Config Portc.4 = Output
Config Portc.5 = Output
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1
Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Portb.5 = 1
'Portc.0 = 1
'Portc.3 = 1
Dim M As Long , L As Byte , Q As String * 1 , S As String * 25 , U As Bit , V As Long , W As Byte , X As Bit , Y As Bit , Z As Byte , Charwait As Byte
Config Serialin = Buffered , Size = 25
Config Serialout = Buffered , Size = 25
Enable Interrupts
'Ger‰te-ID
M = 200001
Declare Sub Status1 'Statusabfrage f¸r Sanyo-Beamer
Declare Sub Datenempfang
'Declare Sub Prb50
Declare Sub Prb51
Do
Debounce Pind.2 , 0 , Prd2 , Sub
Debounce Pind.4 , 0 , Prd4 , Sub
Debounce Pind.5 , 0 , Prd5 , Sub
Debounce Pind.6 , 0 , Prd6 , Sub
Debounce Pind.7 , 0 , Prd7 , Sub
Debounce Pinb.0 , 0 , Prb0 , Sub
Debounce Pinb.1 , 0 , Prb1 , Sub
Debounce Pinb.2 , 0 , Prb2 , Sub
Debounce Pinb.3 , 0 , Prb3 , Sub
Debounce Pinb.5 , 0 , Prb50 , Sub
'Debounce Pinb.5 , 1 , Prb5b , Sub
'Debounce Pinc.0 , 0 , Prc0 , Sub
'Debounce Pinc.3 , 0 , Prc3 , Sub
If Pinb.5 = 1 Then Call Prb51
M = M + 1 'Timer f¸r Statusabfrage Sanyo
If M > 200000 Then
Clear Serialin
S = ""
Print "CR0"
Waitms 100
M = 0
Set Z
End If
If Ischarwaiting() = 1 Then Call Datenempfang
If Z = 1 Then Call Status1 'Wenn Statusabfrage gestartet
If X = 1 Then Call Status1 'Wenn Return-Zeichen empfangen
If W = 1 Then
V = V + 1
If V < 1500 Then
Portc.4 = 1
Portc.5 = 1
Elseif V > 1500 Then
If V > 3000 Then
V = 0
Elseif V < 3000 Then
Portc.4 = 0
Portc.5 = 0
End If
End If
Elseif W = 2 Then
V = V + 1
If V < 3000 Then
Portc.4 = 0
Portc.5 = 1
Elseif V > 3000 Then
If V > 6000 Then
V = 0
Elseif V < 6000 Then
Portc.4 = 0
Portc.5 = 0
End If
End If
End If
Loop
'-------------------------------------
Sub Datenempfang:
Do
Q = Waitkey()
S = S + Chr(q)
Charwait = Ischarwaiting()
If Asc(q) = "{013}" Then
Set X
Charwait = 0
End If
Loop Until Charwait = 0
End Sub
'----------------------------------------------------
Sub Status1
Reset X
W = 0
If Len(s) = 3 Then
L = Val(s)
Select Case L
Case 00 'An
Portc.4 = 1
Portc.5 = 0
W = 0
Case 20 'Hochfahren
Portc.4 = 1
Portc.5 = 1
W = 0
Case 40 'Runterfahren
Portc.4 = 1
Portc.5 = 1
W = 0
Case 80 'Aus
Portc.4 = 0
Portc.5 = 1
W = 0
Case 28 'Runterfahren weil zu heifl
W = 1
Case 21 'Abk¸hlen nach dem Ausschalten des Projektors bei ausgeschalteter Lampe
Portc.4 = 1
Portc.5 = 1
W = 0
Case 81 'Aus
Portc.4 = 0
Portc.5 = 1
Case 88 'Aus nach zu heifl
W = 2
End Select
Set X
Elseif S = "{063}{013}" Then
Set X
Elseif S = "{006}{013}" Then
Set X
End If
If X = 0 Then 'Keine Kommunikation
Portc.5 = 0
Portc.4 = 0
End If
Reset X
If Z = 1 And Right(s , 1) <> "{013}" Then 'Statusabfrage aktiv
Reset Z
Else
Reset Z
S = ""
End If
End Sub
'---------------------------------------
Prd2:
If Pind.3 = 1 Then
Print "C00" 'AN
Elseif Pind.3 = 0 Then
Print "C01" 'Aus
End If
M = 200001
Waitms 1000
Return
Prd4:
Print "C4B" 'Fokus+
Return
Prd5:
Print "C4A" 'Fokus-
Return
Prd6:
Print "C47" 'Zoom+
Return
Prd7:
Print "C46" 'Zoom-
Return
Prb0:
If Pinb.4 = 0 Then
Print "C8E" 'Trapez Up
Elseif Pinb.4 = 1 Then
Print "C5D" 'Lens Up
End If
Return
Prb1:
If Pinb.4 = 0 Then
Print "C8F" 'Trapez Down
Elseif Pinb.4 = 1 Then
Print "C5E" 'Lens Down
End If
Return
Prb2:
If Pinb.4 = 0 Then
Print "C91" 'Trapez Left
Elseif Pinb.4 = 1 Then
Print "C5F" 'Lens Left
End If
Return
Prb3:
If Pinb.4 = 0 Then
Print "C90" 'Trapez Right
Elseif Pinb.4 = 1 Then
Print "C60" 'Lens Right
End If
Return
Prb50:
If U = 1 Then Print "C0E" 'Shutter auf
Reset U
Return
Sub Prb51:
If U = 0 Then Print "C0D" 'Shutter zu
Set U
End Sub
|
|
@clembra:
An Verbindungen habe ich eben den LPT (Pin 2 und 19), den RS232 der auf einen Extender geht, welcher wiederum an einem Steckernetzteil und einer Cat-Leitung hängt, außerdem ein Steckernetzteil. Das wars.
Was brauch ich alles für Bauteile, um den CNY-17 richtig zu verbauen?
Kann ich da einfach Masse und Pin vom LPT anschließen und ausgangsseitig mit +5V, Masse und dem Eingangspin des Mega verbinden? Oder muss ich damit dann noch ein Relais ansteuern?
LG,
Wolfgang
|
BID = 810997
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Mach das weg
Debounce Pinb.5 , 0 , Prb50 , Sub
_________________
|
BID = 810999
gang-himself Gelegenheitsposter
Beiträge: 50 Wohnort: Regensburg
|
@DonComi
Zitat :
| Mach das weg
Debounce Pinb.5 , 0 , Prb50 , Sub |
Und wie soll der Shutter dann geöffnet werden?
Meinst du, mit einfach nur "if pinb.5=0 then print..."
gehts besser?
Wolfgang
|
BID = 811035
clembra Inventar
Beiträge: 5404 Wohnort: Weeze / Niederrhein
|
Der CNY-17 ist (wie die meisten mir bekannten OK) eine LED auf der einen Seite und ein Transistor auf der anderen.
Eingangsseitig gelten daher die gleichen Grundsätze wie bei einer normalen LED, sprich es wird ein Vorwiderstand benötigt. Vorwärtsspannung habe ich nicht im Kopf, steht aber im Datenblatt. Der nötige Widerstand lässt sich dann mittels LED-FAQ berechnen.
Am Ausgang würde es genügen den Eingangs-Pin des AVR mit dem Kollektor des Optokopplers zu verbinden, dessen Emitter kommt an GND. Dann den AVR-PullUp aktivieren und feddisch.
Ein Relais brauchst du schon aus dem Grund nicht, weil dann kein Optokoppler mehr für die Potentialtrennung nötig wäre
_________________
Reboot oder be root, das ist hier die Frage.
|
BID = 811254
gang-himself Gelegenheitsposter
Beiträge: 50 Wohnort: Regensburg
|
@clembra:
Danke, damit kann ich was anfangen. Dann werd ich das so bauen. Warums anders nicht geht versteh ich zwar immer noch nicht, aber zumindest läufts dann...
...und das ist ja die Hauptsache (zumindest diesmal )
Wolfgang
|
BID = 811348
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Hallo Wolfgang,
Dieser Debounce-Kram ist für Taster am Eingang (Entprellen in Software).
Das ist hier völlig fehl am Platze.
Was dich interessiert, ist der Zustand des Eingangpins.
Es würde also reichen, den Pin auf Änderungen zu überwachen und nur dann eine Message zu senden, wenn diese Änderung stattgefunden hat.
Da keinem hier bekannt ist, mit welcher Geschwindigkeit sich der Pin ändern kann kann man nur spekulieren.
Je nach Änderungsgeschwindigkeit kommt Polling in Frage, also permanentes Abfragen des Pins oder auch eine interruptbasierte Lösung.
Angeommen, dein Signal liegt an PinB, 5 an.
Dann ist der interessante Inhalt des PinB-Register die Veränderung des 5. Bits, hexadezimal kann man ein gesetztes Bit an der fünften Stelle so ausdrücken: &H20.
Dim Ist As Byte
Dim War As Byte
Dim Bitwert As Boolean
War = Not PinB
Do
Ist = PinB And &H20 'Register lesen und nur das fünte Bit maskieren
If Ist And &H20 Then 'Bitwert bestimmen
Bitwert = 1
Else
Bitwert = 0
End If
If (Ist Xor War) <> 0 Then 'Änderung eingetreten
Übertrage(Bitwert)
End If
War = Ist
Loop
So oder so ähnlich kann das aussehen, ich kann BASIC nicht wirklich gut.
Aber allgemeines Vorgehen sollte klar sein: via Xor-Operation überprüfen, ob sich alter und neuer Wert im fünften Bit unterscheiden, wenn ja, dann aktuellen Bitzustand versenden.
Alternativ würde ich das ganze mit einem level change interrupt in Hardware lösen, der AVR kann bestimmte Pins auf Pegel oder Pegeländerungen überwachen und bei einem entsprechenden Ereignis dann einen bestimmten Programmteil ausführen.
Dazu sollte man allerdings ins Datenblatt schauen, denn ich weiß nicht, wie man das mit BASCOM macht.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 22 Jan 2012 16:34 ]
|
BID = 811760
gang-himself Gelegenheitsposter
Beiträge: 50 Wohnort: Regensburg
|
@clembra:
Danke, funktioniert !!
@DonComi:
Ja, dass debounce für Schalter ist weiß ich. Hast recht. Habs jetzt rausgeschmissen. Die Interrupt-Lösung wäre für meine Zwecke die sauberste Lösung, aber momentan funktioniert es und optimierter Code ist (diesmal) nicht wichtig, da es nur um eine Fernsteuerung für einen Beamer geht. Da muss nichts schnell sein...
LG und Danke allen,
Wolfgang
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag heute wurden bisher 3 Beiträge verfasst © x sparkkelsputz Besucher : 182422140 Heute : 1180 Gestern : 5459 Online : 359 29.11.2024 9:42 7 Besucher in den letzten 60 Sekunden alle 8.57 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.103227853775
|