TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: joseluislo12 en 09 de Diciembre de 2016, 18:01:34
-
Buenos días
Instalé MPlab X V3.45 y descargué el plugin CCS Compiler V3.8 (tengo instalado en mi pc el CCS C Compiler V5.0115 registrador por KGG).
Creé un nuevo proyecto en el directorio por defecto que trae el programa y creé un nuevo Source File. Adicionalmente haciendo clic derecho en el nombre del proyecto y siguiendo la ruta Properties -> CCS C Compiler -> Compiler Options -> Include Directories agregué las carpetas DEVICES y DRIVERS de la carpeta raíz al instalar el PIC C en el pc.
El programa que estoy haciendoes el siguiente:
#include <16F1827.h>
#FUSES NOWDT, NOPUT, PROTECT, NOMCLR, NOCLKOUT, NOCPD, NOBROWNOUT, PLL, INTRC_IO,
#use delay(clock=4M)
#define EEPROM_SELECT PIN_A0
#define EEPROM_CLK PIN_B4
#define EEPROM_DI PIN_B1
#define EEPROM_DO PIN_B2
#define LCD_DB4 PIN_A7
#define LCD_DB5 PIN_B7
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B5
#define LCD_RS PIN_A1
#define LCD_E PIN_A6
#define SELECT PIN_A4
#define LED PIN_B3
#define PIN_TRANS PIN_A3
#define RC5 1
#define SIRC 2
#include <eeprom25040.c>
#include <lcd_lib.c>
int freq, quanty = 0;
int ord_zero, zero_l1, zero_l2, zero_h1, zero_h2 = 0;
int ord_one, one_l1, one_l2, one_h1, one_h2 = 0;
int data[22][7] = {0};
int frequency_h, frequency_l;
int quant_total;
int16 t_zero_l, t_zero_h;
int16 t_one_l, t_one_h;
int16 t_start_l, t_start_h;
int pos, pos2;
int value, value_1, value_2;
int16 aux;
int16 address_H, address_L;
int16 comand, ncomand;
int toggle = 0;
int invert_zero, invert_one;
int FLAG_EXT=0;
#INT_EXT
void ext_int(){
FLAG_EXT=1;
}
void protocol(int prot){
switch(prot){
case RC5:
freq = 0;
quanty = 4;
ord_zero = 1;
one_l1 = make8(889,0);
one_l2 = make8(889,1);
one_h1 = make8(889,0);
one_h2 = make8(889,1);
ord_one = 0;
zero_l1 = make8(889,0);
zero_l2 = make8(889,1);
zero_h1 = make8(889,0);
zero_h2 = make8(889,1);
data[0][0] = 0; // Ord
data[0][1] = 0b0; // Type
data[0][2] = 2; // quant
data[1][0] = 1;
data[1][1] = 0b010;
data[1][2] = 1;
data[2][0] = 1;
data[2][1] = 0b011;
data[2][2] = 5;
data[3][0] = 1;
data[3][1] = 0b100;
data[3][2] = 6;
break;
case SIRC:
freq = 1;
quanty = 4;
ord_zero = 1;
one_l1 = make8(600,0);
one_l2 = make8(600,1);
one_h1 = make8(600,0);
one_h2 = make8(600,1);
ord_one = 1;
zero_l1 = make8(600,0);
zero_l2 = make8(600,1);
zero_h1 = make8(1200,0);
zero_h2 = make8(1200,1);
data[0][0] = 0; // Ord
data[0][1] = 0b000; // Type
data[0][2] = 1; // quant
data[1][0] = 0;
data[1][1] = 0b100;
data[1][2] = 7;
data[2][0] = 0;
data[2][1] = 0b011;
data[2][2] = 12;
data[3][0] = 0;
data[3][1] = 0b001;
data[3][2] = 1;
break;
}
}
void write(){
if(FLAG_EXT==1){
FLAG_EXT=0;
pos++;
if(pos > 3){pos = 0;}
}
if(pos == 1){
output_TOGGLE(LED);
lcd_putc("\f");
printf(lcd_putc, "Protocolo");
lcd_gotoxy(1,2);
printf(lcd_putc, "RC5");
protocol(RC5);
pos2 = 0;
value = quanty << 2;
value += freq;
write_ext_eeprom(pos2,value); // 0
delay_ms(10);
value = ord_one << 1;
value += ord_zero;
pos2++;
write_ext_eeprom(pos2,value); // 1
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,one_l1); // 2
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,one_l2); // 3
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,one_h1); // 4
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,one_h2); // 5
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,zero_l1); // 6
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,zero_l2); // 7
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,zero_h1); // 8
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,zero_h2); // 9
delay_ms(10);
value = data[0][2] - 1; // quant - 1
value = value << 4;
value += (data[0][1] << 1);
value += data[0][0];
pos2++;
write_ext_eeprom(pos2,value); // 10
delay_ms(10);
value = data[1][2] - 1; // quant - 1
value = value << 4;
value += (data[1][1] << 1);
value += data[1][0];
pos2++;
write_ext_eeprom(pos2,value); // 11
delay_ms(10);
value = data[2][2] - 1; // quant - 1
value = value << 4;
value += (data[2][1] << 1);
value += data[2][0];
pos2++;
write_ext_eeprom(pos2,value); // 12
delay_ms(10);
value = data[3][2] - 1; // quant - 1
value = value << 4;
value += (data[3][1] << 1);
value += data[3][0];
pos2++;
write_ext_eeprom(pos2,value); // 13
delay_ms(10);
pos++;
}
if(pos == 3){
output_TOGGLE(LED);
lcd_putc("\f");
printf(lcd_putc, "Protocolo");
lcd_gotoxy(1,2);
printf(lcd_putc, "SIRC");
protocol(SIRC);
pos2 = 20;
value = quanty << 2;
value += freq;
write_ext_eeprom(pos2,value); // 20
delay_ms(10);
value = ord_one << 1;
value += ord_zero;
pos2++;
write_ext_eeprom(pos2,value); // 21
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,one_l1); // 22
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,one_l2); // 23
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,one_h1); // 24
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,one_h2); // 25
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,zero_l1); // 26
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,zero_l2); // 27
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,zero_h1); // 28
delay_ms(10);
pos2++;
write_ext_eeprom(pos2,zero_h2); // 29
delay_ms(10);
value = data[0][2] - 1; // quant - 1
value = value << 4;
value += (data[0][1] << 1);
value += data[0][0];
pos2++;
write_ext_eeprom(pos2,value); // 30
delay_ms(10);
value = data[1][2] - 1; // quant - 1
value = value << 4;
value += (data[1][1] << 1);
value += data[1][0];
pos2++;
write_ext_eeprom(pos2,value); // 31
delay_ms(10);
value = data[2][2] - 1; // quant - 1
value = value << 4;
value += (data[2][1] << 1);
value += data[2][0];
pos2++;
write_ext_eeprom(pos2,value); // 32
delay_ms(10);
value = data[3][2] - 1; // quant - 1
value = value << 4;
value += (data[3][1] << 1);
value += data[3][0];
pos2++;
write_ext_eeprom(pos2,value); // 33
delay_ms(10);
pos++;
}
}
void frequency(){
if((frequency_h == 38) && (frequency_l == 38)){
output_HIGH(PIN_TRANS);
delay_cycles(38);
output_LOW(PIN_TRANS);
delay_cycles(38);
}
else if((frequency_h == 40) && (frequency_l == 40)){
output_HIGH(PIN_TRANS);
delay_cycles(40);
output_LOW(PIN_TRANS);
delay_cycles(40);
}
else if((frequency_h == 48) && (frequency_l == 98)){
output_HIGH(PIN_TRANS);
delay_cycles(48);
output_LOW(PIN_TRANS);
delay_cycles(98);
}
}
void start(){
for(aux=0;aux<300;aux++){frequency();}
output_LOW(PIN_TRANS);
delay_us(t_start_l);
}
void zero(){
switch(invert_zero){
case 0:
output_LOW(PIN_TRANS);
delay_us(t_zero_l);
for(aux=0;aux<21;aux++){frequency();}
break;
case 1:
for(aux=0;aux<21;aux++){frequency();}
output_LOW(PIN_TRANS);
delay_us(t_zero_l);
break;
}
}
void one(){
switch(invert_one){
case 0:
output_LOW(PIN_TRANS);
delay_us(t_one_l);
for(aux=0;aux<21;aux++){frequency();}
break;
case 1:
for(aux=0;aux<21;aux++){frequency();}
output_LOW(PIN_TRANS);
delay_us(t_one_l);
break;
}
}
void bytes_send(int16 byte_send, int quanty){
pos = 0;
do{
if(bit_test(byte_send,pos) == 1){one();}
else{zero();}
pos++;
}while(pos<=quanty);
}
void send_IR(int protocol){
switch(protocol){
case RC5:
address_H = 0b01010;
comand = 0b010101;
start();
if(toggle == 0){
toggle = 1;
goto send;
}
else if(toggle == 1){toggle = 0;}
send:
bytes_send(toggle,1);
bytes_send(address_H,5);
bytes_send(comand,6);
break;
}
}
void read(){
if(FLAG_EXT==1){
FLAG_EXT=0;
pos++;
if(pos > 3){pos = 0;}
}
if(pos == 1){
output_TOGGLE(LED);
pos2 = 0;
value = read_ext_eeprom(0); // 0
value_1 = bit_test(value,1);
value_2 = bit_test(value,2);
switch(value_1 + value_2){
case 0:
frequency_h = 38;
frequency_l = 38;
break;
case 1:
frequency_h = 40;
frequency_l = 40;
break;
case 2:
frequency_h = 48;
frequency_l = 98;
break;
}
quant_total = read_ext_eeprom(0) >> 2; // 0
value = read_ext_eeprom(1); // 1
invert_zero = bit_test(value,0);
invert_one = bit_test(value,1);
value_1 = read_ext_eeprom(2); // 2
value_2 = read_ext_eeprom(3); // 3
t_zero_l = make16(value_2,value_1);
value_1 = read_ext_eeprom(4); // 4
value_2 = read_ext_eeprom(5); // 5
t_zero_h = make16(value_2,value_1);
value_1 = read_ext_eeprom(6); // 6
value_2 = read_ext_eeprom(7); // 7
t_one_l = make16(value_2,value_1);
value_1 = read_ext_eeprom(8); // 8
value_2 = read_ext_eeprom(9); // 9
t_one_h = make16(value_2,value_1);
value_1 = read_ext_eeprom(10); // 10
value_2 = read_ext_eeprom(11); // 11
t_start_l = make16(value_2,value_1);
value_1 = read_ext_eeprom(12); // 12
value_2 = read_ext_eeprom(13); // 13
t_start_h = make16(value_2,value_1);
l
cd_putc("\f");
printf(lcd_putc, "Protocolo");
lcd_gotoxy(1,2);
printf(lcd_putc, "RC-5");
send_IR(1);
delay_ms(5000);
pos++;
}
}
void main(){
enable_interrupts(int_ext);
ext_int_edge(H_TO_L);
enable_interrupts(GLOBAL);
init_ext_eeprom();
lcd_init();
pos = 0;
invert_zero = 1;
invert_one = 1;
output_LOW(LED);
while(true){
if(input(SELECT)){
pos = 0;
lcd_putc("\f");
printf(lcd_putc, "WRITE");
while(input(SELECT)){write();}
}
else if(!input(SELECT)){
pos = 0;
lcd_putc("\f");
printf(lcd_putc, "READ");
while(!input(SELECT)){read();}
}
}
}
Me genera errores en las siguientes instrucciones:
- output_TOGGLE(LED);
- output_HIGH(PIN_TRANS);
- output_LOW(PIN_TRANS);
- enable_interrupts(int_ext);
- while(true){}
No entiendo por qué me genera errores en estas funciones, y el IDE no presenta ayudas o soluciones para estos errores. Al final al hacer un Clean and Build Project me sale este mensaje:
CLEAN SUCCESSFUL (total time: 203ms)
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory \'C:/Users/l/MPLABXProjects/Memoria.X\'
make -f nbproject/Makefile-default.mk dist/default/production/Memoria.X.production.hex
make[2]: Entering directory \'C:/Users/l/MPLABXProjects/Memoria.X\'
gnumkdir -p build/default/production
gnumkdir -p dist/default/production
"C:\\PROGRA~2\\PICC\\CCSCON.exe" out="build/default/production" Memoria.c +FM +DF +CC +Y=9 +EA I+="C:\\Program Files (x86)\\PICC\\Devices" I+="C:\\Program Files (x86)\\PICC\\Drivers" +DF +LN +T +A +M +J +EA +Z -P #__16F1827=1
nbproject/Makefile-default.mk:105: recipe for target \'build/default/production/Memoria.o\' failed
make[2]: Leaving directory \'C:/Users/l/MPLABXProjects/Memoria.X\'
nbproject/Makefile-default.mk:84: recipe for target \'.build-conf\' failed
make[1]: Leaving directory \'C:/Users/l/MPLABXProjects/Memoria.X\'
nbproject/Makefile-impl.mk:39: recipe for target \'.build-impl\' failed
mv: no se puede efectuar `stat\' sobre �build/default/production/Memoria.cof�: No such file or directory
make[2]: *** [build/default/production/Memoria.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
BUILD FAILED (exit value 2, total time: 4s)
Qusiera saber si me pueden ayudar a solucionar estos problemas.
Este mismo código en el IDE propio de PIC C funciona correctamente, pero deseo migrarlo a MPLab X para poder hacer uso del Pickit 3 como herramienta para el Debug. ...
-
"C:\\PROGRA~2\\PICC\\CCSCON.exe" out="build/default/production" Memoria.c +FM +DF +CC +Y=9 +EA I+="C:\\Program Files (x86)\\PICC\\Devices" I+="C:\\Program Files (x86)\\PICC\\Drivers" +DF +LN +T +A +M +J +EA +Z -P #__16F1827=1
Veo esos ", puntos y comas, doble barras, tal ves eso te esta dando problemas.
El IDE te va a acusar que esas funciones no existen, por que claramente no existen y son internas al compilador. Pero compilador te deberia dar bien. El error parece ser cuando intenta compilarlo.