Problema citire mai multe canale ADC 16f877a
Last Updated: Aug 19 2011 16:59, Started by
ramsesrr
, Aug 19 2011 16:08
·
0
#1
Posted 19 August 2011 - 16:08
Incerc sa citesc 8 canale ADC la 16f877a dar canalele se influenteza intre ele,adica daca pun 5V pe o intrare si pe restul le las in aer apare si pe ele 5V . In simulator totul e Ok insa practic nu .Care ar putea fi problema.Codul este urmatorul:
// PIC16F877a Sms controller // Hi-Tech C #include <pic.h> #include <htc.h> #include <stdio.h> #include <string.h> #include "stdlib.h" __CONFIG(HS & WDTDIS & PWRTEN & BORDIS & LVPDIS & DUNPROT & WRTEN & DEBUGEN & UNPROTECT); #define _XTAL_FREQ 10000000UL bank1 char ReadBuffer[20]; volatile unsigned int i; void initialize(void) { GIE=1; // enable interrupts PEIE=1; //enable peripheral interrupt INTE = 0; //intrerupere oprita pe RB0 RBIE=0; TMR0IE=0; ADCS1 = 1; //select Fosc/8 ADCS0 = 1; ADCON1=0b10000000; // A/D port configuration 0 ADFM = 1; //right justified result ADON=1; // turn on the AD conversion module } /* return a 10-bit result */ unsigned int read_adc(unsigned char channel) { channel&=0x07; // truncate channel to 3 bits ADON = 1; ADCON0&=0xC5; // clear current channel select ADCON0|=(channel<<3); // apply the new channel select __delay_ms(10); ADGO=1; // initiate conversion on the selected channel while(ADGO)continue; ADON = 0; return(((ADRESH&0x03)<<8)+ADRESL); // return the 10-bit result } int temp_lm35(void) { int temp_an, temp, i; temp_an=0; for(i=0; i<4; i++) { temp_an =temp_an+read_adc(0); __delay_ms(5); } temp_an=(temp_an/4); temp = temp_an*(int)((5.0*100.0)/1023.0); return(temp+1); } void InitUSART() //rutina de setare si initializare a modulului USART { SPBRG=64;//(int)((F_CPU/(baund_rate*16))-1); BRGH=1; //high speed SYNC=0; //modul asincron SPEN=1; //activare port serial TXIE=0; //dezactivare intrerupere USART la transmisie TX9=0; //transmisie pe 8 biti TXEN=1; //activare transmisie RCIE=1; //activare intrerupere USART la receptie RX9=0; //receptie pe 8 biti CREN=1; //activare receptie } void USARTWriteChar(unsigned char c) //Rutina de transmitere a unui octet la portul serial { while(!TXIF); //asteapta sa se termine transmisia precedenta TXREG=c; //incarca si transmite noua valoare } void TransmitUSARTC(const char* c) { unsigned int i =0; while(c[i]!=0x0 && c[i]!=0xd) { USARTWriteChar(c[i]); i++; } //USARTWriteChar(0xd); //new line } unsigned char ReceiveUSART() //Rutina pt receptia unui octet de la portul serial { unsigned char c; while(!RCIF); //asteapta pana se incheie receptia c=RCREG; //octetul receptionat este preluat din RCREG return c; } ///////////////////////////////////////////////////////////////////////////////// void Wait(unsigned int n) { unsigned int i,temp; temp=n*10; for(i = 0;i < temp;i++) { __delay_ms(100); } } ////////////////////////////////////////////////////////// void interrupt isr(void) { GIE=0; if(RCIF){ ReadBuffer[i++] = RCREG; if(i>78) i = 0; } RCIF = 0; GIE=1; } void Reset_RXBuff(void) { i = 0; memset(ReadBuffer, 0, 75); } void main(void) { int val1,val2,val3,val4; char b [40]; volatile unsigned char flag8 = 0; initialize(); PIE1|=(1<<RCIE); __delay_us(20); InitUSART(); TRISA|=(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<5); TRISE|=(1<<0)|(1<<1)|(1<<2); TransmitUSARTC("start"); USARTWriteChar('\r'); memset(ReadBuffer, 0, 75); //reset buffer i = 0; //reset pointer while(1) { unsigned int adc[8]; unsigned int w = 0; for(w = 0;w <=7; w++) { adc[w] = read_adc(w); Wait(1); } for(w = 0;w <=7; w++) { sprintf(b,"valoarea ADC pe canalul %d este : %d ",w,adc[w]); TransmitUSARTC(b); USARTWriteChar('\r'); memset(b,' ', 40); } TransmitUSARTC("#########################################"); USARTWriteChar('\r'); } } |
#2
Posted 19 August 2011 - 16:44
ramsesrr, on 19th August 2011, 17:08, said: Incerc sa citesc 8 canale ADC la 16f877a dar canalele se influenteza intre ele,adica daca pun 5V pe o intrare si pe restul le las in aer apare si pe ele 5V . In simulator totul e Ok insa practic nu .Care ar putea fi problema.Codul este urmatorul: Nu am stat sa citesc programul dar nu cumva e o chestie HW? In fond tu ai doar un ADC care are intrarile multiplexate. Inainte de ADC trebuie sa ai un filtru . Daca celelalte intrari sunt in aer nu cumva iti ramine sarcina pe filtrul respectiv ? Incearca sa legi celelalte intrari la masa cu 10kohmi Edited by Paul_l, 19 August 2011 - 16:45. |
#3
Posted 19 August 2011 - 16:59
intrarile niciodata nu se lasa in aer (pe cele pe care le folosesti). D'aia exista rezistenta de pull-up sau pull-down, depinde de care vrei. Da poza la schema sa vada si ochiu meu.
|
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users