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

Temas similares

16/11/2008 #1

Avatar de Meta

Por primera vez estoy programando el 12F629, help.
Hola:

Estoy intentado hacer con un PIC 12F629 que me vino en el "USB PIC Programmer" que compré y lo quiero aprovechar. En ensamblador quiero aprender a configurar los puertos de entrada y salida más el oscilador interno a 4 MHZ. Por ahora estoy siguiendo el ejemplo aquí. Si hay más Web bien explicada me lo dicen.

La prueba que estoy haciendo solamente es que parpadee un led durante un segundo en cada ciclo. 1 segundo apagado y otro encendido mediante retardo cuyo ejemplo puedes ver en la subrutina. En la pata 5 del 12F629 o la salida GP2 tengo conectado una resistencia de 220 Ohmios y un Led a masa.

Código:
; ZONA DE DATOS *********************************************************************

	LIST		P=12F629			; Procesador utilizado.
	INCLUDE		<P12F629.INC>		; Definición de algunos operandos utilizados.
	__CONFIG	_MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON
	CBLOCK		0x20
	ENDC

	#DEFINE		LED		GPIO,2		; Salida del Led
	#DEFINE		INT		GPIO,3		; Entrada del interruptor.

; ZONA DE CÓDIGOS *******************************************************************

	ORG		0
Inicio
	bsf		STATUS,RP0			; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
	ORG		0x3FF				; 0x03FF
	retlw	0x20				; Valor de calibración.
	movwf	OSCCAL
	movfw	b'00001000'			; Activar GP3 como entrada.
	movwf	TRISIO
	bcf		STATUS,RP0			; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.

Principal
	call	Reatrdo

; SUBRUTINA *************************************************************************

; Delay = 1 seconds
; Clock frequency = 4 MHz

; Actual delay = 1 seconds = 1000000 cycles
; Error = 0 %

	cblock
	d0
	d1
	d2
	endc

Reatrdo
			;999990 cycles
	movlw	0x07
	movwf	d0
	movlw	0x2F
	movwf	d1
	movlw	0x03
	movwf	d2
Reatrdo_0
	decfsz	d0, f
	goto	$+2
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	Reatrdo_0

			;6 cycles
	goto	$+1
	goto	$+1
	goto	$+1

			;4 cycles (including call)
	return

	END
