| Precedente :: Successivo |
| Autore |
Messaggio |
aldofad
Registrato: 04/02/07 20:14 Messaggi: 15
|
Inviato: Mar 13 Feb 13 2007 11:39 Oggetto: SX15-Evo, output da FLEX-ANALOG |
|
|
Ciao,
ho una SX15-Evo e una FLEX-ANALOG.
Rilevo correttamente temperatura e tensioni dei canali di input dalla FLEX-ANALOG, ma purtroppo non ho idea di come fare a produrre tensioni in uscita sui due canali disponibili.
Ho guardato l'esempio disponibile http://www.areasx.com/files/articoli/8143/SX15E_FLEXA.zip
ma per quanto riguarda l'output vedo solo queste define:
| Codice: |
// Output channel
#define STROBE BitWrPortI(PBDR,&PBDRShadow,1,5);BitWrPortI(PBDR,&PBDRShadow,0,5)
#define CLOCK BitWrPortI(PBDR,&PFDRShadow,1,4);BitWrPortI(PBDR,&PFDRShadow,0,4)
#define SET_DATA BitWrPortI(PBDR,&PFDRShadow,1,7)
#define CLEAR_DATA BitWrPortI(PBDR,&PFDRShadow,0,7) |
Potreste cortesemente postare una funzioncina che per esempio produce 2V sui due canali per 2 secondi?
Magari è una banalità, ma purtroppo sono neofita al riguardo...
grazie mille
aldo |
|
| Torna in cima |
|
 |
battisti
Registrato: 16/09/04 08:31 Messaggi: 811
|
Inviato: Mer 14 Feb 14 2007 09:49 Oggetto: |
|
|
Non appena possibile lo faremo.
Le modifiche da fare sono piuttosto semplici: nella funzione PCF8591Read devi passare l'indirizzo con il bit meno significativo attivo, poi il byte di controllo impostato a 0x44 (invece che 0x04 come nella funzione di lettura) e poi trasmettere il valore da impostare sull'uscita D/A. _________________ ----------------------------------------
Area SX
Massimo Battisti
---------------------------------------- |
|
| Torna in cima |
|
 |
desantix
Registrato: 24/09/04 11:22 Messaggi: 890
|
Inviato: Mer 14 Feb 14 2007 10:47 Oggetto: |
|
|
| Codice: |
//FUNZIONE controllo DA
int write_PCF8591(unsigned char address, unsigned char buf) {
i2c_stop();
i2c_start();
if (i2c_outbyte(0x90 | (address<<1))==0) {
i2c_stop();
printf("Ricevuto NACK 1\n");
return -1;
}
if (i2c_outbyte(0x40)==0) {
i2c_stop();
printf("Ricevuto NACK 2\n");
return -1;
}
if (i2c_outbyte(buf)==0) {
i2c_stop();
printf("Ricevuto NACK 3\n");
return -1;
}
i2c_stop();
return 1;
} |
La funzione che ti ho postato l'ho scritta in in C per linux (FOX e SX ARM LinuX) puoi facilmente modificarla per rabbit.
alla variabile
unsigned char buf
devi passare un valore compreso tra 0 e 255
Ciao
Daniele |
|
| Torna in cima |
|
 |
aldofad
Registrato: 04/02/07 20:14 Messaggi: 15
|
Inviato: Gio 15 Feb 15 2007 02:01 Oggetto: |
|
|
Grazie mille a entrambi della pronta risposta.
Vista la funzione di Daniele ho un altro problemino, come faccio a determinare l'address dei canali di uscita?
Ho consultato la documentazione http://www.areasx.com/files/articoli/8138/SX_Flex_Analog_Guide.pdf
e dato che ho S2:A1 aperto e S2:A2 chiuso, utilizzo gli indirizzi 0x02 e 0x03 e leggo correttamente. Però non vedo nulla sulla docum. per impostare l'address di out. Sicuramente mi sto perdendo qualcosa...
grazie ancora
aldo |
|
| Torna in cima |
|
 |
battisti
Registrato: 16/09/04 08:31 Messaggi: 811
|
Inviato: Gio 15 Feb 15 2007 09:33 Oggetto: |
|
|
L'indirizzo riguarda il Chip nella sua interezza, quindi l'address è lo stesso per i canali di ingresso e di uscita. Ogni chip gestisce 4 canali di ingresso (A/D) e 1 di uscita (D/A)
Quindi nel tuo caso avrai un D/A all'indirizzo 0x02 ed uno all'indirizzo 0x03. _________________ ----------------------------------------
Area SX
Massimo Battisti
---------------------------------------- |
|
| Torna in cima |
|
 |
aldofad
Registrato: 04/02/07 20:14 Messaggi: 15
|
Inviato: Gio 15 Feb 15 2007 11:26 Oggetto: |
|
|
Grazie mille!!
(e per la pazienza..)
Tutto funziona, ecco la funzione che adopero:
| Codice: |
int write_PCF8591(unsigned char address, unsigned char buf) {
auto unsigned char cnt;
auto short int err;
i2c_stop_tx();
// Invia lo START
if (err=i2c_startw_tx()){
i2c_stop_tx();
return -10; //ritorna il codice di errore -10
}
// Scrive l'indirizzo I2C e attende la risposta ACK dal dispositivo
if (err=i2c_wr_wait(0x90 | (address<<1))){
i2c_stop_tx();
return -20; //ritorna il codice di errore -20
}
if (err=i2c_write_char(0x40)){
i2c_stop_tx();
return -30; //ritorna il codice di errore -30
}
if (err=i2c_write_char(buf)==0) {
i2c_stop_tx();
printf("Ricevuto NACK 3\n");
return -1;
}
i2c_stop_tx();
return 1;
} |
Ora riesco correttamente ad impostare le tensioni sui due canali.
(A dire il vero la funzione ritorna -1 comunque funziona)
grazie ancora
aldo |
|
| Torna in cima |
|
 |
|