Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

17/11/2012 #1


Problema compilando 12F675 con RETARDOS.INC
Bueno gente, resulta que me hice un programa que prende y apaga unos leds de a uno usando todos los puertos de salida del pic 12F675, y decidí empezar a aprender sobre como usar librerías .inc externas al programa principal..

Entonces lo que hice fue bajarme un archivo (RETARDOS.inc) que tiene subrutinas de retardos predefinidas para una frecuencia de 4Mhz. No figura ningun error al compilar pero sin embargo no se compila. (Nótese que solamente puse include RETARDOS.inc, no use ninguna llamada al archivo).

A continuación el programa, RETARDOS.inc, y el resultado al compilar.

Si alguien se da cuenta donde esta el error que por favor me avise, si?
Gracias!

El código del programa:
Código:
;-------------------------------------------------------------
; Define el PIC
;-------------------------------------------------------------
                list         p=12f675
                #include     P12F675.INC
                #include    RETARDOS.INC
                org            0
                __CONFIG    _MCLRE_ON & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON
;-------------------------------------------------------------
; Calibración del RC interno
;-------------------------------------------------------------
                bsf         STATUS,RP0                        ;Bank 1
                call         3FFh                              ;Get the cal value
                movwf         OSCCAL                           ;Calibrate
                bcf         STATUS,RP0                        ;Bank 0
;-------------------------------------------------------------
; Configuración entradas y salidas
;-------------------------------------------------------------
;                bsf            STATUS,RP0    
;                movlw        b'001000'
;                movwf        TRISIO
;                bcf            STATUS,RP0
;                movlw        b'00000000'  ; Configura que no va a usar los conversores A/D
;                movwf        ANSEL      ; y que va a usar GP0,1,2 como I/O digitales

                bcf         STATUS,RP0         ;Bank 0
                clrf         GPIO             ;Init GPIO
                movlw         b'00000111'        ;Set GP<2:0> to 
                movwf         CMCON             ;digital IO
                bsf         STATUS,RP0         ;Bank 1
                clrf         ANSEL             ;Digital I/O
                movlw         b'000000'
                movwf         TRISIO
                bcf            STATUS,RP0
;-------------------------------------------------------------
; Declaración de variables
;-------------------------------------------------------------
PDel0            equ            d'00033'
PDel1            equ            d'00034'
PDel2            equ            d'00035'
;-------------------------------------------------------------
; Programa principal
;-------------------------------------------------------------
inicio            bsf            GPIO,0
                call        DEMORA
                bsf            GPIO,1
                call        DEMORA
                bsf            GPIO,2
                call        DEMORA
                bsf            GPIO,4
                call        DEMORA
                bsf            GPIO,5
                call        DEMORA
                bcf            GPIO,5
                call        DEMORA
                bcf            GPIO,4
                call        DEMORA
                bcf            GPIO,2
                call        DEMORA
                bcf            GPIO,1
                call        DEMORA
                bcf            GPIO,0
                call        DEMORA
                movlw        b'111111'
                movwf        GPIO
                call        DEMORA
                clrf        GPIO
                call        DEMORA
                movlw        b'111111'
                movwf        GPIO
                call        DEMORA
                clrf        GPIO
                call        DEMORA
                goto        inicio
;-------------------------------------------------------------
; Subrutina de retardo 1 segundo
;-------------------------------------------------------------
DEMORA          movlw     .14       ; 1 set numero de repeticion  (C)
                movwf     PDel0     ; 1 |
PLoop0          movlw     .72       ; 1 set numero de repeticion  (B)
                movwf     PDel1     ; 1 |
PLoop1          movlw     .247      ; 1 set numero de repeticion  (A)
                movwf     PDel2     ; 1 |
PLoop2          clrwdt              ; 1 clear watchdog
                decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
                goto      PLoop2    ; 2 no, loop
                decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
                goto      PLoop1    ; 2 no, loop
                decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
                goto      PLoop0    ; 2 no, loop
PDelL1          goto      PDelL2         ; 2 ciclos delay
PDelL2          clrwdt              ; 1 ciclo delay
                return              ; 2+2 Fin.
                END
