TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Optimvs333 en 08 de Mayo de 2006, 14:43:41
-
Hola a todos...
Estoy haciendo mi proyecto de grado en un control difuso con PIC. Hice el programa en C usando el compilador CCS, lo compilo, no me da errores, lo simulo en proteus (P18F452) pero no funciona, entonces reviso paso a paso y muchas de las instrucciones en C las toma como comentarios y no las ejecuta, por tanto ejecuto la opción VIEW -> C/ASM LIST y me sale el programa compilado tanto en C como en asembler, y en realidad el proteus está ejecutando el código que el CCS compila incompleto.
¿¿Alguien sabe como resolver esta situación :shock: ??
Saludos desde Colombia,
Optimvs
-
¿podrias poner tu codigo?
Suerte!!! :wink:
-
Gracias por tu interés. Como puedes suponer el código es bastante extenso, pero te voy a mostrar una de las partes donde se me presenta el error:
CCS PCH C Compiler, Version 3.242, 16465 05-May-06 09:27
Filename: SoloControl.lst
ROM used: 1648 bytes (5%)
Largest free fragment is 31120
RAM used: 21 (1%) at main() level
49 (3%) worst case
Stack: 3 locations
*
0000: GOTO 05F8
.................... #include <18F452.h>
.................... //////// Standard Header file for the PIC18F452 device ////////////////
.................... #device PIC18F452
.................... #list
....................
.................... #device adc=10
....................
.................... #fuses WDT32, XT, NOPROTECT, BROWNOUT, BORV45, NOPUT, NOCPD
.................... #fuses NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD
.................... #fuses NOWRTC, NOWRTB, NOEBTR, NOEBTRB, NOCPB
....................
.................... #use delay(clock=4000000)
*
0004: CLRF FEA
0006: MOVLW 23
0008: MOVWF FE9
000A: MOVF FEF,W
000C: BZ 002C
000E: MOVLW 01
0010: MOVWF 01
0012: CLRF 00
0014: DECFSZ 00,F
0016: BRA 0014
0018: DECFSZ 01,F
001A: BRA 0012
001C: MOVLW 4A
001E: MOVWF 00
0020: DECFSZ 00,F
0022: BRA 0020
0024: NOP
0026: NOP
0028: DECFSZ FEF,F
002A: BRA 000E
002C: RETLW 00
....................
.................... #byte PuertoB =0xF84
.................... #bit t_ok =PuertoB.0 // RB0, pin33
.................... #bit t_mas =PuertoB.1 // RB1, pin34
.................... #bit t_mns =PuertoB.2 // RB2, pin35
....................
.................... #byte PuertoD =0xF81 //Define direccion del puerto D
.................... #bit Compresor_On =PuertoD.7 // RD0, pin19
.................... #bit Comp_Aux_On =PuertoD.6 // RD1, pin20
.................... #bit Valvula_On =PuertoD.5 // RD2, pin21
.................... #bit Valv_Aux_On =PuertoD.4 // RD3, pin21
....................
.................... #include <Fuzzy_Tesis.h>
.................... char __IDOM[2];
....................
.................... /* define los bit del puerto para realizar el control
.................... #byte PuertoD =0xF83 //Define direccion del puerto D
.................... #bit Compresor_On =PuertoD.0 // RD0, pin19
.................... #bit Comp_Aux_On =PuertoD.1 // RD1, pin20
.................... #bit Valvula_On =PuertoD.2 // RD2, pin21
.................... #bit Valv_Aux_On =PuertoD.3 // RD3, pin21*/
....................
.................... // Se definen algunas operaciones que se requieren en el control difuso
.................... #define F_UNO 0xff
.................... #define F_CERO 0x00
.................... #define F_OR(a,b) ((a) > (b) ? (a) : (b))
.................... #define F_AND(a,b) ((a) < (b) ? (a) : (b))
.................... #define F_NOT(a) (F_UNO+F_CERO-a)
....................
....................
....................
....................
.................... /* Este controlador trabaja midiendo la corriente cuando la unidad
.................... está subiendo y la corriente cuando la unidad está bajando, entonces
.................... hace el cálculo de la diferencia de la corriente en estas dos
.................... posiciones así:
....................
.................... Corriente = Corriente Máxima Subiendo - Corriente Máxima Bajando
....................
.................... Así pues tenemos que cuando los signos de la corriente son + o -
.................... se tiene:
....................
.................... Corriente (+) = Indica que la unidad se FORZA SUBIENDO
.................... Corriente (-) = Indica que la unidad se FORZA BAJANDO
....................
.................... Se mide además la PRESIÓN para determinar los rangos aceptables de
.................... operación en los que puede trabajar el cilindro.
....................
.................... Las entradas numéricas CRISP mas adelante se transforman en
.................... grados de pertenencia GdP con variables lingüísticas.
....................
.................... Las siguientes son las variables lingüísticas que van a ser usadas:
....................
.................... ------------------------------------------------------
.................... VARIABLE FISICA V. LINGÜISTICA RANGO
.................... ------------------------------------------------------
.................... PRESIÓN muy baja 0 - 120 psi
.................... baja 120 - 280 psi
.................... normal 280 - 420 psi
.................... alta 400 - 500 psi
.................... muy alta 480 - 600 psi
.................... ------------------------------------------------------
.................... CORRIENTE Forza_baja -80 a -3 Amp
.................... C_balance -5 a 5 Amp
.................... Forza_sube 3 a 80 Amp
.................... ------------------------------------------------------
....................
.................... -------------------------------------------------------*/
.................... //Variable Física: Presión Tipo int MIN 0 MAX 600 psi//
.................... //-----------------------------------------------------
....................
.................... /* MIEMBRO: muy_baja { 0 , 0 , 100 , 120 } */
.................... /*
....................
.................... 1-| ...
.................... | . ·
.................... | . ·
.................... | . .
.................... 0-| . ·..........................
.................... ----------------------------------
.................... 0 150 300 450 600
.................... */
....................
.................... int P_muy_baja (int __CRISP)
.................... {
.................... {
.................... if (__CRISP <= 100) return(255);
*
0298: MOVF 1D,W
029A: SUBLW 64
029C: BNC 02A6
029E: MOVLW FF
02A0: MOVWF 01
02A2: BRA 02C4
.................... else
02A4: BRA 02C4
.................... {
.................... if (__CRISP <= 120)
02A6: MOVF 1D,W
02A8: SUBLW 78
02AA: BNC 02BE
.................... return((( + 120 - __CRISP) * 12) + 7);
02AC: MOVLW 78
02AE: BSF FD8.0
02B0: SUBFWB 1D,W
02B2: MULLW 0C
02B4: MOVF FF3,W
02B6: ADDLW 07
02B8: MOVWF 01
02BA: BRA 02C4
.................... else
02BC: BRA 02C4
.................... return(0);
02BE: MOVLW 00
02C0: MOVWF 01
02C2: BRA 02C4
.................... }
.................... }
.................... }
02C4: GOTO 042C (RETURN)
....................
.................... /* MIEMBRO: baja { 75 , 100 , 350 , 375 } */
.................... /*
....................
.................... 1-| ......
.................... | . .
.................... | . .
.................... | . .
.................... 0-| ....· ·............
.................... ----------------------------------
.................... 0 150 300 450 600
....................
.................... */
....................
.................... int P_baja (int __CRISP)
.................... {
.................... if (__CRISP < 75) return(0);
*
02F8: MOVF 1D,W
02FA: SUBLW 4A
02FC: BNC 0306
02FE: MOVLW 00
0300: MOVWF 01
0302: BRA 0322
.................... else
0304: BRA 0322
.................... {
.................... if (__CRISP <= 100) return(((__CRISP - 75) * 10) + 5);
0306: MOVF 1D,W
0308: SUBLW 64
030A: BNC 031C
030C: MOVLW 4B
030E: SUBWF 1D,W
0310: MULLW 0A
0312: MOVF FF3,W
0314: ADDLW 05
0316: MOVWF 01
0318: BRA 0322
.................... else
031A: BRA 0322
.................... {
.................... if (__CRISP <= 350) return(255);
031C: MOVLW FF
031E: MOVWF 01
0320: BRA 0322
.................... else
.................... {
.................... if (__CRISP <= 375)
.................... return((( + 375 - __CRISP) * 10) + 5);
.................... else
.................... return(0);
.................... }
.................... }
.................... }
.................... }
0322: RETLW 00
....................
.................... /* MIEMBRO: normal { 350 , 380 , 420 , 450 } */
.................... /*
....................
.................... 1-| .....
.................... | . .
.................... | . .
.................... | . .
.................... 0-| .............. ............
.................... ----------------------------------
.................... 0 150 300 450 600
....................
.................... */
....................
.................... int P_normal (int __CRISP)
.................... {
.................... if (__CRISP < 350) return(0);
*
0386: MOVLW 00
0388: MOVWF 01
.................... else
.................... {
.................... if (__CRISP <= 380) return(((__CRISP - 350) *8 ) +8 );
.................... else
.................... {
.................... if (__CRISP <= 420) return(255);
.................... else
.................... {
.................... if (__CRISP <= 450)
.................... return((( + 450 - __CRISP) *8 ) +8 );
.................... else
.................... return(0);
.................... }
.................... }
.................... }
.................... }
038A: RETLW 00
Como te puedes percatar, el código en negrilla escrito en C no tiene su equivalente en asembler y por tanto el proteus simplemente no lo ejecuta. ¿alguna sugerencia?¿algún fusible no es el adecuado?¿debo activar alguna opción a la hora de compilar el proyecto?. En realidad esta es sólo una parte del código, pues se supone que tiene que haber visualización en un módulo LCD, pero creí que era por eso que no ejecutaba correctamente, así que aislé la etapa de visualización y dejé sólo la parte de control que es la que expongo.
Cordial Saludo y Gracias.
Optimvs
-
Perdonad que me meta en una conversación ajena :) :) :) .. pero ... veo que __CRISP la declaras como int luego solo puede admitir valores de 0 a 255 y sin embargo la estas usando por encima .... curiosamente los lugares donde no ha compilado coinciden con el uso de valores, comparando con ..., por encima de 255. :shock:
¿Tendrá algo que ver? ¿Y si pruebas a declarar esta __CRISP como long, 2 bytes, a ver qué pasa?
Prueba y dinos ...
-
Tenías razón... :-/ :-/ :mrgreen: ese era el problema, el compilador no es tonto (el tonto es otro)...
Gracias, luego les comento como me terminó de ir con el proyecto.
Saludos,
Optimvs
-
Me alegro de que redpic te solucionase el problema optimvs333, de todas formas te diré, por experiencia propia, que muchas veces los programas en el proteus no funcionan bien y sin embargo si los montas físicamente funcionan a la perfección. Otras veces es problema de las conexiones que están limitadas a ciertas corrientes... no sé, unos líos muy raros... Pues eso, para que lo tengas en cuenta por si acaso y no te vuelvas loco buscando errores que quizá no estén.
Un saludo
-
Gracias vanesa, he estado intentando de ambas maneras, pero aún tengo errores, estoy intentando reescribir el código para ver si puedo resolver mis problemas.
Saludos,
Optimvs