LPT-Pin über Mega8 abfragen

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 29 11 2024  09:42:14      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : 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
ICQ Status  

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
ICQ Status  

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


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


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