CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

MAX197 Driver PIC18F452

 
Post new topic   Reply to topic    CCS Forum Index -> Code Library
View previous topic :: View next topic  
Author Message
dvsoft



Joined: 28 Nov 2003
Posts: 46

View user's profile Send private message

MAX197 Driver PIC18F452
PostPosted: Mon Aug 02, 2004 5:40 pm     Reply with quote

bonjour,

My driver for the MAX197


Code:

//---------------------------------------------------------------------------
//  Copyright (c) DVSoft 2004
//  email dvsoft@club-internet.fr
//
//  This program is free software; you can redistribute it and/or modify it
//  under the terms of the GNU General Public License as published by the
//  Free Software Foundation.
//
//  This program is distributed in the hope it will be useful, but WITHOUT
//  ANY WARRANTY; without even the implied warranty of MERCHANDIBILITY or
//  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
//  more details.
//
//  Originale Unit Name : Max197Driver.c
//  Author              : Alain
//  Date                : 15-Avril-2004
//  Project             : YA1-LOGGER-V3
//  Version             : 0.9.0.1
//  Revision            :
//
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
// Conditional PinDef
//
#ifndef __MAX197_PIN_DEF__
    #define MAX197_INT      PIN_B0  //   I      1
    #define MAX197_HBEN     PIN_B2  //   O      0
    #define MAX197_RD       PIN_B3  //   O      0
    #define MAX197_WR       PIN_B4  //   O      0
    #define MAX197_CS       PIN_B5  //   O      0
    #define MAX197_D0       PIN_D0  //  I/O    1/0
    #define MAX197_D1       PIN_D1  //  I/O    1/0
    #define MAX197_D2       PIN_D2  //  I/O    1/0
    #define MAX197_D3       PIN_D3  //  I/O    1/0
    #define MAX197_D4       PIN_D4  //  I/O    1/0
    #define MAX197_D5       PIN_D5  //  I/O    1/0
    #define MAX197_D6       PIN_D6  //  I/O    1/0
    #define MAX197_D7       PIN_D7  //  I/O    1/0
   
    //------------------------------------------------------------------------
    // tris Def
    #define TRIS_D_IN       0b11111111
    #define TRIS_D_OUT      0b00000000
    #define TRIS_B          0b00000011
   
    //------------------------------------------------------------------------
    // Fast IO
    //
    #use fast_io(B)
    #use fast_io(D)
#endif

//----------------------------------------------------------------------------
// Max197 Data
//
#ifdef __YA1_LOGGER_DATA_REGISTER__
    //------------------------------------------------------------------------
    // Max197 driver status
    //
    BOOLEAN     Max197DriverRun;
   
    //------------------------------------------------------------------------
    // Max197 Data Registers
    //
    int16   AN0Raw;                         // AN0Raw
    #byte   AN0Raw_L = AN0Raw
    #byte   AN0Raw_H = AN0Raw+1

    int16   AN1Raw;                         // AN1Raw
    #byte   AN1Raw_L = AN1Raw
    #byte   AN1Raw_H = AN1Raw+1

    int16   AN2Raw;                         // AN2Raw
    #byte   AN2Raw_L = AN2Raw
    #byte   AN2Raw_H = AN2Raw+1

    int16   AN3Raw;                         // AN3Raw
    #byte   AN3Raw_L = AN3Raw
    #byte   AN3Raw_H = AN3Raw+1

    int16   AN4Raw;                         // AN4Raw
    #byte   AN4Raw_L = AN4Raw
    #byte   AN4Raw_H = AN4Raw+1

    int16   AN5Raw;                         // AN5Raw
    #byte   AN5Raw_L = AN5Raw
    #byte   AN5Raw_H = AN5Raw+1

    int16   AN6Raw;                         // AN6Raw
    #byte   AN6Raw_L = AN6Raw
    #byte   AN6Raw_H = AN6Raw+1

    int16   AN7Raw;                         // AN7Raw
    #byte   AN7Raw_L = AN7Raw
    #byte   AN7Raw_H = AN7Raw+1
   
