Newsgroup: it.hobby.elettronica.digitale
Titolo: Problema con la parallela

Salve a tutti.
Ho realizzato un circuitino che dialoga,tramite la parallela, con il pc.
Se però utilizzo lo stesso circuito su un PC portatile non funziona, io
utilizzo l'indirizzo della porta parallela 88.
Dove sbaglio?
Grazie
--------------------------------
Inviato via 
http://usenet.libero.it

 Dove sbaglio?
Intanto l'indirizzo 88, sia decimale che esadecimale, e' sbagliato.
Gli indirizzi sono 0x378, 0x278, 0x3BC, comunque controlla perche'
li sto citando a memoria.
Tieni presente che non esiste un indirizzo fisso, devi provarli tutti
da software.
Altra causa potrebbero essere i livelli delle tensioni, che possono essere
diversi anche se rientrano entrambi nello standard Centronics.

 wrote in message
news:v5wPa.166089$lK4.4...@twister1.libero.it...


 Grazie
Bella domanda!
In genere e' il bios che in fase di power up e test fa la ricerca delle
porte paralleli presenti negli indirizzi riservati ad essa, che sono 4 o 5.
Il test consiste nello scrivere in tali indirizzi di I/O un dato e
rileggerlo:
se il dato scritto coincide con quello riletto significa che e' installata
una porta e a quel punto il bios scrive gli indirizzi delle porte parallele
 in memoria agli indirizzi 0040:0008 e seguenti.
Il problema con Windows pero' si complica a causa della virtualizzazione
dei port e facilmente i dati che troviamo a 0040:0008 non corrispondono
a port fisici.
La soluzione piu' semplice e' di provare a scrivere e rileggere i possibili
port paralleli come fa il bios e trovare in questo modo gli indirizzi dei
port
fisici presenti.

Ti consiglio di impostare da BIOS la porta parallela com SPP (Standard 
Parallel Port)... prova potrebbe essere questo il problema!
Silvio


#include <stdio.h>
#include <dos.h>
void main(void)
{
  unsigned int far *ptraddr;  /* Pointer to location of Port Addresses */
  unsigned int address;       /* Address of Port */
  int a;
  ptraddr=(unsigned int far *)0x00000408;
  for (a = 0; a < 3; a++)
    {
     address = *ptraddr;
     if (address == 0)
		printf("No port found for LPT%d \n",a+1);
     else
		printf("Address assigned to LPT%d is %Xh\n",a+1,address);
     *ptraddr++;
    }
}
rosario a écrit:


#include <stdio.h>
[...]
Sotto Windows l'indirizzamento diretto a locazioni di memoria non funziona,
almeno sotto NT - 2k.
Io utilizzo, compilato con djgpp:
#include <stdio.h>
#include <dos.h>
#include <sys/movedata.h>
typedef unsigned long dword;
typedef unsigned short word;
word peekw (dword addr);
int main(void)
{
  dword ptraddr;	/* Pointer to location of Port Addresses */
  word address;	/* Address of Port */
  int a;
  ptraddr = 0x00000408;
  for (a = 0; a < 3; a++) {
    address = peekw(ptraddr);
    if (address == 0)
      printf("No port found for LPT%d \n",a+1);
    else
      printf("Address assigned to LPT%d is %Xh\n",a+1,address);
    ptraddr += 2;
  }
}
word peekw (dword addr)
{
  word data;
  _dosmemgetw(addr,1,&data);
  return data;
}
Tieni presente che comunque Win 2k reindirizza a suo piacimento le risorse di
sistema, per cui l'indirizzo effettivo delle porte LPT può differire da ciò che
ti dice il programmino.
La soluzione più sicura è controllare gli indirizzi delle risorse di sistema
con Risorse del computer -> proprietà -> hardware -> gestione periferiche ->
porte (com, lpt).
Luigi
____________________________________________________________
Napoli - Italy
Home Page: 
http://digilander.libero.it/theghost63
____________________________________________________________
Sostituisci ***luigi*** con l.candurro per scrivermi
Replace ***luigi*** with l.candurro to mail me
____________________________________________________________