PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : problem beim quelltext



FJK
03.06.2004, 20:28
Hallo

(win98 borland 5.0)
kann mir jemand bei meinen quelltext helfen ich kann mir nicht erklären warum er nicht funktioniert (meine leds leuchten nicht)
es ist eine einfache ampelsteuerung die leds über den lpt ansteuert

grüne led
gelbe led
rote led
gelbe und rote led
enlosschleife

ich habe den quelltext aus einen buch rausgeschrieben
bei dem buch ist auch eine fertige exe bei die funktioniert




//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <time.h>
#include <conio.h>
#define Par_Ss 0x378
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//==============================================
void warten(int);
//==============================================
void outp (unsigned int portadr, unsigned char value)
{
_asm mov edx,portadr
_asm mov al, value
_asm out dx,al
}

unsigned char inportb(unsigned int portadr)
{
unsigned char value;
_asm mov edx,portadr
_asm mov al,value
_asm out dx,al
}
//==============================================
void main (void)
{
while (!kbhit())
{
outp(Par_Ss,1);
warten(1000);

outp(Par_Ss,2);
warten(1000);

outp(Par_Ss,4);
warten(1000);

outp(Par_Ss,6);
warten(1000);
}
}
//==============================================
void warten(int zeit)
{
int a;
a = clock() ;
while(clock() - a < zeit);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------


mfg flo

martin
03.06.2004, 21:55
Hallo,

gibts vom Compiler keine Fehlermeldungen?
Liegt dein Parallelport wirklich auf 0x378?

Im Code selbst konnte ich auf die schnelle keinen Fehler finden.
(Zu dem Assemblerzeug kann ich leider nichts sagen)

Grüsse, Martin

FJK
04.06.2004, 09:15
Hallo

es kommen zwei fehler

[C++ Warnung] Unit1.cpp(22): W 8002 Compilierung mit Assembler-Sprachfähigkeiten neu gestartet

[C++ Warnung] Unit1.cpp(33): W 8070 Funktion sollte einen Wert zurückgebe

aber das program wird ausgefürt
ob mein parallelport wirklich auf 0x378 liegt kann ich nicht genau sagen
aber ein program hat mir diese adresse ausgegeben

gruß flo

Ford
04.06.2004, 19:22
Schau mal hier :http://www.hut.fi/Misc/Electronics/circuits/parallel_output.html

da ist alle ganz gut erklärt.

seven
05.06.2004, 07:14
falls du das buch "messen, steuern und regeln über die parallelschnittstelle" von wolfgang link meinst, dann hast du beim abtippen wohl einen fehler gemacht. die funktion outp stimmt soweit. die funktion inportb soll einen unsigned char zurückgeben, am funktionsende steht aber kein return. das ist mit der 2. fehlermeldung gemeint. das erste ist eine warnung, die der compiler (borland) ausgibt wenn assembler verwendet wird. ist dir aufgefallen dass in inportb das gleiche steht wie in outp?
wenn nicht: auf seite 38 unten in oben genanntem buch steht

unsigned char inportb(unsigned int portadr)
{
unsigned char value;
_asm mov edx,portadr // heißt soviel wie portadresse wird in register edx kopiert
_asm in al,dx // register (eingang?) dx in al kopiert
_asm mov value,al // al in variable geschrieben
return(value); // eingelesener wert wird zurückgegeben
}

wenn du nichts zurückgeben willst musst du im funktionskopf (da wo der name der funktion steht) void als rückgabewert angeben - wie bei outp.
du könntest zb die variable value global definieren, ist aber nicht sinnvoll und eine potenzielle fehlerquelle.

FJK
07.06.2004, 15:25
hallo seven, und danke

Ja das buch meine ich

die funktion inportb
ist falsch aber die brauche ich doch eigendlich nicht
denn rest habe ich überprüft es sind keine tipp fehler zu finden.
kann das sein das ich die fahlschen pins ansteuere?

ford deine seite hat mir nicht wirklich weiter geholfen trotzdem danke

seven
07.06.2004, 21:25
mit der funktion outp kannst du nur 8 pins des parallelports beschreiben (ich denke du hast einen plan über die pinbelegungen). um die pinbelegung rauszufinden musst du einfach zb 2^0 = 1 (dezimal) ins ausgaberegister schreiben (mit outp). wenn alles stimmt müsste pin 0 logisch 1 führen (um die 5V, min 2,4V soviel ich weiss). um pin 1 anzusteuern musst du 2^1 = 2 ausgeben usw (bis 7). also immer 2 hoch pin nummer. die spannungswerte misst du dann mit einem multimeter oder bastelst dir einen logiktester (zwei leds (mit vorwiderstand) in reihe zwischen 0 und 5V schalten und "messdraht" zwischen den leds anschließen, je nach pegel leuchtet dann die eine oder andere led - gibts bestimmt irgendwo schaltpläne dazu). falls der port keine reaktion zeigt schreibts du - wie martin schon bemerkt hat - vielleicht auf die falsche adresse. kannst ja mal folgende adressen ausprobieren: 0x278, 0x378, 0x3BC (bei der dritten bin ich mir nicht ganz sicher). will grade meinen rechner nicht neustarten aber das wird glaube ich auch ganz am anfang beim booten auf dem bildschirm ausgegeben (?).
was mir gerade auffällt: du willst pin 1, 2, 4 und 6 ansteuern?
du kannst den parport nicht pinweise beschreiben (soviel ich weiss - lasse mich immer gern eines besseren belehren :-)) - du gibst immer einen wert zwischen 0 und 255 (dezimal) aus. wenn du diesen wert dann ins dualsystem umrechnest und die einzelnen stellen der dualzahl auf die pins des parport umlegst (stelle 0 - 7 zu pin 0 - 7) erhälts du die pegel auf den pins. ich nehme an du meinst mit pin 1 den pin D0, mit pin 2 D1 usw...
wenn du D3 ansteuern willst (pin 4) musst du dezimal 8 ausgeben (weil 2 hoch 3 = 8). d8 = b'00001000'. deshalb beginnt man auch bei 0 an zu zählen und nicht bei 1. wenn du bei deinem windows taschenrechner die ansicht auf wissenschaftlich umstellst kannst du zahlen zwischen vielen zahlenformaten umrechnen. du möchtest zb D0, D3, D4 und D6 anschalten. stelle deinen rechner auf binär und gib 01011001 ein und drücke auf dezimal - der rechner zeigt dir welche zahl du auf den port ausgeben musst.