#endif

//----------------------------------------------------------------------------
// Max197 Macro
//
#define Max197Select()     output_low(MAX197_CS)
#define Max197UnSelect()   output_high(MAX197_CS)
#define Max197_RDLow()     output_low(MAX197_HBEN)
#define Max197_RDHigh()    output_high(MAX197_HBEN)
#define Max197RD_On()      output_low(MAX197_RD)
#define Max197RD_Off()     output_high(MAX197_RD)
#define Max197WR_On()      output_low(MAX197_WR)
#define Max197WR_Off()     output_high(MAX197_WR)
#define Max197EnableInt()  enable_interrupts(INT_EXT)
#define Max197DisableInt() disable_interrupts(INT_EXT)

//----------------------------------------------------------------------------
// Max197 Local Data
//
BOOLEAN Max197EOC;          // Wait for end of conversion
BOOLEAN Max197Pending;      // Convertion running

int16   Max197Row;          // 16 bits Value
#byte   Low  = Max197Row    // Max197 LSB
#byte   High = Max197Row+1  // Max197 MSB
int8    ChannelCnt;         // Current channel
int8    ANShiftBit;         // Current channel Shift Bit Enabled/Disable

//----------------------------------------------------------------------------
// Current test bit channel
//
int8 ANMaskBitChannels;
#bit AN0MaskBitEnabled = ANMaskBitChannels.0
#bit AN1MaskBitEnabled = ANMaskBitChannels.1
#bit AN2MaskBitEnabled = ANMaskBitChannels.2
#bit AN3MaskBitEnabled = ANMaskBitChannels.3
#bit AN4MaskBitEnabled = ANMaskBitChannels.4
#bit AN5MaskBitEnabled = ANMaskBitChannels.5
#bit AN6MaskBitEnabled = ANMaskBitChannels.6
#bit AN7MaskBitEnabled = ANMaskBitChannels.7