Por ahora este es el error.
----------------------------------------------------------------------
Debug build of project `C:\PIC16F84\12F629_01.disposable_mcp' started.
Preprocessor symbol `__DEBUG' is defined.
Sun Nov 16 18:52:11 2008
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPASMWIN.exe" /q /p12F629 "12F629_01.asm" /l"12F629_01.lst" /e"12F629_01.err" /d__DEBUG=1
Message[313] C:\PIC16F84\12F629_01.ASM 6 : CBLOCK constants will start with a value of 0.
Message[302] C:\PIC16F84\12F629_01.ASM 19 : Register in operand not in bank 0. Ensure that bank bits are correct.
Warning[220] C:\PIC16F84\12F629_01.ASM 19 : Address exceeds maximum range for this processor.
Warning[219] C:\PIC16F84\12F629_01.ASM 20 : Invalid RAM location specified.
Warning[220] C:\PIC16F84\12F629_01.ASM 20 : Address exceeds maximum range for this processor.
Message[302] C:\PIC16F84\12F629_01.ASM 21 : Register in operand not in bank 0. Ensure that bank bits are correct.
Warning[220] C:\PIC16F84\12F629_01.ASM 21 : Address exceeds maximum range for this processor.
Warning[220] C:\PIC16F84\12F629_01.ASM 22 : Address exceeds maximum range for this processor.
Error[126] C:\PIC16F84\12F629_01.ASM 25 : Argument out of range (0405 not between 0000 and 03FF)
Warning[220] C:\PIC16F84\12F629_01.ASM 25 : Address exceeds maximum range for this processor.
Warning[220] C:\PIC16F84\12F629_01.ASM 43 : Address exceeds maximum range for this processor.
Warning[220] C:\PIC16F84\12F629_01.ASM 44 : Address exceeds maximum range for this processor.
Warning[220] C:\PIC16F84\12F629_01.ASM 45 : Address exceeds maximum range for this processor.
Warning[220] C:\PIC16F84\12F629_01.ASM 46 : Address exceeds maximum range for this processor.
Warning[220] C:\PIC16F84\12F629_01.ASM 47 : Address exceeds maximum range for this processor.
Warning[220] C:\PIC16F84\12F629_01.ASM 48 : Address exceeds maximum range for this processor.
Warning[220] C:\PIC16F84\12F629_01.ASM 50 : Address exceeds maximum range for this processor.
Error[126] C:\PIC16F84\12F629_01.ASM 51 : Argument out of range (040E not between 0000 and 03FF)
Warning[220] C:\PIC16F84\12F629_01.ASM 51 : Address exceeds maximum range for this processor.
Warning[220] C:\PIC16F84\12F629_01.ASM 52 : Address exceeds maximum range for this processor.
Error[126] C:\PIC16F84\12F629_01.ASM 53 : Argument out of range (0410 not between 0000 and 03FF)
Warning[220] C:\PIC16F84\12F629_01.ASM 53 : Address exceeds maximum range for this processor.
Warning[220] C:\PIC16F84\12F629_01.ASM 54 : Address exceeds maximum range for this processor.
Error[126] C:\PIC16F84\12F629_01.ASM 55 : Argument out of range (040B not between 0000 and 03FF)
Warning[220] C:\PIC16F84\12F629_01.ASM 55 : Address exceeds maximum range for this processor.
Error[126] C:\PIC16F84\12F629_01.ASM 58 : Argument out of range (0412 not between 0000 and 03FF)
Warning[220] C:\PIC16F84\12F629_01.ASM 58 : Address exceeds maximum range for this processor.
Error[126] C:\PIC16F84\12F629_01.ASM 59 : Argument out of range (0413 not between 0000 and 03FF)
Warning[220] C:\PIC16F84\12F629_01.ASM 59 : Address exceeds maximum range for this processor.
Error[126] C:\PIC16F84\12F629_01.ASM 60 : Argument out of range (0414 not between 0000 and 03FF)
Warning[220] C:\PIC16F84\12F629_01.ASM 60 : Address exceeds maximum range for this processor.
Warning[220] C:\PIC16F84\12F629_01.ASM 63 : Address exceeds maximum range for this processor.
Halting build on first failure as requested.
----------------------------------------------------------------------
Debug build of project `C:\PIC16F84\12F629_01.disposable_mcp' failed.
Preprocessor symbol `__DEBUG' is defined.
Sun Nov 16 18:52:12 2008
----------------------------------------------------------------------
BUILD FAILED
Otra cosa. La mejor configuración que he visto para el 16F84A es este que lo uso como plantilla, lo mismo quiero aprender hacerlo con el 12F629.

Código:
	bsf		STATUS,RP0			; Acceso al Banco 1.
	clrf	TRISB				; Las líneas del Puerto B se configuran como salida.
	movlw	b'00011111'			; Las 5 líneas del Puerto A se configuran como entrada.
	movwf	TRISA
	bcf		STATUS,RP0			; Acceso al Banco 0.
Un cordial saludo.
16/11/2008 #2


Meta, todos esos errores te los da porque justo después del inicio tienes un "ORG 0x3FF" que hace que todo el código que aparece después de esa línea se escriba después de la dirección 0x3FF, cosa que no es posible.
Código:
Inicio 
   bsf      STATUS,RP0         ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1. 
   ORG      0x3FF          ; 0x03FF
   retlw   0x20            ; Valor de calibración.
Otra cosa es que ese retlw que aparece ahí hace que el programa se resetee justo en esa línea, en vez de retlw deberías tener un movlw.

El código compila bien si lo escribes de esta manera:
Código:
; ZONA DE DATOS ********************************************************************* 

   LIST      P=12F629         ; Procesador utilizado. 
   INCLUDE      <P12F629.INC>      ; Definición de algunos operandos utilizados. 
   __CONFIG   _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON 
   CBLOCK      0x20 
   ENDC 

   #DEFINE      LED      GPIO,2      ; Salida del Led 
   #DEFINE      INT      GPIO,3      ; Entrada del interruptor. 

; ZONA DE CÓDIGOS ******************************************************************* 

   ORG      0 
