Reputation: 31
I am running a hobby project and I encountred with a problem. I code the pic with MPLABX with XC8 compiler. I am using 3 analog inputs. They are AN0, AN1 and AN2. Timer0 interrupt is also used in the code. When I apply 5V on AN1 and AN2 it doesn't bother the PIC uC but when anything greater than 3V to the AN0, Pic resets itself and kept at reset till voltage goes under 3V.
Does anyone else encountered with such problem?
EDIT!!
I disabled timer interrupt and write the code below. It still creates the same problem whenever 5V applied to AN0.
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <p18f4520.h>
#include "my_header.h"
#define _XTAL_FREQ 20000000 // Fosc frequency for _delay() library
#define green_1 PORTCbits.RC1
#define green_2 PORTCbits.RC2
#define green_3 PORTCbits.RC3
#define green_4 PORTDbits.RD0
#define green_5 PORTDbits.RD1
#define green_6 PORTDbits.RD2
#define green_7 PORTDbits.RD3
#define green_8 PORTCbits.RC4
#define green_9 PORTCbits.RC5
#define green_10 PORTCbits.RC6
void main(){
int kg=0;
//setting the Oscillator Freq. to 125KHz for 8TAd to be 3.2 MicroSeconds
OSCCONbits.IRCF0=0;
OSCCONbits.IRCF1=0;
OSCCONbits.IRCF2=1;
//ADC Module Settings
ADCON1=0b00001100;
ADCON2=0b10010000;
TRISAbits.RA6=0;
TRISAbits.RA7=0;
TRISCbits.RC0=0;
TRISCbits.RC1=0;
TRISCbits.RC2=0;
TRISCbits.RC3=0;
TRISCbits.RC4=0;
TRISCbits.RC5=0;
TRISCbits.RC6=0;
TRISCbits.RC7=0;
TRISDbits.RD0=0;
TRISDbits.RD1=0;
TRISDbits.RD2=0;
TRISDbits.RD3=0;
TRISDbits.RD4=0;
TRISDbits.RD5=0;
TRISDbits.RD6=0;
while(1){
ADCON0=0x00;
ADCON0=0x03;
while(GODONE);
ADON=0;
kg=ADRES;
if (kg >200){
green_1=1;
green_2=0;
green_3=1;
green_4=0;
green_5=0;
green_6=1;
green_7=1;
green_8=0;
green_9=1;
green_10=1;
}
else {
green_1=0;
green_2=0;
green_3=0;
green_4=0;
green_5=0;
green_6=0;
green_7=0;
green_8=0;
green_9=0;
green_10=0;
}
}
}
Thank you all inadvance.
Upvotes: 1
Views: 426
Reputation: 1225
It appears that you are changing the OCCCON register to use a system clock of 125KHz but telling the compiler that you are using a 20MHz crystal oscillator.
You have not posted your configuration word settings so we cannot know what your system clock setup actually is.
In any case this is how I would setup your PIC18F4520:
/*
* File: main.c
* Target: PIC18F4520
* Compiler: XC8 v1.45
* IDE: MPLAB v8.92
*
* PIC18F4520
* +------------:_:------------+
* VPP -> 1 : RE3/MCLR/VPP PGD/RB7 : 40 <> PGD
* AIN(0-5V) -> 2 : RA0/AN0 PGC/RB6 : 39 <> PGC
* <> 3 : RA1 PGM/RB5 : 38 <>
* <> 4 : RA2 RB4 : 37 <>
* <> 5 : RA3 RB3 : 36 <>
* <> 6 : RA4 RB2 : 35 <>
* <> 7 : RA5 RB1 : 34 <>
* <> 8 : RE0 RB0 : 33 <>
* <> 9 : RE1 VDD : 32 <- PWR
* <> 10 : RE2 VSS : 31 <- GND
* PWR -> 11 : VDD RD7 : 30 <>
* GND -> 12 : VSS RD6 : 29 <>
* 20MHZ XTAL -> 13 : RA7/OSC1 RD5 : 28 <>
* 20MHZ XTAL <- 14 : RA6/OSC2 RD4 : 27 <>
* <> 15 : RC0/SOSCO RX/DT/RC7 : 26 <>
* GRN_LED1 <> 16 : RC1/SOSCI TX/CK/RC6 : 25 <> GRN_LED10
* GRN_LED2 <> 17 : RC2/CCP1 SPI_MOSI/RC5 : 24 <> GRN_LED9
* GRN_LED3 <> 18 : RC3/SPI_CLK SPI_MISO/RC4 : 23 <> GRN_LED8
* GRN_LED4 <> 19 : RD0 RD3 : 22 <> GRN_LED7
* GRN_LED5 <> 20 : RD1 RD2 : 21 <> GRN_LED6
* +---------------------------:
* DIP-40
*
*/
#pragma config OSC = HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config BOREN = OFF
#pragma config BORV = 3
#pragma config PWRT = OFF
#pragma config WDTPS = 32768
#pragma config WDT = OFF
#pragma config CCP2MX = PORTC
#pragma config LPT1OSC = ON
#pragma config MCLRE = ON
#pragma config STVREN = ON
#pragma config XINST = OFF
#pragma config LVP = OFF
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF
#pragma config CPD = OFF, CPB = OFF
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF
#pragma config WRTD = OFF, WRTB = OFF, WRTC = OFF
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF
#pragma config EBTRB = OFF
#include <xc.h>
/* Define the frequency we promise to set the clock at */
#define FSYS (20000000L)
#define FCYC (FSYS/4L)
#define _XTAL_FREQ FSYS
/*
* Define the LED output bits
*/
#define green_1 LATCbits.LATC1
#define green_2 LATCbits.LATC2
#define green_3 LATCbits.LATC3
#define green_4 LATDbits.LATD0
#define green_5 LATDbits.LATD1
#define green_6 LATDbits.LATD2
#define green_7 LATDbits.LATD3
#define green_8 LATCbits.LATC4
#define green_9 LATCbits.LATC5
#define green_10 LATCbits.LATC6
/*
* Main program
*/
void main(void)
{
/* declare variable to receive ADC data */
int kg;
/* Disable all interrupt sources */
INTCON = 0;
PIE1 = 0;
PIE2 = 0;
/* Setup the ADC for input on AN0 only */
ADCON0 = 0; /* Disable ADC */
ADCON1 = 0b00001110; /* Set AN0(RA0) as the ADC input */
ADCON2 = 0b10001101; /* Set Right justified data, ACQT as 2 TAD, ADCS as FOSC/16 (20MHz system clock) */
ADCON0bits.ADON = 1; /* Enable ADC */
/* Setup GPIO bits */
TRISCbits.TRISC0=0;
TRISCbits.TRISC1=0;
TRISCbits.TRISC2=0;
TRISCbits.TRISC3=0;
TRISCbits.TRISC4=0;
TRISCbits.TRISC5=0;
TRISCbits.TRISC6=0;
TRISCbits.TRISC7=0;
TRISDbits.TRISD0=0;
TRISDbits.TRISD1=0;
TRISDbits.TRISD2=0;
TRISDbits.TRISD3=0;
TRISDbits.TRISD4=0;
TRISDbits.TRISD5=0;
TRISDbits.TRISD6=0;
/*
* Application loop
*/
ADCON0bits.GO = 1; /* Start first ADC conversion */
for(;;)
{
if(ADCON0bits.GO == 0)
{
/* Save value of ADC conversion */
kg = ADRESL;
kg |= (int)(ADRESH)<<8;
/* Start next ADC conversion */
ADCON0bits.GO = 1;
/* show results in the LEDs */
if (kg >200){
green_1=1;
green_2=0;
green_3=1;
green_4=0;
green_5=0;
green_6=1;
green_7=1;
green_8=0;
green_9=1;
green_10=1;
}
else {
green_1=0;
green_2=0;
green_3=0;
green_4=0;
green_5=0;
green_6=0;
green_7=0;
green_8=0;
green_9=0;
green_10=0;
}
}
}
}
Upvotes: 1