TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: kaki en 07 de Agosto de 2010, 01:15:30
-
Buenas desarolle una funcion que de duvuelve un valor char :
char TeclaLeida (){
int valor;
char TeclaChar;
valor = medir();
if (valor<150)
TeclaChar='#';
else if (valor<154)
TeclaChar='9';
else if (valor<160)
TeclaChar='6';
else if (valor<165)
TeclaChar='3';
else if (valor<175)
TeclaChar='0';
else if (valor<180)
TeclaChar='8';
else if (valor<188)
TeclaChar='5';
else if (valor<195)
TeclaChar='2';
else if (valor<205)
TeclaChar='*';
else if (valor<211)
TeclaChar='7';
else if (valor<223)
TeclaChar='4';
else if (valor<233)
TeclaChar='1';
else
TeclaChar='A';
return TeclaChar;
}
Bueno el problema q tengo es que cuando llamo esa funcion en el programa principal:
void main() {
char Tecla;
int i=0;
configuracion ();
while (TRUE){
lcd_gotoxy(1,1);
lcd_putc("Ingrese Pass:");
Tecla = TeclaLeida(); // -------------------> ACA ME DA EL ERROR EN ESTA LINEA
if (Tecla != 'A') {
Pass[i] = Tecla; //---> ES UN ARREGLO CHAR GLOBAL...
i++;
}
}
}
Me da el siguiente error: *** Error 51 "Principal.c" Line 32(21,22): A numeric expression must appear here
La verdad es que ya agote me pensamiento y no se por que me dice q tiene que haber una exprecion numerica.
Espero que entiendan algo de todo este lio que arme.
-
¿lcd_putc() no es para poner en el LCD un carácter (no un string)? :shock:
-
¿lcd_putc() no es para poner en el LCD un carácter (no un string)? :shock:
Pero en CCS se puede :? Envía un string al LCD.
Yo al programa no le veo ningun error :undecided:
-
lcd_putc() me ha funcionado, hasta ahora siempre colocandole una string adentro tal como lo hace nuestro amigo kaki, quizá pueda depender de la librería que estás usando y es la que provoca el error.
Para comprobar eso usa
printf(lcd_putc,"Ingrese pass:");
saludos.
-
Creo que no todos los IF llegan al 'return' de la función.
-
¿Capaz anidó demasiados if?
No sé cuál será el límite de anidamiento del CCS...
-
El número que tu función espera es el que va detrás del "return". Lo has puesto sin paréntesis y son obligatorios.
-
Ja! Yo copio lo mostrado, compilo y ningún problema (CCS 4.108). Por lo menos de compilación no me indica nada, del funcionamiento, ni idea :mrgreen:
Saludos!
-
Insertar Cita
El número que tu función espera es el que va detrás del "return". Lo has puesto sin paréntesis y son obligatorios.
Publicado en: Hoy a las 11:35:12 Publicado por: BrunoF
Donde me fala los parentecis?
Con respecto a lo que dicen del lcd no esa parte es aca:Tecla = TeclaLeida(); por cuando le pongo la // barra a esa linea, compila sin error y sin warning.
Es un problema en la funcion pero no logro detectarlo.
-
Más organizadito :mrgreen: sería:
if(....){
}else if(....){
}else{
}
return(...);
Saludos!
-
Aquí te faltan los paréntesis:
return (TeclaChar);
-
no me sigue dando el error!! Ya sueño de noche con este maldito error!
-
Hice lo que me dijo Suky...
char TeclaLeida (){
int valor;
char TeclaChar;
valor = medir();
if (valor < 150){
TeclaChar = '#';
}else if (valor<154){
TeclaChar = '9';
}else if (valor<160){
TeclaChar = '6';
}else if (valor<165){
TeclaChar = '3';
}else if (valor<175){
TeclaChar = '0';
}else if (valor<180){
TeclaChar = '8';
}else if (valor<188){
TeclaChar = '5';
}else if (valor<195){
TeclaChar = '2';
}else if (valor<205){
TeclaChar = '*';
}else if (valor<211){
TeclaChar = '7';
}else if (valor<223){
TeclaChar = '4';
}else if (valor<233){
TeclaChar = '1';
}else{
TeclaChar = 'A';
}
return (TeclaChar);
}
y adivinen que!!
Me sigue dando el error!!!!!!!!!!!!!!!!!!
-
Pues yo también hice lo que dijo Suky
Ja! Yo copio lo mostrado, compilo y ningún problema (CCS 4.108). Por lo menos de compilación no me indica nada, del funcionamiento, ni idea :mrgreen:
Saludos!
y también me compila sin errores. Versión 4.093
¿Cuál es tu versión?
-
IDE Version 4.104
PCB Version 4.104
PCM Version 4.104
PCH Version 4.104
PCD Version 4.104
Esa es mi version me parece q es superior!! Aclaro que yo no uso el IDE de PCW uso MPLAB
-
Yo también he compilado desde MPLAB.
-
Aquí te faltan los paréntesis:
return (TeclaChar);
Los paréntesis del return siempre son opcionales. ;-)
-
Pues lo acabo de probar sin paréntesis y tienes razón Santiago.
Al leer la ayuda de CCS sobre return los he visto puesto y he pensado que eran obligatorios.
-
Hola kaki, acabo de hacer la misma prueba que hicieron Suki y Nocturno. Igual que a ellos, a mi no me muestra ningún error en la línea que dices (CCS V4.106). Creo que debe haber algo más en tu código que está causando el error y sin verlo completo va a ser muy difícil encontrarlo.
Saludos!
-
En CCS muchas veces sucede que los errores en alguna linea no son provocados por esa linea.... osea pueden ser causado por falta de memoria u otras cosas.
Te sugiero que pruebes en un proyecto nuevo solamente esta sección de tu codigo y va a funcionar correctamente, pero en el conjunto va a fallar.
Saludos
-
#include <18F2550.h>
#device adc=8
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(oscillator=20M)
//LCD
#define use_portb_lcd TRUE
#include <lcd.c>
//Libreria STRING
#include <string.h>
//Variables Globales
char Pass[4];
//Declaro Funciones
void configuracion ();
int medir ();
char LeerEEPROM ();
void EscribirEEPROM ();
void TeclaLeida();
void ComprobarPASS();
//Principal
void main() {
int i=0;
char tecla;
configuracion ();
while (TRUE){
lcd_gotoxy(1,1);
printf(lcd_putc,"Ingrese Pass:");
tecla = TeclaLeida ();
if (tecla != 'A'){
Pass[i] = Tecla;
i++;
}
}
}
//Funciones/////////////////////////////////////////////////////////
char TeclaLeida (){
int valor;
char TeclaChar;
valor = medir();
if (valor < 150){
TeclaChar = '#';
}else if (valor<154){
TeclaChar = '9';
}else if (valor<160){
TeclaChar = '6';
}else if (valor<165){
TeclaChar = '3';
}else if (valor<175){
TeclaChar = '0';
}else if (valor<180){
TeclaChar = '8';
}else if (valor<188){
TeclaChar = '5';
}else if (valor<195){
TeclaChar = '2';
}else if (valor<205){
TeclaChar = '*';
}else if (valor<211){
TeclaChar = '7';
}else if (valor<223){
TeclaChar = '4';
}else if (valor<233){
TeclaChar = '1';
}else{
TeclaChar = 'A';
}
return TeclaChar;
}
void ComprobarPASS(){
if (strcmp(LeerEEPROM(),Pass)== 0 ){
lcd_gotoxy(2,2);
lcd_putc("Bienvenido");
}else{
lcd_gotoxy(2,2);
lcd_putc("EROR de Contraceña");
}
}
char LeerEEPROM (){
char LAST_VOLUME=0;
return read_EEPROM (LAST_VOLUME);
}
int medir () {
int Medicion=0;
Medicion = read_adc();
delay_ms( 100 );
return Medicion;
}
void configuracion () {
//ADC
setup_adc_ports(AN0|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_32);
set_adc_channel(0);
//LCD
lcd_init();
}
ahi esta el codigo completo
-
Hola kaki. Cambia esta declaración de la función en Declaro Funciones: void TeclaLeida(); por esta otra: char TeclaLeida(); Como esta última es que creaste la función y asi mismo la debes declarar.
Saludos!
-
no loco que pelotudo que soy...... no sabes las veces que lei el codigo... es al pedo "Solo ves lo que uno quiere ver"..
Gracias por todo che!!
-
:D Por eso era que no veíamos nada mal :D
-
eso me paso por que modifique la funcion... y despues me se me paso de cambiar ese detalle q me volvio loco 2 dias!! no puedo creer que sea tan pavo!!
-
Pues yo estaba convencido de que si la declaración de función no coincide con la función desarrollada posteriormente el CSS mandaba un aviso de "Previous declaration not equal ..." o algo así. :shock:
Edito: Acabo de hacer la prueba con mi CSS 4.093 ... ¡CSS nunca dejará de sorprenderme!
Declaro: int8 init_buffer(int16 maxlen, char *buffer);
Desarrollo: void init_buffer(int16 maxlen, char *buffer){ .... }
Utilizo en linea 999: init_buffer(LEN_BUFFER,rec_buffer);
Y CSS me dice que "Error 112 ... Line 999(1,1); Function used but not defined: ... init_buffer SCR=1230"
Pero si ...
Declaro: void init_buffer(int16 maxlen, char *buffer);
Desarrollo: char init_buffer(int16 maxlen, char *buffer){ .... return 'A'}
Utilizo en linea 999: x = init_buffer(LEN_BUFFER,rec_buffer);
Y CSS me dice que "Error 51 ... Line 999(41,42); A numeric expression must appear here"
O sea que cualquier error es posible menos el de que la declaración de la función y la función misma son distintas. Cualquier parecido con la realidad es mera coincidencia.
Para cortarse las venas y no sangrar. :?
-
O sea que cualquier error es posible menos el de que la declaración de la función y la función misma son distintas. Cualquier parecido con la realidad es mera coincidencia.
Para cortarse las venas y no sangrar. :?
:D :D :D
Pues si... Como quién dice, sería lo mismo y confundiría menos si el manejador de errores de CCS sacara la línea:
"Error XX ... Line xxx(XX,XX); Usted se ha equivocado..." :5]