Y el código de RETARDOS.inc:
Código:
;**************************** Librería "RETARDOS.INC" *********************************
;
;    ===================================================================
;      Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;      E. Palacios, F. Remiro y L. López.        www.pic16f84a.com
;       Editorial Ra-Ma.  www.ra-ma.es
;    ===================================================================
;
; Librería con múltiples subrutinas de retardos, desde 4 microsegundos hasta 20 segundos. 
; Además se pueden implementar otras subrutinas muy fácilmente.
;
; Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal
; de cuarzo a 4 MHz. Como cada ciclo máquina son 4 ciclos de reloj, resulta que cada
; ciclo máquina tarda 4 x 1/4MHz = 1 µs.
;
; En los comentarios, "cm" significa "ciclos máquina".
;
; ZONA DE DATOS *********************************************************************

RContA        equ    d'00060'                ; Contadores para los retardos.
RContB        equ    d'00061'
RContC        equ    d'00062'

;
; RETARDOS de 4 hasta 10 microsegundos ---------------------------------------------------
;
; A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4 MHZ,
; la llamada a subrutina "call" tarda 2 ciclos máquina, el retorno de subrutina
; "return" toma otros 2 ciclos máquina y cada instrucción "nop" tarda 1 ciclo máquina.
;
Retardo_10micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
Retardo_5micros                    ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
Retardo_4micros                    ; La llamada "call" aporta 2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.
;
; RETARDOS de 20 hasta 500 microsegundos ------------------------------------------------
;
Retardo_500micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    movlw    d'164'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_200micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    movlw    d'64'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_100micros                ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'31'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_50micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    movlw    d'14'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_20micros                ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'5'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
;
; El próximo bloque "RetardoMicros" tarda:
; 1 + (K-1) + 2 + (K-1)x2 + 2 = (2 + 3K) ciclos máquina.
;
RetardoMicros
    movwf    R_ContA                ; Aporta 1 ciclo máquina.
Rmicros_Bucle
    decfsz    R_ContA,F            ; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar).
    goto    Rmicros_Bucle        ; Aporta (K-1)x2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_500micros:    2 + 1 + 1 + 2 + (2 + 3K) = 500 cm = 500 µs. (para K=164 y 4 MHz).
; - Retardo_200micros:    2 + 1 + 1 + 2 + (2 + 3K) = 200 cm = 200 µs. (para K= 64 y 4 MHz).
; - Retardo_100micros:    2     + 1 + 2 + (2 + 3K) = 100 cm = 100 µs. (para K= 31 y 4 MHz).
; - Retardo_50micros :    2 + 1 + 1 + 2 + (2 + 3K) =  50 cm =  50 µs. (para K= 14 y 4 MHz).
; - Retardo_20micros :    2     + 1     + (2 + 3K) =  20 cm =  20 µs. (para K=  5 y 4 MHz).
;
; RETARDOS de 1 ms hasta 200 ms. --------------------------------------------------------
;
Retardo_200ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'200'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_100ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'100'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_50ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'50'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_20ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'20'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_10ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'10'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_5ms                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'5'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_2ms                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'2'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_1ms                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'1'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
;
; El próximo bloque "Retardos_ms" tarda:
; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =
; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina
; que a 4 MHz son 1002 µs = 1 ms.
;
Retardos_ms
    movwf    R_ContB                ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
    movlw    d'249'                ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
    movwf    R_ContA                ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
    nop                            ; Aporta KxMx1 ciclos máquina.
    decfsz    R_ContA,F            ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
    goto    R1ms_BucleInterno    ; Aporta (K-1)xMx2 ciclos máquina.
    decfsz    R_ContB,F            ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
    goto    R1ms_BucleExterno     ; Aporta (M-1)x2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_200ms:    2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).
; - Retardo_100ms:    2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).
; - Retardo_50ms :    2 + 1 + 2 + (2 + 4M + 4KM) =  50007 cm =  50 ms. (M= 50 y K=249).
; - Retardo_20ms :    2 + 1 + 2 + (2 + 4M + 4KM) =  20007 cm =  20 ms. (M= 20 y K=249).
; - Retardo_10ms :    2 + 1 + 2 + (2 + 4M + 4KM) =  10007 cm =  10 ms. (M= 10 y K=249).
; - Retardo_5ms  :    2 + 1 + 2 + (2 + 4M + 4KM) =   5007 cm =   5 ms. (M=  5 y K=249).
; - Retardo_2ms  :    2 + 1 + 2 + (2 + 4M + 4KM) =   2007 cm =   2 ms. (M=  2 y K=249).
; - Retardo_1ms  :    2 + 1     + (2 + 4M + 4KM) =   1005 cm =   1 ms. (M=  1 y K=249).
;
; RETARDOS de 0.5 hasta 20 segundos ---------------------------------------------------
;
Retardo_20s                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'200'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
    goto    Retardo_1Decima        ; Aporta 2 ciclos máquina.
Retardo_10s                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'100'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
    goto    Retardo_1Decima        ; Aporta 2 ciclos máquina.
Retardo_5s                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'50'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
    goto    Retardo_1Decima        ; Aporta 2 ciclos máquina.
Retardo_2s                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'20'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
    goto    Retardo_1Decima        ; Aporta 2 ciclos máquina.
Retardo_1s                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'10'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
    goto    Retardo_1Decima        ; Aporta 2 ciclos máquina.
Retardo_500ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'5'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
;
; El próximo bloque "Retardo_1Decima" tarda:
; 1 + N + N + MxN + MxN + KxMxN + (K-1)xMxN + MxNx2 + (K-1)xMxNx2 +
;   + (M-1)xN + Nx2 + (M-1)xNx2 + (N-1) + 2 + (N-1)x2 + 2 =
; = (2 + 4M + 4MN + 4KM) ciclos máquina. Para K=249, M=100 y N=1 supone 100011
; ciclos máquina que a 4 MHz son 100011 µs = 100 ms = 0,1 s = 1 décima de segundo.
;
Retardo_1Decima
    movwf    R_ContC                ; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
    movlw    d'100'                ; Aporta Nx1 ciclos máquina. Este es el valor de "M".
    movwf    R_ContB                ; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
    movlw    d'249'                ; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
    movwf    R_ContA                ; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno          
    nop                            ; Aporta KxMxNx1 ciclos máquina.
    decfsz    R_ContA,F            ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
    goto    R1Decima_BucleInterno    ; Aporta (K-1)xMxNx2 ciclos máquina.
    decfsz    R_ContB,F            ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
    goto    R1Decima_BucleExterno    ; Aporta (M-1)xNx2 ciclos máquina.
    decfsz    R_ContC,F            ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
    goto    R1Decima_BucleExterno2    ; Aporta (N-1)x2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_20s:    2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 cm = 20 s.
;            (N=200, M=100 y K=249).
; - Retardo_10s:    2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 cm = 10 s.
;            (N=100, M=100 y K=249).
; - Retardo_5s:        2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  5000207 cm =  5 s.
;            (N= 50, M=100 y K=249).
; - Retardo_2s:        2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  2000087 cm =  2 s.
;            (N= 20, M=100 y K=249).
; - Retardo_1s:        2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  1000047 cm =  1 s.
;            (N= 10, M=100 y K=249).
; - Retardo_500ms:    2 + 1     + (2 + 4N + 4MN + 4KMN) =   500025 cm = 0,5 s.
;            (N=  5, M=100 y K=249).

;    ===================================================================
;      Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;      E. Palacios, F. Remiro y L. López.        www.pic16f84a.com
;       Editorial Ra-Ma.  www.ra-ma.es
;    ===================================================================
Finalmente, lo que me dice MPLAB al compilar:
----------------------------------------------------------------------
Debug build of project `C:\Users\Lucas\Documents\Circuitos\Programas MPLAB\LED parpadeandoo.mcp' started.
Language tool versions: MPASMWIN.exe v5.33, mplink.exe v4.33
Preprocessor symbol `__DEBUG' is defined.
Sat Nov 17 15:18:49 2012
----------------------------------------------------------------------
Make: The target "C:\Users\Lucas\Documents\Circuitos\Programas MPLAB\led parpadeando.o" is up to date.
Make: The target "C:\Users\Lucas\Documents\Circuitos\Programas MPLAB\LED parpadeandoo.cof" is out of date.
Executing: "C:\Program Files (x86)\Microchip\MPASM Suite\mplink.exe" /p12F675 "led parpadeando.o" /u_DEBUG /z__MPLAB_BUILD=1 /z__MPLAB_DEBUG=1 /o"LED parpadeandoo.cof" /M"LED parpadeandoo.map" /W
MPLINK 4.33, Linker
Copyright (c) 2009 Microchip Technology Inc.
Error - section '.org_1' can not fit the absolute section. Section '.org_1' start=0x00000000, length=0x00000078
Errors : 1

Link step failed.
----------------------------------------------------------------------
Debug build of project `C:\Users\Lucas\Documents\Circuitos\Programas MPLAB\LED parpadeandoo.mcp' failed.
Language tool versions: MPASMWIN.exe v5.33, mplink.exe v4.33
Preprocessor symbol `__DEBUG' is defined.
Sat Nov 17 15:18:51 2012
----------------------------------------------------------------------
BUILD FAILED
18/11/2012 #2
Moderador

Avatar de D@rkbytes

freddi16 dijo: Ver Mensaje
Si alguien se da cuenta donde esta el error que por favor me avise, si?
Saludos.
El problema que encuentro es que haces la referencia al archivo RETARDOS.INC al principio del programa.
Código:
    list         p=12f675
    #include     P12F675.INC
    #include    RETARDOS.INC
La referencia a tal archivo, la debes hacer al final del programa. Antes del END
Por ejemplo aquí:
Código:
PDelL1          goto      PDelL2         ; 2 ciclos delay
PDelL2          clrwdt              ; 1 ciclo delay
                return              ; 2+2 Fin.
                include    <RETARDOS.INC>
                END
Con respecto al código del archivo RETARDOS.INC que pusiste...
Tiene declaradas las variables RContA, RContB y RContC
Pero dentro del código, son llamadas como R_ContA, R_ContB y R_ContC

Corrige esos detalles y nos comentas.

Suerte.
18/11/2012 #3


Hola, gracias por responder..
Corregí lo de los contadores en el archivo RETARDOS.inc, no se como no me di cuenta de eso antes :P
También agregué al final del archivo principal el include RETARDOS.inc, pero me sigue dando error... probe escribirlo de todas las formas posibles y sigue dando error, probe escribiendolo asi:
include RETARDOS.inc
include <RETARDOS.inc>
#include <RETARDOS.inc>
#include RETARDOS.inc
include RETARDOS.INC

De ninguna de las formas anteriores anduvo.. y la verdad no se que puede ser..
igual me baje un programa llamado PicLoops v2.2 que me funciona en windows 7 64bits, asi que ya esta no hay problema con este archivo de retardos, de ultima pongo en cada programa los retardos con este programita que me baje..
18/11/2012 #4
Moderador

Avatar de D@rkbytes

freddi16 dijo: Ver Mensaje
Hola, gracias por responder..
Corregí lo de los contadores en el archivo RETARDOS.inc, no se como no me di cuenta de eso antes :P
También agregué al final del archivo principal el include RETARDOS.inc, pero me sigue dando error... probe escribirlo de todas las formas posibles y sigue dando error, probe escribiendolo asi:
include RETARDOS.inc
include <RETARDOS.inc>
#include <RETARDOS.inc>
#include RETARDOS.inc
include RETARDOS.INC

De ninguna de las formas anteriores anduvo.. y la verdad no se que puede ser..
igual me baje un programa llamado PicLoops v2.2 que me funciona en windows 7 64bits, asi que ya esta no hay problema con este archivo de retardos, de ultima pongo en cada programa los retardos con este programita que me baje..
OK.
Pues es muy extraño que no lo puedas compilar ya que haciéndolo como te mencione yo no tuve problemas.
El programa que usaste PIC DELAYER (PDEL) es bueno y genera retardos muy precisos.

Si necesitas retardos de diferentes tiempos, la librería RETARDOS.INC funciona bien y te ahorras generarlos.

Adjunto el programa compilado que pusiste, usando ambas llamadas una tras otra.

Suerte.
Archivos Adjuntos
Tipo de Archivo: rar LED parpadeando.rar (24,6 KB (Kilobytes), 49 visitas)
18/11/2012 #5


Recien abri el .rar que adjuntaste y me di cuenta que quizas había que meter el archivo RETARDOS.inc junto al .asm del programa (yo tenía a RETARDOS.inc en donde MPLAB guarda todos los archivos .inc)...
Probé agregar RETARDOS.inc junto al .asm del programa principal y al llamarlo en mi programa escribí "call <RETARDOS.inc>" y funcionó sin ocasionar problemas

Te agradezco mucho por tu paciencia y por tu tiempo
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.