乘法器問題
|
||||
---|---|---|---|---|
高級會員
|
我想請問 16f877a裡面沒有內建乘法器 因為我現在有兩個a/d的輸入值要相乘 (值是會持續變動) 我想過如果用加減的方式好像行不通 我有找過microchip裡面的範例 但是他們都是固定輸入值 不知道各位遇到這種情況您是怎解決的???
發表於: 2007/5/16 17:27
|
|||
|
Re: 雙輸入問題
|
||||
---|---|---|---|---|
高級會員
|
我剛剛有測試 我的輸入部分是RA1 此行不改變 A2D(0x00); // Get 10-bit A/D result from CH0 單一個輸入A/D沒有問題 所以應該不是這問題 還是我有錯誤
發表於: 2007/5/15 15:21
|
|||
|
Re: 雙輸入問題
|
||||
---|---|---|---|---|
高級會員
|
A2D(0x00); // Get 10-bit A/D result from CH0
如果是CH1那是要怎改阿 因為我改過好像一直不對ㄟ 可以指導一下ㄇ
發表於: 2007/5/15 15:12
|
|||
|
雙輸入問題
|
||||
---|---|---|---|---|
高級會員
|
想請問我如果用單一輸入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
|
|||
|
希望有所收獲
|
||||
---|---|---|---|---|
高級會員
|
我現在已經把FUZZY的TABLE表都弄好啦 應該就是您的說OFF LINE 只是我不知道如果下手 看完了您的說法我應該有些些了解 如果還有人有更好的方法 討論ㄧ下??
發表於: 2007/5/15 11:24
|
|||
|
模糊控制
|
||||
---|---|---|---|---|
高級會員
|
有人利用PIC寫過模糊控制ㄇ~~不知道能互相討論ㄧ下 !!!還是能提供範例 互相學習討論
發表於: 2007/5/14 22:03
|
|||
|
Re: 請求指導
|
||||
---|---|---|---|---|
高級會員
|
我已經了解啦 但是不知道為何我的輸入用電池的電壓但是LCD的值卻ㄧ直跳動 那是怎回事呢
發表於: 2007/5/7 22:08
|
|||
|
請求指導
|
||||
---|---|---|---|---|
高級會員
|
#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上來了~~~指點中
|
||||
---|---|---|---|---|
高級會員
|
各位高高手我把我的程式都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
|
|||
|