FJK
12.06.2004, 10:53
Hallo
wie ich das sehe steuere ich die richtigen pins an
und die adresse stimmt anscheind auch

kann mir nicht jemand einen leicht verständlichen geben quelltext wo man einen pin ansteuert

mfg Flo

NumberFive
12.06.2004, 11:12
hallo flo,

vielleicht hilft das

http://www.geekhideout.com/iodll.shtml

einfachen Quell code habe ich nicht da ich unter Win200 schreiben und da draf man nicht so auf die Ports zu greifen. Vielleicht ist das auch bei dir das porblem das win dir den zu grif auf die ports verbitet.

Einzeln Pins ist doch ganz einfach:

7 6 5 4 3 2 1 0 Leitung
0 1 0 1 0 0 0 0 Zustand

ergibt: 0*1+0*2+0*4+0*8+1*16+0*32+1*64+0*128 = 80
Also auf den Port den wert 80 schreiben dann sollten die leds richtig leuchten

FJK
13.06.2004, 22:08
hallo
ich habe mir die seite angesehen aber es hat mir nicht wirklich weiter geholfen. kann auch an meinen miesen englisch kenntnissen liegen
trotzdem danke für deine hilfe
kennst du vielleicht eine deutsche seite

ansonsten glaube ich das ich die richtigen adressen ansteuere

mfg

Starlemon
02.07.2004, 20:10
Funktionierts inzwischen? Falls nicht denke ich vielleicht einen lösungsansatz zu haben. Du mußt das Strobe Signal setzen damit er die Daten auf den LPT legt und zurücknehmen wenn du willst das die Ausgänge nicht angesteuert sind. Beim LPT mußt du demnach

#define LPT1 0x378
.
.
.
int Steuerregister;
Steuerregister = inp(LPT1+0x2);
//Lesen des Steuerregisters
Steuerregister = (Steuerregister|0x01);
//STROBE auf High setzen ( Daten den LPT1 ausgeben lassen )
outp(LPT1+0x2,Steuerregister);
//Schreiben des Modifizierten Steuerregisters