Inicio 
   bsf      STATUS,RP0         ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1. 
   movlw   0x20            ; Valor de calibración. 
   movwf   OSCCAL 
   movfw   b'00001000'         ; Activar GP3 como entrada. 
   movwf   TRISIO 
   bcf      STATUS,RP0         ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0. 

Principal 
   call   Reatrdo 

; SUBRUTINA ************************************************************************* 

; Delay = 1 seconds 
; Clock frequency = 4 MHz 

; Actual delay = 1 seconds = 1000000 cycles 
; Error = 0 % 

   cblock 
   d0 
   d1 
   d2 
   endc 

Reatrdo 
         ;999990 cycles 
   movlw   0x07 
   movwf   d0 
   movlw   0x2F 
   movwf   d1 
   movlw   0x03 
   movwf   d2 
Reatrdo_0 
   decfsz   d0, f 
   goto   $+2 
   decfsz   d1, f 
   goto   $+2 
   decfsz   d2, f 
   goto   Reatrdo_0 

         ;6 cycles 
   goto   $+1 
   goto   $+1 
   goto   $+1 

         ;4 cycles (including call) 
   return 

   END
16/11/2008 #3

Avatar de Meta

Hola:

A parte del funcionamiento, muchas gracias por la explicación. Supuestamente me debería costar menos coger el tuco al 12F629 que el 16F84A, pero bueno.

Ahora voy a ver si puedo quitar esos Warning pesados aunque sea la mayoría.

----------------------------------------------------------------------
Debug build of project `C:\PIC16F84\12F629_01.disposable_mcp' started.
Preprocessor symbol `__DEBUG' is defined.
Sun Nov 16 19:50:27 2008
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPASMWIN.exe" /q /p12F629 "12F629_01.asm" /l"12F629_01.lst" /e"12F629_01.err" /d__DEBUG=1
Warning[207] C:\PIC16F84\12F629_01.ASM 15 : Found label after column 1. (Inicio)
Message[302] C:\PIC16F84\12F629_01.ASM 18 : Register in operand not in bank 0. Ensure that bank bits are correct.
Warning[219] C:\PIC16F84\12F629_01.ASM 19 : Invalid RAM location specified.
Message[302] C:\PIC16F84\12F629_01.ASM 20 : Register in operand not in bank 0. Ensure that bank bits are correct.
Warning[207] C:\PIC16F84\12F629_01.ASM 23 : Found label after column 1. (Principal)
Warning[207] C:\PIC16F84\12F629_01.ASM 40 : Found label after column 1. (Reatrdo)
Warning[207] C:\PIC16F84\12F629_01.ASM 48 : Found label after column 1. (Reatrdo_0)
Loaded C:\PIC16F84\12F629_01.cod.
----------------------------------------------------------------------
Debug build of project `C:\PIC16F84\12F629_01.disposable_mcp' succeeded.
Preprocessor symbol `__DEBUG' is defined.
Sun Nov 16 19:50:30 2008
----------------------------------------------------------------------
BUILD SUCCEEDED
Saludo y gracias de nuevo.
16/11/2008 #4


Sabía que algo se me había pasado, también tienes por ahí un movfw que no sirve para nada, debería ser un movlw:
Código:
Inicio 
   bsf      STATUS,RP0         ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1. 
   movlw   0x20            ; Valor de calibración. 
   movwf   OSCCAL 
   movfw   b'00001000'         ; <--- Esto debería ser movlw   b'00001000'
   movwf   TRISIO 
   bcf      STATUS,RP0         ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
Debe ser movlw ya que quieres cargar un valor en W para después con movwf mover ese valor al registro TRISIO para configurar el puerto del pic.

Con ese cambio en el código de nuevo compila sin problemas y además no da ningún warning:
Make: The target "C:\12f629\blink.o" is out of date.
Executing: "C:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p12F629 "blink.asm" /l"blink.lst" /e"blink.err"
Message[302] C:\12F629\BLINK.ASM 18 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\12F629\BLINK.ASM 20 : Register in operand not in bank 0. Ensure that bank bits are correct.
Loaded C:\12f629\blink.COD.
BUILD SUCCEEDED: Sun Nov 16 12:54:37 2008
16/11/2008 #5

Avatar de Meta

Hola:

Pues a mi me sale 4 Warning tontos.

----------------------------------------------------------------------
Debug build of project `C:\PIC16F84\12F629_01.disposable_mcp' started.
Preprocessor symbol `__DEBUG' is defined.
Sun Nov 16 20:06:01 2008
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPASMWIN.exe" /q /p12F629 "12F629_01.asm" /l"12F629_01.lst" /e"12F629_01.err" /d__DEBUG=1
Warning[207] C:\PIC16F84\12F629_01.ASM 15 : Found label after column 1. (Inicio)
Message[302] C:\PIC16F84\12F629_01.ASM 18 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\PIC16F84\12F629_01.ASM 20 : Register in operand not in bank 0. Ensure that bank bits are correct.
Warning[207] C:\PIC16F84\12F629_01.ASM 23 : Found label after column 1. (Principal)
Warning[207] C:\PIC16F84\12F629_01.ASM 40 : Found label after column 1. (Reatrdo)
Warning[207] C:\PIC16F84\12F629_01.ASM 48 : Found label after column 1. (Reatrdo_0)
Loaded C:\PIC16F84\12F629_01.cod.
----------------------------------------------------------------------
Debug build of project `C:\PIC16F84\12F629_01.disposable_mcp' succeeded.
Preprocessor symbol `__DEBUG' is defined.
Sun Nov 16 20:06:03 2008
----------------------------------------------------------------------
BUILD SUCCEEDED
Otra cosa, fíjate la imagen de abajo, me tiene trabado lo de la calibración 3458 en la dirección 3FFFF.

Saludos.
Imágenes Adjuntas
Tipo de Archivo: jpg osccal_265.jpg (28,3 KB (Kilobytes), 323 visitas)
Tipo de Archivo: jpg osccal2_169.jpg (49,0 KB (Kilobytes), 320 visitas)
16/11/2008 #6


Nunca he usado este pic y para ayudarte estoy consultando el datasheet. Ahí dice que el valor de calibración debe escribirse en la última localidad de memoria del pic, esto es en 0x3FF y que se debe usar la instrucción retlw para esto, quizá por eso tenías un retlw ahí. Entonces para que no tengas problema con la calibración podrías escribir el código de esta manera:
Código:
; ZONA DE DATOS ********************************************************************* 

	LIST	P=12F629		; Procesador utilizado. 
	INCLUDE	<P12F629.INC>	; Definición de algunos operandos utilizados. 
	__CONFIG	_MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON 

   #DEFINE      LED      GPIO,2      ; Salida del Led 
   #DEFINE      INT      GPIO,3      ; Entrada del interruptor. 

; ZONA DE CÓDIGOS ******************************************************************* 

; Instrucción de calibración
	ORG		0x3FF
	retlw	0x20
;****************************

; Programa principal
	ORG		0x00
Inicio 
	bsf		STATUS,RP0         ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1. 
	call	0x3FF            ; Valor de calibración. 
	movwf	OSCCAL 
	movlw	b'00001000'         ; Activar GP3 como entrada. 
	movwf	TRISIO 
	bcf		STATUS,RP0         ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0. 

Principal 
	call	Reatrdo 

; SUBRUTINA ************************************************************************* 

; Delay = 1 seconds 
; Clock frequency = 4 MHz 

; Actual delay = 1 seconds = 1000000 cycles 
; Error = 0 % 

   cblock 
   d0 
   d1 
   d2 
   endc 

Reatrdo 
         ;999990 cycles 
   movlw   0x07 
   movwf   d0 
   movlw   0x2F 
   movwf   d1 
   movlw   0x03 
   movwf   d2 
Reatrdo_0 
   decfsz   d0, f 
   goto   $+2 
   decfsz   d1, f 
   goto   $+2 
   decfsz   d2, f 
   goto   Reatrdo_0 

         ;6 cycles 
   goto   $+1 
   goto   $+1 
   goto   $+1 

         ;4 cycles (including call) 
   return 

   END
Trataré de conseguir un 12f629 para poder hacer pruebas en vivo con este pic.
16/11/2008 #7

Avatar de pepechip

te aconsejo que hasta que no le pilles manejo lo primero que hagas sea leer el pic y anotar el valor de la posicion 3FF. Ten encuenta que cuando termines de grabarlo tiene que seguir manteniendo ese mismo valor.
Si mantiene el mismo valor el oscilador ira a 4Mhz +-1%, pero si cambias el valor el oscilador oscilara DIOS sabe donde.
16/11/2008 #8

Avatar de Meta

Menudo PIC más complicado de entender la primera vez.
¿Qué método aconsejaría el más adecuado sobre el oscilador?
Compilar compila bien, pero el Led en la protboar no parpadea ni loco, ni se enciende.

Código:
    ; ZONA DE DATOS *********************************************************************

       LIST      P=12F629         ; Procesador utilizado.
       INCLUDE      <P12F629.INC>      ; Definición de algunos operandos utilizados.
       __CONFIG   _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON
       CBLOCK      0x20
       ENDC

       #DEFINE      LED      GPIO,2      ; Salida del Led
       #DEFINE      INT      GPIO,3      ; Entrada del interruptor.

    ; ZONA DE CÓDIGOS *******************************************************************

       ORG      0
    Inicio
       bsf      STATUS,RP0         ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
       movlw   0x20            ; Valor de calibración.
       movwf   OSCCAL
       movlw   b'00001000'         ; Activar GP3 como entrada.
       movwf   TRISIO
       bcf      STATUS,RP0         ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.

    Principal
       call   Reatrdo

    ; SUBRUTINA *************************************************************************

    ; Delay = 1 seconds
    ; Clock frequency = 4 MHz

    ; Actual delay = 1 seconds = 1000000 cycles
    ; Error = 0 %

       cblock
       d0
       d1
       d2
       endc

    Reatrdo
             ;999990 cycles
       movlw   0x07
       movwf   d0
       movlw   0x2F
       movwf   d1
       movlw   0x03
       movwf   d2
    Reatrdo_0
       decfsz   d0, f
       goto   $+2
       decfsz   d1, f
       goto   $+2
       decfsz   d2, f
       goto   Reatrdo_0

             ;6 cycles
       goto   $+1
       goto   $+1
       goto   $+1

             ;4 cycles (including call)
       return

       END
PD: Cuando acabe con esto y entienda todo, haré el manual.
16/11/2008 #9


Meta, no enciende ni parpadea ni nada porque el programa que escribiste no hace nada de eso, lo único que haces es llamar la rutina de retardo pero cuando esta termina vuelve de nuevo a hacerse el retardo y al final termina en ese END.

No te había hecho esa observación antes porque pense que solo querías saber por que ocurrían los errores en la compilación.
16/11/2008 #10

Avatar de Meta

Por fin no me sale los Warning.

----------------------------------------------------------------------
Debug build of project `C:\PIC16F84\12F629_01.disposable_mcp' started.
Preprocessor symbol `__DEBUG' is defined.
Sun Nov 16 21:00:45 2008
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPASMWIN.exe" /q /p12F629 "12F629_01.asm" /l"12F629_01.lst" /e"12F629_01.err" /d__DEBUG=1
Message[302] C:\PIC16F84\12F629_01.ASM 18 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\PIC16F84\12F629_01.ASM 20 : Register in operand not in bank 0. Ensure that bank bits are correct.
Loaded C:\PIC16F84\12F629_01.cod.
----------------------------------------------------------------------
Debug build of project `C:\PIC16F84\12F629_01.disposable_mcp' succeeded.
Preprocessor symbol `__DEBUG' is defined.
Sun Nov 16 21:00:46 2008
----------------------------------------------------------------------
BUILD SUCCEEDED
Nuevo código, me despisté en hacerlo
Ahora si me parpadea. Menudo rollo este PIC y eso que cada vez veo a mucha gente más usarlo que el propio 12F509 de la época.
Código:
    ; ZONA DE DATOS *********************************************************************

       LIST      P=12F629         ; Procesador utilizado.
       INCLUDE      <P12F629.INC>      ; Definición de algunos operandos utilizados.
       __CONFIG   _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON
       CBLOCK      0x20
       ENDC

       #DEFINE      LED      GPIO,2      ; Salida del Led
       #DEFINE      INT      GPIO,3      ; Entrada del interruptor.

    ; ZONA DE CÓDIGOS *******************************************************************

       ORG      0
Inicio
	bsf      STATUS,RP0         ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
	movlw   0x20            ; Valor de calibración.
	movwf   OSCCAL
	movlw   b'00001000'         ; Activar GP3 como entrada.
	movwf   TRISIO
	bcf      STATUS,RP0         ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.

Principal
	bsf		LED
	call	Reatrdo
	bcf		LED
	call	Reatrdo
 goto	Principal
    ; SUBRUTINA *************************************************************************

    ; Delay = 1 seconds
    ; Clock frequency = 4 MHz

    ; Actual delay = 1 seconds = 1000000 cycles
    ; Error = 0 %

       cblock
       d0
       d1
       d2
       endc

Reatrdo
             ;999990 cycles
       movlw   0x07
       movwf   d0
       movlw   0x2F
       movwf   d1
       movlw   0x03
       movwf   d2
Reatrdo_0
       decfsz   d0, f
       goto   $+2
       decfsz   d1, f
       goto   $+2
       decfsz   d2, f
       goto   Reatrdo_0

             ;6 cycles
       goto   $+1
       goto   $+1
       goto   $+1

             ;4 cycles (including call)
       return

       END
Por cierto. ¿Es más complicado hacer lo mismo con el TIMER? Lo digo porque quizás se utilice menos instrucciones.

Saludo y gracias a todos/as.
16/11/2008 #11


-Edito-
No había visto bien tu código, de esa manera si debe funcionar bien.

Otra forma de hacerlo sería usando un xor, a mi personalmente me gusta más usarlo para encender o apagar leds. Algo así.
Código:
Principal
    movlw    b'00000100'
    xorwf    GPIO,f
    call     Reatrdo
    goto    Principal
16/11/2008 #12

Avatar de Meta

Vaya, veo que has optimizado más que yo con una instrucción menos. Estas cosas de optimizar me gusta.

Voy a probar tu código.

EDITO 1:
Lo he probado y funciona de maravilla. Aunque el mio lo entiendo muy bien, el tuyo me gusta más y no usa dos veces el call.

Código:
    ; ZONA DE DATOS *********************************************************************

       LIST      P=12F629         ; Procesador utilizado.
       INCLUDE      <P12F629.INC>      ; Definición de algunos operandos utilizados.
       __CONFIG   _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON
       CBLOCK      0x20
       ENDC

       #DEFINE      LED      GPIO,2      ; Salida del Led
       #DEFINE      INT      GPIO,3      ; Entrada del interruptor.

    ; ZONA DE CÓDIGOS *******************************************************************

       ORG      0
Inicio
	bsf      STATUS,RP0         ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
	movlw   0x20            ; Valor de calibración.
	movwf   OSCCAL
	movlw   b'00001000'         ; Activar GP3 como entrada.
	movwf   TRISIO
	bcf      STATUS,RP0         ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.

Principal
;	bsf		LED
;	call	Reatrdo
;	bcf		LED
;	call	Reatrdo
;-----------------------
	movlw    b'00000100'
    xorwf    GPIO,f
    call     Reatrdo 
;-----------------------
	goto	Principal

    ; SUBRUTINA *************************************************************************

    ; Delay = 1 seconds
    ; Clock frequency = 4 MHz

    ; Actual delay = 1 seconds = 1000000 cycles
    ; Error = 0 %

       cblock
       d0
       d1
       d2
       endc

Reatrdo
             ;999990 cycles
       movlw   0x07
       movwf   d0
       movlw   0x2F
       movwf   d1
       movlw   0x03
       movwf   d2
Reatrdo_0
       decfsz   d0, f
       goto   $+2
       decfsz   d1, f
       goto   $+2
       decfsz   d2, f
       goto   Reatrdo_0

             ;6 cycles
       goto   $+1
       goto   $+1
       goto   $+1

             ;4 cycles (including call)
       return

       END
EDITO 2:
He probado sin la f a ver que pasa y funciona muy bien. ¿Realmente hacía falta ponerlo?

Código:
Principal
;	bsf		LED
;	call	Reatrdo
;	bcf		LED
;	call	Reatrdo
;-----------------------
	movlw    b'00000100'
    xorwf    GPIO		; <-- Quité la f para saber que pasa. (Por curiosidad)--|
    call     Reatrdo 
;-----------------------
	goto	Principal
EDITO 3:
Uso una resistencia para el led de 220 ohmios. ¿Se puede utilizar el pull ups resistencias internas para el LED o no es recomendable?
16/11/2008 #13


Sobre la f, es posible no ponerlo y funcionará bien ya que si omites el destino MPLAB toma el destino predeterminado que es 1, es decir f. Funciona bien solo si el destino deseado es f, si quieres que el destino sea w y no pones ni w ni 0 entonces MPLAB tomará el destino predeterminado y el programa no funcionará como se espera.

Sobre las pull-ups, no sabría decirte, el datasheet dice:
Each weak pull-up is automatically turned off when the port pin is configured as an output
Es decir que cada pull-up automáticamente se deshabilita cuando un pin del puerto se configura como salida. Aún cuando se pudiera usar el pull-up cuando el pin esta configurado como salida creo que de ponerle la resistencia no te salvas.
16/11/2008 #14

Avatar de Meta

Gracias por las respuestas.
Probando el código, hice en el MPLAB 8.10 que si pongo GPIO,3 (INT) a 1, se activa el parpadeo, si pongo a 0 se queda apagado. En vez de hacerlo en modo interruptor. ¿Se puede hacer en modo pulsador? ¿Cómo se hace?
Código:
    ; ZONA DE DATOS *********************************************************************

       LIST      P=12F629         ; Procesador utilizado.
       INCLUDE      <P12F629.INC>      ; Definición de algunos operandos utilizados.
       __CONFIG   _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON
       CBLOCK      0x20
       ENDC

       #DEFINE      LED      GPIO,2      ; Salida del Led
       #DEFINE      INT      GPIO,3      ; Entrada del interruptor.

    ; ZONA DE CÓDIGOS *******************************************************************

       ORG      0
Inicio
	bsf      STATUS,RP0         ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
	movlw   0x20            ; Valor de calibración.
	movwf   OSCCAL
	movlw   b'00001000'         ; Activar GP3 como entrada.
	movwf   TRISIO
	bcf      STATUS,RP0         ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.

Principal
;	bcf		LED
;	call	Retardo
;	bsf		LED
;	call	Retardo
;-----------------------
	movlw    b'00000100'
   xorwf    GPIO,f
    call     Retardo 
;-----------------------
bt
	btfss	INT
	goto	Apagado
	goto	Principal
Apagado
	bcf		LED
	goto	bt

    ; SUBRUTINA *************************************************************************

    ; Delay = 1 seconds
    ; Clock frequency = 4 MHz

    ; Actual delay = 1 seconds = 1000000 cycles
    ; Error = 0 %

       cblock
       d0
       d1
       d2
       endc

Retardo
             ;999990 cycles
       movlw   0x07
       movwf   d0
       movlw   0x2F
       movwf   d1
       movlw   0x03
       movwf   d2
Retardo_0
       decfsz   d0, f
       goto   $+2
       decfsz   d1, f
       goto   $+2
       decfsz   d2, f
       goto   Retardo_0

             ;6 cycles
       goto   $+1
       goto   $+1
       goto   $+1

             ;4 cycles (including call)
       return

       END
20/11/2008 #15

Avatar de pepechip

Mando a distancia por telefono movil y microcontrolador pic 12f629 sin descolgar
intento accionar un rele mediante el tono de melodia de un movil, para lo cual he configurado un tono de llamada de 1600Hz que solo suena cuando llamo yo, y a traves de la salida de auriculares del movil lo conecto a un lm567, el cual me acciona un rele. De esta forma evito las falsas actuaciones del rele cuando reciba una llamada de otra persona, ademas que este sistema de control no me genera ningun tipo de gasto en la llamada, ya que no se atiende la llamada.

Quisiera sustituir el lm567 por el pic 12f629, pero quiero utilizar el menor numero de componentes posibles y omitir el amplificador de audio, por lo que puedo utilizar el comparador analogico para detectar los niveles de tension que manda el movil por el conector de auriculares y verificar si el tono de llamada corresponde a los 1600Hz que tengo configurados cuando llamo yo. Incluso puedo configurar varios tonos de llamada para varios numeros de telefono que tengo, y segun el numero llamante realice una accion u otra.

Para ponerle al movil el tono de llamada de 1600Hz he cargado en el ordenador un programa llamado sig-gen, (Lo dejo como adjunto) el cual es un generador de funciones que utiliza la tarjeta de sonido, y mediante la grabadora de sonidos que incorpora window realizo una grabacion a la frecuencia deseada, por ultimo el archivo generado lo paso al movil via cable, infrarrojos o bluetooth.

podeis poner un ejemplo de como utilizar los comparadores que incorpora el 12f629
Archivos Adjuntos
Tipo de Archivo: rar 4_intrumentos_615.rar (193,6 KB (Kilobytes), 46 visitas)
22/11/2008 #16


Saludos Meta, espero poder ayudarte en lo que solicitas. Posteo un programa de ejemplo que tengo para encender y apagar un LED por medio de un switch. Es decir, como el control de ON/OFF de cualquier aparato.

Código:
LIST P=16F84A
			#INCLUDE<P16F84A.INC>
			
			ORG	        5

;*************************************************************
INICIO		BSF		STATUS,RP0	
			MOVLW	5
			MOVWF	TMR0
			CLRF  	PORTB
			BCF		STATUS,RP0
			CLRF 	PORTB
;*************************************************************			
CICLO		BTFSC	PORTA,0   ; Se checa si el Switch ha sido activado
			CALL	        ON_OFF   ;De se así llamamos a la rutina de control
			GOTO	CICLO
;*************************************************************
;Rutina para checar el estado previo del PIN y activar el nuevo			
ON_OFF		BTFSC	PORTB,0
			GOTO	$+3
			BSF		PORTB,0
			GOTO	RELEASE
			BCF		PORTB,0
			GOTO	RELEASE
;*************************************************************
;Rutina de retardo de espera a que el switch se suelte y evitar el rebote (debounce)		
RELEASE		CALL	DELAY_14ms
			BTFSC	PORTA,0
			GOTO	$-2
			RETURN
;*************************************************************
;Retardo de 14ms aproximados		
DELAY_14ms	CLRW
			MOVWF	TMR0
			BTFSS	INTCON,T0IF
			GOTO	$-1
			BCF		INTCON,T0IF
			RETURN				
;*************************************************************			
			END
La rutina de ON_OFF puedes utilizarla de forma similar como una bandera de Activación o desactivación de otra rutina.
Código:
ON_OFF		BTFSC	BANDERAS,ON_OFF
			GOTO	$+3
			BSF		BANDERAS,ON_OFF ;Activamos el Bit para indicar que se inicié el parpadeo
			GOTO	RELEASE
			BCF		BANDERAS,ON_OFF;Apagamos el bit para desactivar el parpadeo
			RETURN
Ya en tu programa principal checas el estado de este bit y decides que hacer
por si acaso:
#define ON_OFF 0 ; para definir que bit de los 8 estamos usando

Saludos
22/11/2008 #17


Pepechip, para lo que tu quieres necesitarías un módulo de captura, comparación y PWM o CCP. Esté PIC no posee ese módulo que te haría la vida más fácil.
Si quiere usar el 12F629 tendrías que usar el TIMER1 en modo síncrono y por medio de la interrupción saber que número de conteos logró en un segundo para conocer la frecuencia. Puedes hacerlo en menos tiempo, pero se vuelve un poco menos preciso.
Para ello tendrás que configurar el TIMER1 con T1SYNC = 0 y TIMR1CS = 1. Además deberás usar el TMR0 como tiempo de referencia para calcular la frecuencia de entrada por T1OSO.
El TIMER1 puede ser activado o desactivado por el bit TMR1ON.
Saludos
22/11/2008 #18

Avatar de pepechip

ericklarva estas equivocado, el 12f629 incorpora comparadores, los cuales vienen predefinidos siempre como tales y en caso de no querer utilizarlos hay que configurarlos.
22/11/2008 #19


MMM creo que no me dí a entender, me refería a que el 12F629 no incorpora el módulo CCP no me refería al de comparadores.
Saludos
29/05/2011 #20


Hola, estoy haciendo un proyecto con el pic 12f629, Necesito que al pulsar un botón, que cambia de forma aleatoria el color de 1 leds RGB que tengo conectado al micro. La entrada de pulsos es en la patilla dos del micro. Alguien tiene un código parecido? El problema es que normalmente programo para atmel, y me cuesta el pic, por ahora. El cambio de color del led debería ser mediante una tabla, o tengo que cargar valores en los registros de salida? Gracias.
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.