//---------------------------------------------------------------------------
// Function : NextChannel()
// Input    :
//      void
// return   :
//      void
// Modify   :
//      Set the next channel bit
//
// Note     :
//      Set the first channel if Current Channel+1 > 7
#inline
void NextChannel(void)
{
    //--- Next Channel
    ChannelCnt++;
    //--- Shift the enabled bit
    ANShiftBit >>= 1;
    //--- Enabled next Channels
    ANMaskBitChannels = (ANMaskBitChannels << 1) & 0xff;
    //--- Last Channel ? (0 to 7)
    if (ChannelCnt > 7) {
        //--- First Channel
        ChannelCnt = 0;
        //--- First channel enabled bit
        ANMaskBitChannels = 0x01;
        //--- Enabled channels bits
        ANShiftBit = EnabledChannels;
    }// End If
}
//---------------------------------------------------------------------------
// Function : Max197Read(void)
// Input    :
//      void
// return   :
//      void
// Modify   :
//      Store the MAX197 value in Low an High
//
// Note     :
//      Don't forget the waitstate befort read the MAX197 DataBus
//
#inline
void Max197Read(void)
{
    //--- Port D read
    set_tris_d(TRIS_D_IN);
    //--- Max197 Select
    Max197Select();
    //--- RD = 0
    Max197RD_On();
    //--- Wait 120 ns befort read (TD0)
    delay_cycles(2);
    //--- Store low Value
    Low = input_d();
    //--- HBEN = 1
    Max197_RDHigh();
    //--- Wait 120 ns befort read (TD1)
    delay_cycles(2);
    High = input_d();
    //--- HBEN = 0
    Max197_RDLow();
    //--- RD = 1
    Max197RD_Off();
    //--- UnSelect
    Max197UnSelect();
}
//---------------------------------------------------------------------------
// Function : Max197Open(void)
// Input    :
//      void
// return   :
//      void
// Modify   :
//      Init the MAX197 Data
//      Set the Max197 driver flag 'Max197DriverRun' to TRUE
//
// Note     :
//     
//
#separate
void Max197Open(void)
{
    BYTE i;
    //--- Unselect
    Max197UnSelect();
    //--- Low Value First
    Max197_RDLow();
    //--- Signal Off
    Max197RD_Off();
    Max197WR_Off();
    //--- Non convertion running
    Max197Pending = FALSE;
    //--- Empty the raw vale
    AN0Raw = 0;
    AN1Raw = 0;
    AN2Raw = 0;
    AN3Raw = 0;
    AN4Raw = 0;
    AN5Raw = 0;
    AN6Raw = 0;
    AN7Raw = 0;
    //--- Loop index
    ChannelCnt = 0;
    //--- Current bit channel
    ANMaskBitChannels = EnabledChannels;
    //--- Driver status
    Max197DriverRun = TRUE;
}
//---------------------------------------------------------------------------
// Function : Max197Close(void)
// Input    :
//      void
// return   :
//      void
// Modify   :
//      Set the Max197 driver flag 'Max197DriverRun' to FALSE
//
// Note     :
//
//
#separate
void Max197Close(void)
{
    //--- Driver stop
    Max197DriverRun = FALSE;
    //--- No interruption
    Max197DisableInt();
}
//---------------------------------------------------------------------------
// Function : Max197Service(void)
// Input    :
//      void
// return   :
//      void
// Modify   :
//      Store the current channel value
//          AN0Raw to AN7Raw
//      Select the next channel
// Note     :
//     
//    Usage in Main
//     
//      Max197Open();
//      while (TRUE) {
//          ....
//          Max197Service();
//      }
//
//
#inline
void Max197Service(void)
{
    //--- Running ?
    if (!Max197DriverRun)
        return;
    //--- Max197 Running convertion ?
    if (Max197Pending) {
        //--- End of convertion ?
        if (!input(MAX197_INT)) {
            Max197Read();
            //--- Channel 0
            if (AN0MaskBitEnabled) {
                AN0Raw_H = High;
                AN0Raw_L = Low;
            }// End IF
            //--- Channel 1
            if (AN1MaskBitEnabled) {
                AN1Raw_H = High;
                AN1Raw_L = Low;
            }// End IF
            //--- Channel 2
            if (AN2MaskBitEnabled) {
                AN2Raw_H = High;
                AN2Raw_L = Low;
            }// End IF
            //--- Channel 3
            if (AN3MaskBitEnabled) {
                AN3Raw_H = High;
                AN3Raw_L = Low;
            }// End IF
            //--- Channel 4
            if (AN4MaskBitEnabled) {
                AN4Raw_H = High;
                AN4Raw_L = Low;
            }// End IF
            //--- Channel 5
            if (AN5MaskBitEnabled) {
                AN5Raw_H = High;
                AN5Raw_L = Low;
            }// End IF
            //--- Channel 6
            if (AN6MaskBitEnabled) {
                AN6Raw_H = High;
                AN6Raw_L = Low;
            }// End IF
            //--- Channel 7
            if (AN7MaskBitEnabled) {
                AN7Raw_H = High;
                AN7Raw_L = Low;
            }// End IF
            //--- Max197 Stop
            Max197Pending = FALSE;
            //--- Next Channels
            NextChannel();
        }// End IF
    }// End If
    //--- Max197 free ??
    else {
        //--- Channel enabled ?
        if (ANShiftBit & 0x01) {
            //--- Port D write
            set_tris_d(TRIS_D_OUT);
            //--- Select the Max197
            Max197Select();
            //--- Write = 0
            Max197WR_On();
            //--- Configuration + Current Channel number
            // 0 to 5 Volts
            //
            output_d(64+ChannelCnt);
            //--- Write = 1
            Max197WR_Off();
            //--- Max197 UnSelect
            Max197UnSelect();
            //--- Convertion Started
            Max197Pending = TRUE;
        }// End IF
        //--- No goto next channel
        else
            NextChannel();
    }// End Else
}
//---------------------------------------------------------------------------

Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> Code Library All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group