Sida 1 av 1

får ej igång ADC 18f458 *LÖST*

Postat: 16 juni 2008, 01:01:36
av slatte
som titeln säger får jag inte igång ADc på picen vet ej vad jag gör för fel eller har glömt, går det att simulera en Analog ingång i mplab? hur?
det som denna kod ska utföra är om spänningen understiger ca 2.5 v på RA0 så tänds en diod på RC6 (detta kollas i interrupten).
interruptrutinen mm behöver ni inte bry er om den bara blinkar en diod typ(och den fungerar för dioden blinkar :-) ) !
oscillator har jag en kristall på 4Mhz (så alltså har jag satt tad till 32 Tosc).
har läst datablade några gånger nu men fattar inte vad jaf har missat bah!

Kod: Markera allt

#include <p18f458.h>
#include <pwm.h>

#pragma config OSC = XT, OSCS = OFF
#pragma config PWRT = ON, BOR = OFF
#pragma config WDT = OFF
#pragma config STVR = ON, LVP = OFF
#pragma code high_vector = 0x0008

void interrupt_1(void);
void interrupt_at_high_vector(void)
{
	_asm GOTO interrupt_1 _endasm
}
#pragma code
#pragma interrupt interrupt_1

//******GLOBALS********
int temp = 0;
int temp2 = 0;

void init (void){
//************INIT PORTS*************
	TRISB = 0b00000000; // PORTB 0-7 OUT
	TRISC = 0b00000000; // PORT C OUT
	TRISA = 0b00000001; // PORT A0 IN resterande ut

//************TIMER2****************
	T2CON = 0b01111101; // prescaler 1:4, Timer2 on
 	INTCONbits.GIE = 1; // Global Interrupt
 	INTCONbits.PEIE = 1; // 
 	PIR1bits.TMR2IF = 0; //clearar flaggan
 	PIE1bits.TMR2IE = 1; //Timer 2 interrupt enable
 	IPR1bits.TMR2IP = 1; //High priority
 	TMR2 = 0;			//clear Timer 2
 	PR2 = 0b11111111;

//***********A/D********************
	ADCON0 = 0b10000001; // A/D settings
	ADCON1 = 0b00001110; // --::--
	PIE1bits.ADIE = 0; //A/D interrupt disable
	PIE2bits.ECCP1IE = 0;
	PIE2bits.EEIE = 0;
	PIE2bits.CMIE = 0;
	PIR2bits.ECCP1IF = 0;
	PIR2bits.EEIF = 0;
	PIR2bits.CMIF = 0;
	IPR2bits.ECCP1IP = 0;
	IPR2bits.EEIP = 0;
	IPR2bits.CMIP = 0;	  	
}

void interrupt_1(){
	if (temp <= 127){
		PORTCbits.RC7 = 0;
	}
	else{
		PORTCbits.RC7 = 1;
	}
	
	if (temp > 256){
		temp = 0;	
	}
	
	if (temp2 <= 127){
		PORTCbits.RC6 = 1;
	}
	else{
		PORTCbits.RC6 = 0;
	}
	
	temp++;
	PIR1bits.TMR2IF = 0;
	
}


void main (void){ 

	init();
	while (1){
		if(ADCON0bits.GO == 0){
			temp2 = ADRESH;
		}
		else{
		}
	}

}
Had evarit till stor hjälp om man bara hade kunnat simulera Analoga signaler i Mplab.

hoppas någon har några tips!

Postat: 16 juni 2008, 10:36:57
av Andy
Vad har du för inställning på ANSEL eller motsvarande ?

Postat: 16 juni 2008, 10:48:13
av sodjan
Skriv ett litet enkelt test-case (gärna i assembler så att du vet vad som
händer) för att kolla att du kan få igång ADCn.

Postat: 16 juni 2008, 13:17:35
av slatte
Kom på vad jag hade glömt :-)

hade glömt att starta avläsningen av porten genom att sätta!

Kod: Markera allt

ADCON0bits.GO = 1;
Men går det verkligen inte simulera analoga signaler i MPLAB ?

Men tack ändå !

Postat: 16 juni 2008, 13:42:53
av sodjan
Du kan simulera värden i ADRESx registren.
Du kan däremot så vitt jag vet inte simulera
själva den analoga signalen.

Postat: 16 juni 2008, 19:56:29
av slatte
Oki något för dem att utveckla då :-)

Tur att det löste sig relativt smidigt denna gång ialf

Postat: 16 juni 2008, 20:10:12
av sodjan
> Oki något för dem att utveckla då

Hur tänker du att det skulle fungera ?
Lite svårt att koppla in en *analog* signal i MPSIM.

Postat: 16 juni 2008, 23:28:51
av slatte
Inte riktigt så jag menade!

utan t.ex att man kunde i programmet simulera att det ligger 3 v på en analog ingång t.ex RA0 sedan kan simulator göra om det till ett binärt tal. Vet inte hur jag ska förklara det men typ så. dock inte så viktigt :-)

ungefär som man använder stimulus men istället för att ge en logisk etta/nolla eller toggla så kan man istället på ingången ange ett späningingsvärde.

Postat: 17 juni 2008, 07:47:16
av Icecap
Men med stimuli kan man ange att ADC-register ska få ett visst värde, alltså kan man mycket väl klara av det.