Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Consum ulei masina de tuns iarba...

"Moda" tinerilor care se ...

E.on energie aplicație intre...

Masina de tuns... buruieni
 Recomandare drona

Exista un soft care sa reia autom...

Identificare plante

Cum declari o variabila care nu s...
 Schimbare certificat de inmatricu...

Poligon auto București

nelamurire legata de pret la mode...

Hotel cu restaurant si Demipensiu...
 Croaziera in Mediterana de Vest 1...

Copilot are pica pe Vladimir Putin

MicroSoft Edge: Cum pun Google in...

Dashcam
 

Problema citire mai multe canale ADC 16f877a

- - - - -
  • Please log in to reply
2 replies to this topic

#1
ramsesrr

ramsesrr

    Member

  • Grup: Members
  • Posts: 374
  • Înscris: 26.09.2007
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
Paul_l

Paul_l

    Senior Member

  • Grup: Senior Members
  • Posts: 2,287
  • Înscris: 27.12.2004

 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
catalinmacovei88

catalinmacovei88

    Member

  • Grup: Members
  • Posts: 903
  • Înscris: 30.07.2011
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

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate