servntes
Newbie


Messages : 4 Inscrit(e) le: 03/06/2010
|
Posté le 09/06/2010 14:35 | | CAN - Pic18f4520 - CNA (PCF8591 - I2C ) |
Bonjour à tous,
Je viens de travailler sur un projet pour programmer un correcteur PID ou bien un régulateur PID, Alors j'aimerais tester la CNA et CAN,
Alors j'ai configuré le bit 0 du PORTA comme une entrée analogique AN0, Pour insérer à cette entrée, un signal entre [0v et 5v] à l'aide d'un potentiomètre,
Donc j'ai la convertie à l'aide du convertisseur analogique numérique.et le résultat obtenue, j'aimerais le récupérer sur une sortie analogique, J'ai utilisé le PCF 8591 par le bus I2C. Convertisseur Numérique Analogique 8 bit.
J'ai testé la CAN et il marche très bien, mais la CNA sa marche pas !! Je varie le potentiomètre de 0v à 5 v; mais sur la sortie le résultat reste toujours à 0v
Svp s'il y a quelqu'un qui peut m'aider à cette démarche !!!
Voila mon code, que j'ai simulé (pas d'erreur lors de la compilation) :
#include <p18f45k20.h> #include <stdio.h> #include <math.h>
#define SCL_PIN PORTCbits.RC3 #define SDA_PIN PORTCbits.RC4
#define SCL_DIR TRISCbits.TRISC3 #define SDA_DIR TRISCbits.TRISC4
void main (void); void DelayMs(unsigned int); void Pcf_8591_d2a(unsigned char); void i2c_init(void); void i2c_start(void); void i2c_wr(unsigned char); void i2c_ack(void); void i2c_stop(void); void i2c_high_scl(void); void i2c_low_scl(void); void i2c_high_sda(void); void i2c_low_sda(void);
#pragma code
/************************* * Definition des Variables *************************/ unsigned char Ys; /********************* * Fonction principal ********************/ void main() { TRISD=0;
ADCON1=0x00; ADCON0=0x01; ADCON2=0x00;
while(1) { ADCON0bits.GO = 1; // lancement de la conversion analogique numérique while (ADCON0bits.GO) { //pas de opcode; // attendre la fin de la conversion lorsque GO=0 } Ys = ADRESH; // résultat de la conversion analogique numérique, Pcf_8591_d2a(Ys); // lancement de la conversion numérique analogique } } /******************************************* * PCF 8591 Conversion numerique analogique *******************************************/ void Pcf_8591_d2a(unsigned char dat) { int iConfig=0x40; // Configuration du CNA du PCF8591; bit6=1(activaation sortie analogique) int cPCF8591_w=0x90; // Adresse du PCF85910 i2c_init(); i2c_start(); // Signal Start i2c_wr(cPCF8591_w); // Adresse de l'esclave (PCF8591) i2c_ack(); // Acquitement i2c_wr(iConfig); // Cofiguartion pour activer la Conversion N/A i2c_ack(); // Acquitement i2c_wr(dat); // les données N/A i2c_ack(); // Acquitement i2c_stop(); // Signal Stop } /*********************** * Initialisatin Bux I2C ***********************/ void i2c_init(void) { SSPSTAT=0x80; SSPCON1=0x28; SSPCON2=0x01; } /******************* * Start Condition ******************/ void i2c_start(void) { i2c_low_scl(); i2c_high_sda(); i2c_high_scl(); i2c_low_sda(); i2c_low_scl(); } /******************* * Stop Condition *****************/ void i2c_stop(void) { i2c_low_scl(); i2c_low_sda(); i2c_high_scl(); i2c_high_sda(); } /****************************** * Procedure d'ecriture PCF8591 ******************************/ void i2c_wr(unsigned char data) { unsigned char n; for(n=0; n<8; n++) { if(data&0x80) { i2c_high_sda(); } else { i2c_low_sda(); } i2c_high_scl(); i2c_low_scl(); data <<=1; } i2c_high_sda(); }
/****************************** * Acknowledge == Acquittement ******************************/ void i2c_ack(void) { i2c_high_sda(); i2c_high_scl(); i2c_low_scl(); }
/****************************** * Niveau haut/bas pou SCL/SDA ******************************/ void i2c_high_sda(void) { SDA_DIR = 1; DelayMs(1); }
void i2c_low_sda(void) { SDA_PIN = 0; SDA_DIR = 0; DelayMs(1); }
void i2c_high_scl(void) { SCL_DIR = 1; DelayMs(1); }
void i2c_low_scl(void) { SCL_PIN = 0; SCL_DIR = 0; DelayMs(1); }
|
Edité par servntes le 09/06/2010 16:38 |
|
|