• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::

論壇索引


Board index » All Posts (lxyz1127)




乘法器問題
#61
高級會員
高級會員


我想請問 16f877a裡面沒有內建乘法器 因為我現在有兩個a/d的輸入值要相乘 (值是會持續變動) 我想過如果用加減的方式好像行不通 我有找過microchip裡面的範例 但是他們都是固定輸入值 不知道各位遇到這種情況您是怎解決的???

發表於: 2007/5/16 17:27
頂部


Re: 雙輸入問題
#62
高級會員
高級會員


已經ok啦 我把它改成下列方式
while(1)
{
Init_Adc();
ADdelay(2);
A2D(0x00);
LCD_Set_Cursor(10,0);
LCD_ItoA(AD_Int.AD_10bit);
ADdelay(10);

I nit_Adc_1();
ADdelay(2);
A2D_1(0x00);
LCD_Set_Cursor(10,1);
LCD_ItoA_1(AD_Int_1.AD_10bit_1);


發表於: 2007/5/16 13:38
頂部


Re: 雙輸入問題
#63
高級會員
高級會員


我剛剛有測試 我的輸入部分是RA1 此行不改變 A2D(0x00); // Get 10-bit A/D result from CH0 單一個輸入A/D沒有問題 所以應該不是這問題 還是我有錯誤

發表於: 2007/5/15 15:21
頂部


Re: 雙輸入問題
#64
高級會員
高級會員


A2D(0x00); // Get 10-bit A/D result from CH0

如果是CH1那是要怎改阿 因為我改過好像一直不對ㄟ 可以指導一下ㄇ

發表於: 2007/5/15 15:12
頂部


雙輸入問題
#65
高級會員
高級會員


想請問我如果用單一輸入ok但是兩個輸入的話卻只有一個可以動作 是因為沒有加入DELAY還是哪裏問題可以指導一下ㄇ??


#include <pic.h> // processor if/def file
#include "cnfig877a.h"
#include "mid_lcd.h"

unsigned char i ;

//***************************
// A/D延遲
//*****************************
void ADdelay(unsigned char i)
{
while(i--);
}

//**********************************
//* Function Prototype Declaration
//**********************************
void Init_IO(void);
void Init_Adc( void );
void Init_Adc_1( void );
void A2D( unsigned char );
void A2D_1( unsigned char );
void LCD_ItoA(unsigned int);
void LCD_ItoA_1(unsigned int);
unsigned char Set_BCD_ASCII(unsigned char);
unsigned char Set_BCD_ASCII_1(unsigned char);

// ================================================================
__CONFIG ( HS_OSC & BODEN_ON & WDT_OFF & CP_OFF & LVP_OFF & DEBUG_ON );

// =================================================================
const char LCD_Msg1[]=" voltage: ";
const char LCD_Msg2[]=" current: ";

unsigned int AD_Temp;
unsigned int AD_Temp_1;
bit DS_Zero_Flag;
bit DS_Zero_Flag_1;

union {
int AD_10bit;

struct
{
char AD_LSB;
char AD_MSB;
}
AD_Byte;
}
AD_Int;

union {
int AD_10bit_1;
struct
{
char AD_LSB_1;
char AD_MSB_1;
}
AD_Byte_1;
}
AD_Int_1;



/*****************************
INITIALIZE I/O PORT
*****************************/

void Init_IO(void)
{
ADCON1=0b00000110; // Disable A/D Function
TRISD=0x00; // Set PortD for Output
PORTD=0x80; // Initila LED display = 0x80
TRISA0=1; // Set RA0 for input
TRISA1=1; // Set RA1 for input

}

/*****************************************
Initialize A/D & Comparator Module
******************************************/

void Init_Adc( void )
{
ADCON0=0b10001001; // Select CH1, A/D on
ADCON1=0b00000010; // AN1 is A/D input
ADFM=0; // Right justified
}
void Init_Adc_1( void )
{
ADCON0=0b10000001; // Select CH0 , A/D on
ADCON1=0b00001110; // AN0 is A/D input
ADFM=1; // Right justified
}
/***********************************
Convert A/D Channel
************************************/

void A2D( unsigned char channel )
{
unsigned char temp; // Temp storage


ADGO = 1; // Initiate conversion on selected channel
while (ADGO) ;
// Poll ADGO bit until it clears, indicating conv. done
AD_Int.AD_Byte.AD_MSB=ADRESH;
AD_Int.AD_Byte.AD_LSB=ADRESL;
temp= ADRESH *256+ ADRESL;
temp = channel >>2; // Shift channel value three bits left
ADCON0 &= 0b11001111; // Clear channel select bits in ADCON0
ADCON0 |= temp; // Logically OR shifted channel value into place in ADCON0
}
void A2D_1( unsigned char channel_1 )
{
unsigned char temp_1; // Temp_1 storage
ADGO = 1; // Initiate conversion on selected channel
while (ADGO) ;
// Poll ADGO bit until it clears, indicating conv. done

AD_Int_1.AD_Byte_1.AD_MSB_1=ADRESH;
AD_Int_1.AD_Byte_1.AD_LSB_1=ADRESL;
temp_1= ADRESH *256+ ADRESL;
temp_1 = channel_1 <<2; // Shift channel value three bits left
ADCON0 &= 0b11000111; // Clear channel select bits in ADCON0
ADCON0 |= temp_1; // Logically OR shifted channel value into place in ADCON0

}

//***************************************
//* Program Main ( ) *
//***************************************
void main(void)
{
Init_IO();
Init_Adc();


OpenLCD();
LCD_Set_Cursor(0,0);
putrsLCD(LCD_Msg1);

Init_Adc_1();
LCD_Set_Cursor(0,1);
putrsLCD(LCD_Msg2);

while(1)
{
A2D(0x00); // Get 10-bit A/D result from CH0
LCD_Set_Cursor(10,0);
LCD_ItoA(AD_Int.AD_10bit);
ADdelay(10);

A2D_1(0x00); // Get 10-bit A/D result from CH0
LCD_Set_Cursor(10,1);
LCD_ItoA_1(AD_Int_1.AD_10bit_1);

}

}

void LCD_ItoA(unsigned int AD_Data)
{
AD_Temp=AD_Data;
DS_Zero_Flag=1;

putcLCD(Set_BCD_ASCII(AD_Data/1000)); // 顯示千位數
AD_Temp=AD_Temp%1000; // 取出百位以後的數

putcLCD(Set_BCD_ASCII(AD_Temp/100)); // 顯示百位數
AD_Temp=AD_Temp%100;

putcLCD(Set_BCD_ASCII(AD_Temp/10)); // 顯示十位數
AD_Temp=AD_Temp%10;

putcLCD(AD_Temp+='0'); // 顯示個位數
}
void LCD_ItoA_1(unsigned int AD_Data_1)
{
AD_Temp_1=AD_Data_1;
DS_Zero_Flag_1=1;

putcLCD(Set_BCD_ASCII_1(AD_Data_1/1000)); // 顯示千位數
AD_Temp_1=AD_Temp_1%1000; // 取出百位以後的數

putcLCD(Set_BCD_ASCII_1(AD_Temp_1/100)); // 顯示百位數
AD_Temp_1=AD_Temp_1%100;

putcLCD(Set_BCD_ASCII_1(AD_Temp_1/10)); // 顯示十位數
AD_Temp_1=AD_Temp_1%10;

putcLCD(AD_Temp_1+='0');

}
unsigned char Set_BCD_ASCII(unsigned char BCD_Data)
{
if (BCD_Data==0)
{
if (DS_Zero_Flag) return ' '; // 居先零抑制
else return '0'; // 顯示一般的零
}
else
{
DS_Zero_Flag=0; // 取消居先零的抑制
return (BCD_Data +='0'); // 並傳回 ASCII Code
}
}
unsigned char Set_BCD_ASCII_1(unsigned char BCD_Data_1)
{
if (BCD_Data_1==0)
{
if (DS_Zero_Flag_1) return ' '; // 居先零抑制
else return '0'; // 顯示一般的零
}
else
{
DS_Zero_Flag_1=0; // 取消居先零的抑制
return (BCD_Data_1 +='0'); // 並傳回 ASCII Code
}
}




發表於: 2007/5/15 13:13
頂部


希望有所收獲
#66
高級會員
高級會員


我現在已經把FUZZY的TABLE表都弄好啦 應該就是您的說OFF LINE 只是我不知道如果下手 看完了您的說法我應該有些些了解 如果還有人有更好的方法 討論ㄧ下??

發表於: 2007/5/15 11:24
頂部


模糊控制
#67
高級會員
高級會員


有人利用PIC寫過模糊控制ㄇ~~不知道能互相討論ㄧ下 !!!還是能提供範例 互相學習討論

發表於: 2007/5/14 22:03
頂部


Re: 請求指導
#68
高級會員
高級會員


我已經了解啦 但是不知道為何我的輸入用電池的電壓但是LCD的值卻ㄧ直跳動 那是怎回事呢

發表於: 2007/5/7 22:08
頂部


請求指導
#69
高級會員
高級會員




#include <pic.h> / processor if/def file
#include "cnfig877a.h"
#include "mid_lcd.h"

//**********************************
//* Function Prototype Declaration
//**********************************
void Init_IO(void);
void Init_Adc( void );
void A2D( unsigned char );
void LCD_ItoA(unsigned int);
unsigned char Set_BCD_ASCII(unsigned char);

// ================================================================
// **** Establish PIC16F877A Configuration Word
// **** == HS Oscillator Mode
// **** == Brown-Out Detect Enabled
// **** == Watch-Dog Timer Off
// **** == Code Protect Off
// **** == Low Voltage Programming Off
// **** == ICD2 Debug Mode On

__CONFIG ( HS_OSC & BODEN_ON & WDT_OFF & CP_OFF & LVP_OFF & DEBUG_ON );

// =================================================================


const char LCD_Msg1[]=" A/D Result: ";
const char LCD_Msg2[]=" MSB: LSB: ";

unsigned int AD_Temp;
bit DS_Zero_Flag;

union {
int AD_10bit;
struct {
char AD_LSB;
char AD_MSB;
}AD_Byte;
}AD_Int;


/*****************************
INITIALIZE I/O PORT
*****************************/

void Init_IO(void)
{
ADCON1=0b00000110; // Disable A/D Function
TRISD=0x00; // Set PortD for Output
PORTD=0x80; // Initila LED display = 0x80
TRISA0=1; // Set SW2 for input
//TRISE1=1; // Set SW6 for Input
}


/*****************************************
Initialize A/D & Comparator Module
******************************************/

void Init_Adc( void )
{
CMCON=0b000000111; // Analog comparator disable
ADCON1=0b00001110; // AN0 is A/D input
ADFM=1; // Right justified
ADCON0=0b10000001; // Selext CH0 , A/D on
}

/***********************************
Convert A/D Channel
************************************/

void A2D( unsigned char channel )
{
unsigned char temp; // Temp storage

temp = channel << 3; // Shift channel value three bits left
ADCON0 &= 0b11000111; // Clear channel select bits in ADCON0
ADCON0 |= temp; // Logically OR shifted channel value into place in ADCON0

ADGO = 1; // Initiate conversion on selected channel
while (ADGO) ; // Poll ADGO bit until it clears, indicating conv. done
AD_Int.AD_Byte.AD_MSB=ADRESH;
AD_Int.AD_Byte.AD_LSB=ADRESL;
}

//***************************************
//* Program Main ( ) *
//***************************************
void main(void)
{
Init_IO();
Init_Adc();
OpenLCD();
LCD_Set_Cursor(0,0);
putrsLCD(LCD_Msg1);
LCD_Set_Cursor(0,1);
putrsLCD(LCD_Msg2);

while(1)
{
A2D(0x00); // Get 10-bit A/D result from CH0
LCD_Set_Cursor(12,0);
LCD_ItoA(AD_Int.AD_10bit);
LCD_Set_Cursor(6,1);
puthexLCD(AD_Int.AD_Byte.AD_MSB);
LCD_Set_Cursor(13,1);
puthexLCD(AD_Int.AD_Byte.AD_LSB);
}

}

void LCD_ItoA(unsigned int AD_Data)
{
AD_Temp=AD_Data;
DS_Zero_Flag=1;

putcLCD(Set_BCD_ASCII(AD_Data/1000)); // 顯示千位數
AD_Temp=AD_Temp%1000; // 取出百位以後的數

putcLCD(Set_BCD_ASCII(AD_Temp/100)); // 顯示百位數
AD_Temp=AD_Temp%100;

putcLCD(Set_BCD_ASCII(AD_Temp/10)); // 顯示十位數
AD_Temp=AD_Temp%10;

putcLCD(AD_Temp+='0'); // 顯示個位數
}

unsigned char Set_BCD_ASCII(unsigned char BCD_Data)
{
if (BCD_Data==0)
{
if (DS_Zero_Flag) return ' '; // 居先零抑制
else return '0'; // 顯示一般的零
}
else
{
DS_Zero_Flag=0; // 取消居先零的抑制
return (BCD_Data +='0'); // 並傳回 ASCII Code
}
}


我想請問一下 這是MICROCHIP的範例 但是我不了解他的類比輸入的部分次從哪裡ㄚ 還是說他是內建的 因為我現在要改成外部輸入 但依職看不懂 可以指導我一下 >>>



發表於: 2007/5/7 20:53
頂部


各位高手我把程式pO上來了~~~指點中
#70
高級會員
高級會員


各位高高手我把我的程式都PO上來 想問為何無法顯示 我將電壓輸入經由A/D轉換顯示在LCD

#include <pic.h> // processor if/def file
#include "cnfig877a.h"
#include "mid_lcd.h"
unsigned char i ;
//================================
//////// A/D延遲 /////////////////////////////
void ADdelay(unsigned char i)
{
while(i--);
}
//**********************************
//* Function Prototype Declaration
//**********************************
void Init_IO(void);
void Init_Adc( void );
void A2D( unsigned char );
void LCD_ItoA(unsigned int);
unsigned char Set_BCD_ASCII(unsigned char);

__CONFIG ( HS_OSC & BODEN_ON & WDT_OFF & CP_OFF & LVP_OFF & DEBUG_ON );

const char LCD_Msg1[]=" Voltage: ";
const char LCD_Msg2[]=" MSB: LSB: ";

unsigned int AD_Temp;
bit DS_Zero_Flag;

union {
int AD_10bit;
struct
{
char AD_LSB;
char AD_MSB;
}
AD_Byte;
}
AD_Int;
/*****************************
INITIALIZE I/O PORT
*****************************/

void Init_IO(void)
{
TRISA0=1; // Set RA0 for input
}
/*****************************************
Initialize A/D & Comparator Module
******************************************/

void Init_Adc( void )
{
ADCON1=0b00001110; // AN0 is A/D input
ADFM=1; // Right justified
ADCON0=0b10000001; // Selext CH0 , A/D on
ADdelay(2); //delay20us

}

/***********************************
Convert A/D Channel
************************************/

void A2D( unsigned char channel )
{
unsigned char temp; // Temp storage

ADGO = 1; //啟動一次A/D轉換
while (ADGO==1) ; // 等待AD轉換完成

temp = ADRESH*256+ ADRESL;
}
//***************************************
//* Program Main ( ) *
//***************************************
void main(void)
{
Init_IO();
Init_Adc();
OpenLCD();
LCD_Set_Cursor(0,0);
putrsLCD(LCD_Msg1);


while(1)
{
A2D(0x00); // Get 10-bit A/D result from CH0
LCD_Set_Cursor(7,0);
LCD_ItoA(AD_Int.AD_10bit);

}

}

void LCD_ItoA(unsigned int AD_Data)
{
AD_Temp=AD_Data;
DS_Zero_Flag=1;

putcLCD(Set_BCD_ASCII(AD_Data/1000));// 顯示千位數
AD_Temp=AD_Temp%1000; // 取出百位以後的數

putcLCD(Set_BCD_ASCII(AD_Temp/100));// 顯示百位數
AD_Temp=AD_Temp%100;

putcLCD(Set_BCD_ASCII(AD_Temp/10)); // 顯示十位數
AD_Temp=AD_Temp%10;

putcLCD(AD_Temp+='0'); // 顯示個位數
}

unsigned char Set_BCD_ASCII(unsigned char BCD_Data)
{
if (BCD_Data==0)
{
if (DS_Zero_Flag) return ' '; // 居先零抑制
else return '0'; // 顯示一般的零
}
else
{
DS_Zero_Flag=0; // 取消居先零的抑制
return (BCD_Data +='0');// 並傳回 ASCII Code
}
}




發表於: 2007/4/24 11:52
頂部



« 1 ... 4 5 6 (7) 8 »



:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------