TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: FFAQ en 04 de Septiembre de 2022, 20:54:15
-
Alguien podria ayudarme, usando el pic16f690 me sale ese error en proteus a pesar de que el codigo compila correctamente
#include <pic.h>
/* PIC Configuration Bit:
** INTIO - Using Internal RC No Clock
** WDTDIS - Wacthdog Timer Disable
** PWRTEN - Power Up Timer Enable
** MCLREN - Master Clear Enable
** UNPROTECT - Code Un-Protect
** UNPROTECT - Data EEPROM Read Un-Protect
** BORDIS - Borwn Out Detect Disable
** IESODIS - Internal External Switch Over Mode Disable
** FCMDIS - Monitor Clock Fail Safe Disable
*/
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT \
& UNPROTECT & BORDIS & IESODIS & FCMDIS);
// Using Internal Clock of 8 Mhz
#define FOSC 8000000L
// Servo definition and variables
#define MAX_VALUE 200
#define CCW_ROTATION MAX_VALUE - 20
#define CW_ROTATION MAX_VALUE - 10
#define STOP_ROTATION MAX_VALUE
#define THRESHOLD_VALUE 50
unsigned char pulse_max=0;
unsigned char pulse_top=0;
unsigned char top_value = 0;
void __interrupt() isr(void)
{
if(T0IF) { // TIMER0 Interrupt Flag
pulse_max++; // Pulse Max Increment
pulse_top++; // Pulse Top Increment
/* MAX_VALUE=200 turn off the pulse */
if (pulse_max >= MAX_VALUE) {
pulse_max=0;
pulse_top=0;
RC2=0; // Turn off RC2
}
/* top_value = MAX_VALUE - n, n=10: 10 x 0.1ms = 1.0ms, n=20: 20 x 0.1ms = 2.0ms */
/* 2ms -> CCW Rotation, 1ms -> CW Rotation */
if (pulse_top == top_value) {
RC2=1; // Turn On RC2
}
TMR0 = 156; // Initial Value for 0.1ms Interrupt
T0IF = 0; // Clear TIMER0 interrupt flag
}
}
void main(void)
{
unsigned char ldr_left;
unsigned char ldr_right;
int ldr_diff;
OSCCON=0x70; // Select 8 Mhz internal clock
ANSEL = 0x00;
ANSELH = 0x00;
TRISC = 0x00;
PORTC = 0x00;
/* Initial Port Used */
TRISC = 0x03; // Set RC0 and RC1 as input others as Output
ANSEL = 0x30; // Set PORT AN4 and AN5 as analog input
ANSELH = 0x00; // Set PORT AN8 to AN11 as Digital I/O
PORTC = 0x00; // Turn Off all PORTC
/* Init Servo Pulse */
pulse_max=0;
pulse_top=0;
top_value = MAX_VALUE; // top_value = MAX_VALUE: Servo Motor Stop
/* Initial ADC */
ADCON1=0b00110000; // Select the FRC for 8 Mhz
/* Init TIMER0: Period: Fosc/4 x Prescaler x TMR0
0.0005 ms x 2 * 100 = 0.1 ms */
OPTION_REG = 0b00000000; // 1:2 Prescaller
TMR0=156; // Interupt every 0.1 ms
T0IE = 1; // Enable interrupt on TMR0 overflow
GIE = 1; // Global interrupt enable
for(;;) {
/* Read the ADC here */
ADCON0=0b00010001; // select left justify result. ADC port channel AN4
GO_DONE=1; // initiate conversion on the channel 4
while(GO_DONE) continue; // Wait for ldr_left conversion done
ldr_left=ADRESH; // Read 8 bits MSB, Ignore 2 bits LSB in ADRESL
ADCON0=0b00010101; // select left justify result. ADC port channel AN5
GO_DONE=1; // initiate conversion on the channel 5
while(GO_DONE) continue; // Wait for ldr_right conversion done
ldr_right=ADRESH; // Read 8 bits MSB, Ignore 2 bits LSB in ADRESL
/* Get the different */
ldr_diff=ldr_left - ldr_right;
if ((ldr_diff >= -THRESHOLD_VALUE) && (ldr_diff <= THRESHOLD_VALUE)) {
top_value = MAX_VALUE; // Stop the Servo Motor
} else {
if (ldr_diff > THRESHOLD_VALUE) {
top_value = CCW_ROTATION; // Counterclockwise Rotation
} else {
top_value = CW_ROTATION; // Clockwise Rotation
/* Init TIMER0: Period: Fosc/4 x Prescaler x TMR0
0.0005 ms x 2 * 100 = 0.1 ms */
}
}
}
}
/* Init TIMER0: Period: Fosc/4 x Prescaler x TMR0
0.0005 ms x 2 * 100 = 0.1 ms */
-
Alguien podria ayudarme, usando el pic16f690 me sale ese error en proteus a pesar de que el codigo compila correctamente
Si te compila correctamente, no saldría ningún error
-
Buscando ese error en google
https://www.electro-tech-online.com/threads/proteus-simulation-error.141061/ (https://www.electro-tech-online.com/threads/proteus-simulation-error.141061/)
Lo que indica es que al intentar acceder a la memoria EEPROM de tu dispositivo, a las direcciones donde deseas escribir y/o leer algo, no existe.
Lo más seguro es que tomaste el código para un PIC y lo estás deseando implementar en otro donde una de las características que posee, en este caso la memoria EEPROM, no corresponde o no son iguales.
Tampoco se ve en el código una rutina u algo relacionado con la administración de esa región de la memoria.
-
Estaba buscando tu problema y parece algo común, hasta en este foro hay alguien que hace la misma pregunta sin respuesta:
https://www.todopic.com.ar/foros/index.php?topic=24665.0 (https://www.todopic.com.ar/foros/index.php?topic=24665.0)
Ahora comprendo lo que dices que compila bien, pero al intentar simular el hexadecimal, te da ese error a pesar que no estás trabajando con esa región de la memoria.
Y parece que es un error de proteus que no logra interpretar la EEPROM para la simulación (A pesar que no se la use)
EN ninguna parte dicen como solucionarlo, sólo acá indica que se solucionó al rehacer el proyecto.
Al intentar obtener el IC en proteus, intenté abrir el proyecto y estaba dañado y no me dejaba abrirlo. Así que lo he vuelto a hacer. Cuando haya simulado el nuevo proyecto de nuevo para ver los errores. Ha funcionado correctamente. Así que supongo que todo fue porque el proyecto anterior estaba mal. Gracias por la ayuda
https://electronics.stackexchange.com/questions/485571/proteus-program-address-is-not-within-code-memory (https://electronics.stackexchange.com/questions/485571/proteus-program-address-is-not-within-code-memory)
-
A ese código lo compilo con XC8 y lo simulo en Proteus 8.12 y no da error.
(Solamente Proteus protesta porque entre la selección del canal y el inicio de la conversión no dejaste pasar un tiempo)