Autor Tema: necesito programar un 16f628 !!ayuda!! con lo siguiente:  (Leído 27346 veces)

0 Usuarios y 5 Visitantes están viendo este tema.

Desconectado Manofwar

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 156
Re: necesito programar un 16f628 !!ayuda!! con lo siguiente:
« Respuesta #15 en: 24 de Noviembre de 2006, 05:21:10 »
Hola Toc_toc:

Para desconectar los comparadores y que los pines sean sólo digitales, al inicio de tu programa debes poner lo siguiente:

   movlw    7
   movwf    CMCON ; CMCON=7 comparadores desconectados

Un saludo
Saludos desde Almería, España

Desconectado toc-toc

  • PIC12
  • **
  • Mensajes: 57
Re: necesito programar un 16f628 !!ayuda!! con lo siguiente:
« Respuesta #16 en: 24 de Noviembre de 2006, 07:52:24 »

 Gracias Manofwar, por responder.

 Entre mi consulta y tu respuesta, me dio por hacer una traduccion de las notas del f628 y
realmente me impresiona lo que obtuve, claro que uno ha de 'retocar' los pequeños
disparates que origina una traduccion tecnica, ya se sabe, finalmente pude hacerme una
idea de como se comporta este f628, creo haberlo entendido.

 De todos modos repito, GRACIAS por tu ayuda. Espero poder contribuir en alguna ocasion
en el foro.

 La verdad es que, hay que adaptar todo a los nuevos dispositivos para no perderse los
avances de la tecnologia.

 Voy a empezar el listado que comenté en la anterior nota.

 Saludos a todos.
Incluso la época de agobio es digna de respeto.
Porque, no la ha creado el hombre, sino la naturaleza que puede ser dura pero jamas absurda.

Desconectado toc-toc

  • PIC12
  • **
  • Mensajes: 57
Re: necesito programar un 16f628 !!ayuda!! con lo siguiente:
« Respuesta #17 en: 27 de Noviembre de 2006, 17:36:32 »

  Hola! Una nueva consulta. A ver si esto es correcto. Porque, al ensamblar
 no muestra errores. Sin embargo, no me muestra los cambios en los puertos A y B

;----------------------------------------------------------------------------
; fecha: 26-11-2006
; Esto solo es una prueba para empezar con el f628

   LIST   P=16F628          ; usar PIC 16F628A
   #include <p16f628.inc>
   __CONFIG   h'3F50'
   errorlevel      -302      ; Eliminar banco atencion

;---- Declarar equs

status      equ   h'0003'
option_reg   equ   h'0001'
trisa      equ   h'0005'   ;
trisb      equ   h'0006' ;
porta      equ   h'0005'   ; define puerto A
portb      equ   h'0006'   ; define puerto B

#define banco0   BCF,RP0   ;
#define banco1   BSF,RP1   ;

   ORG   0x00

   MOVLW   b'00000111'   ; comparadores desactivados,
   MOVWF   CMCON      ; I/O digitales.

   banco1         ; activa la pagina 1
   MOVLW 0x00      ;
   MOVWF 0x06      ; puerto a y b todos salidaS
   banco0         ; volvemos a la pagina 0

;   MOVLW   b'00000111'   ; comparadores desactivados,
;   MOVWF   CMCON      ; I/O digitales.

   CLRF   portb      ; ponemos a 0 portb

INI   BSF   portb,0      ; pone a 1 RB0
   MOVLW   0xF
   MOVWF   portb
   GOTO   INI
   end
   

 Donde está el error, he probado en diferentes puntos el poner
la declaración de los comparadores y ni flores.
 Llevo el finde sin aclararme.

 Gracias anticipadas.
Incluso la época de agobio es digna de respeto.
Porque, no la ha creado el hombre, sino la naturaleza que puede ser dura pero jamas absurda.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: necesito programar un 16f628 !!ayuda!! con lo siguiente:
« Respuesta #18 en: 27 de Noviembre de 2006, 19:29:25 »
Hola.

#define banco0   BCF,RP0   ;
#define banco1   BSF,RP1   ;

Acabas de inventar algo nuevo poniendo eso.No funcionará.

Lo correcto es declararlos como MACROS

Código: ASM
  1. banco0  macro
  2.         BCF             STATUS,RP0
  3.         endm
  4.  
  5. banco1  macro
  6.         BSF             STATUS,RP0
  7.         endm


Otro detalle: Si incluyes el archivo .inc del PIC que estás usando, una de las ventajas que trae esto es que precisamente no debes andar definiendo los registros especiales(SFR)

status      equ   h'0003'
option_reg   equ   h'0001'
trisa       equ   h'0005'
trisb       equ   h'0006'
porta      equ   h'0005'
portb      equ   h'0006'

El trisa es el h'0085' y el trisb es el h'0086'. Si bien te funcionará igual, puede que tengas problemas si alguna vez te equivocas de banco ya que el ensamblador no te advertirá que estas en el banco incorrecto.

Con el archivo include no necesitas andar declarando todo eso.
Simplemente pones:

por ejemplo:
 BCF         STATUS,C
 BSF         TRISB,2

sin necesidad de declararlos previamente.

Saludos.
« Última modificación: 27 de Noviembre de 2006, 19:31:39 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Kedutpic

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 219
    • Microelectronica
Re: necesito programar un 16f628 !!ayuda!! con lo siguiente:
« Respuesta #19 en: 27 de Noviembre de 2006, 20:14:32 »
  HOLA TOC-TOC
bueno yo tmb estoy comenzando programar te podria ayudar en lo siguiente

INI   BSF   portb,0      ; pone a 1 RB0   
       MOVLW   0xF 
       MOVWF   portb 
       GOTO   INI

bueno la verdad que no entiendo que has querido hacer alli , pero si solo quieres sacar un dato tendrias que hacer esta rutina

MOVLW  0x0F
MOVWF PORTB
GOTO $

si quieres que el dato cambie , para que puedas verlo , tienes que ademas  agregarle  una subrutina de delay

ejm:

         MOVLW 0XFF
         MOVWF PORTB
A1     CALL TIEMPO
         COMF PORTB,F
         GOTO A1

TIEMPO:
                              ;delay de 0.5 segundos
          MOVLW  .5
          MOVWF TEMP3
B3      MOVLW .100
          MOVWF TEMP2
B2      MOVLW .249
          MOVWF  TEMP1
B1      NOP
          DECFSZ TEMP1,F
          GOTO B1
          DECFSZ TEMP2,F
          GOTO B2
          DECFSZ TEMP3,F
          GOTO B3
          RETURN
          END
         
los registros temp1,temp2,temp3 tienes que definirlos al inicio de tu programa ok
ejm

TEMP1        EQU 0X20
TEMP2        EQU 0X21
TEMP3        EQU 0X22

Bueno  espero que con eso te salga.

 saludos

  si en algo me he he equivocado por favor corrijanme 

Actel  -  VHDL un nuevo mundo por descubrir :D
Grupo de Microelectronica - CIDI - UTP
Visitanos en : http://ue.accesus.com

Desconectado Manofwar

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 156
Re: necesito programar un 16f628 !!ayuda!! con lo siguiente:
« Respuesta #20 en: 28 de Noviembre de 2006, 05:38:33 »
Hola Toc-toc

Este es tu programa una vez compilado:



Si te fijas en la linea 3 y 6, estás cambiando el estado de los bits 6 y 5 del registro cero, por lo no estás cambiando de banco y además cambias bits diferentes.

En cuanto a los define, siento disentir contigo Bruno, en el MPLAB  se pueden utilizar definiciones como tú has hecho, pero las has declarado mal ya que no dices el registro y ante la ausencia de este, el MPLAB escoge el solo el registro cero, por lo que deberían ser así:

#define banco0 bsf  STATUS,RP0
#define banco1 bcf  STATUS,RP0

O como dice Bruno, declarar unas macros.

En cuanto al resto del código, totalmente de acuerdo con lo dicho por los compañeros.
Saludos desde Almería, España

Desconectado toc-toc

  • PIC12
  • **
  • Mensajes: 57
Re: necesito programar un 16f628 !!ayuda!! con lo siguiente:
« Respuesta #21 en: 28 de Noviembre de 2006, 10:00:05 »
  Un saludo a todos y les agradezco su desinteresada ayuda a todos. He revisado
mi listado y ¡orror! no se como me salte STATUS en la definicion de bancos, pido
disculpas, ni lo vi. Como estaría.
 
  En el post de Monofwar, no he pillado nada, lo siento pero nada. En cuanto a BrunoF,
se nota que usa leguages de alto nivel, por lo de las macros, es bueno, intentaré aprender
de los ejemplo, graciasa todos.
 
  Es cierto, lo que dice Kedutpic, el listado anterior solo era una forma de iniciarme,
 claro, ya que estoy voy a realizar en el f628 algo que ya me funcionaba en el f84A.
 
  Este es el listado en cuestion, espero que no haya problemas y si es correcto, que
 le sirva a algun forero.

;******************************************************************
; Que hace => Debe hacer una pausa o retardo segun volores metidos   
; en los registros 1A y 1B. Para un retardo de 2 milisegundos,     
; cargar el valor 00 02 en 1A y 1B via W.              
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

;--------------- Encabezado -------------

   List P=PIC16F628
   #include <p16f628.inc>   ;inclusion de fichero de etiquetas

   __CONFIG   h'3F50'

   errorlevel      -302      ; Eliminar banco atencion

#define   banco0   BCF   STATUS,5
#define   banco1   BSF   STATUS,5

   ORG 0x00      ; Empezamos a escribir el programa

 banco1
   BSF TRISA,0      ; RA0 como entrada
   BCF TRISA,1      ; RA1 como salida que es la inversa de RA0
   BSF TRISA,2      ; RA2 como entrada para pulsador.
 banco0

; Empieza rutina retardo a peticion usuario.
; Poner valor alto en registro 1Ah y el bajo en 1Bh

Pausa   MOVLW h'03'   ;3d = 00000011b =03h
   MOVWF 2Ah
   MOVLW h'03'   ;3d = 00000011b =03h
   MOVWF 2Bh
   CALL Pausa_mS   ;de 33 mS

Pausa_mS
   MOVF 2B,0   ;Move 1B to W
   MOVWF 29h   ;Move W to 19h
Lazo1   MOVLW h'F8'   ;Put 248 cycles in W
   MOVWF 2C   ;Put 248 into 1C
Lazo2   MOVLW h'0B'   ;Put 11 cycles in W
   MOVWF 2D   ;Put 11 into 1D
Lazo3   DECFSZ 2D,1
   GOTO Lazo3
   DECFSZ 2C,1
   GOTO Lazo2
   DECFSZ 29h,1
   GOTO Lazo1
   INCF 2A,1
   DECFSZ 2A,1
   GOTO Lazo4
   RETURN      ;Return a Pausa

Lazo4   MOVLW 64h      ;Put 100 loops into W
   MOVWF 2B      ;Load 1B with 100
Lazo5   MOVLW h'F8'      ;Put 248 cycles in W
   MOVWF 2C      ;Put 248 into 1C
Lazo6   MOVLW 0B      ;Put 11 cycles in W
   MOVWF 2D      ;Put 11 into 1D
Lazo7   DECFSZ 2D,1
   GOTO Lazo7
   DECFSZ 2C,1
   GOTO Lazo6
   DECFSZ 2B,1
   GOTO Lazo5
   DECFSZ 2A,1
   GOTO Lazo4
   RETURN      ;Return a Pausa

   END


 Un saludo a todos.
Incluso la época de agobio es digna de respeto.
Porque, no la ha creado el hombre, sino la naturaleza que puede ser dura pero jamas absurda.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: necesito programar un 16f628 !!ayuda!! con lo siguiente:
« Respuesta #22 en: 28 de Noviembre de 2006, 18:18:22 »
En cuanto a los define, siento disentir contigo Bruno, en el MPLAB  se pueden utilizar definiciones como tú has hecho, pero las has declarado mal ya que no dices el registro y ante la ausencia de este, el MPLAB escoge el solo el registro cero, por lo que deberían ser así:

#define banco0 bsf  STATUS,RP0
#define banco1 bcf  STATUS,RP0

O como dice Bruno, declarar unas macros.

En cuanto al resto del código, totalmente de acuerdo con lo dicho por los compañeros.

Claro que se puede, yo me refería a que estaba mal tal cual lo había puesto el. No me parecio necesario, ya que lo lógico es usar una MACRO si bien el #define tambien funciona.
Preferí mencionarle la MACRO ya que el #define sólo funciona con 1 linea de código y el MACRO con cuantas quieras.

Además, inmediatamente después de mi post, Kedutpic corrigió los #define de toc-toc y los posteó correctamente. Pero luego se ve que se arrepintió y borro su mensaje y lo volvió a postear.

En cuanto a BrunoF, se nota que usa leguages de alto nivel, por lo de las macros, es bueno, intentaré aprender
de los ejemplo, graciasa todos.

Hola toc-toc.

No. El 99% de las veces programo microcontroladores en ASM.
Y no soy partidario de las MACROS. Jamás las uso. Sólo sirven para casos como este de pocas lineas.
Jamás justifico una MACRO de 20 líneas de código. Puede ser reemplazada por una subrutina y se aprovecha mucho mejor la memoria FLASH del PIC.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado toc-toc

  • PIC12
  • **
  • Mensajes: 57
Re: necesito programar un 16f628 !!ayuda!! con lo siguiente:
« Respuesta #23 en: 28 de Noviembre de 2006, 19:11:20 »
 Ok! Gracias por las respuestas. Entiendo que mi último post es algo más correcto
en cuanto a programa, otra cosa es que esté bien, no obstante, lo he probado con
el MPLAB y no me da errores, por lo que quiero entender que está dentro de lo esperado
así que, voy a intentar 'quemar' el pic16f628 y averiguar si es cierto que está bien.

 Vaya, eso es lo que tenía previsto, pero si antes lo pienso, antes me asaltan las
pregunta, veamos. Dispongo de un quemador basado en el TE20-SE que está bien
configurado para mi PC en XP y además está probado con el F84A y funciona bien.

 Primer escollo, la ventana del programador (IcProg) para el F628, muestra otro aspecto
el cual me 'saca' del sueño de poder quemar mi primer F628, vaya que el oscilador RC
no aparece en la corredera que, lo más parecido que aparece es:

 
 IntRC I/O
 IntRC CLKOUT


 Pregunta 1. Ya que pensaba usar el circuito previsto para el F84A con osc. RC, puedo usar
el InRC I/O para no cambiar nada del circuito o nada mas lejos.

 Pregunta 2. Los bits de config. en principio para evitar problemas inesperados, los dejo sin
marcar. Y

 Pregunta 3. En protección de código, es correcto poner la opción: CP OFF, espero que sí.

 No son preguntas dificiles sin embargo para mi tienen una importancia muy elevada. Por
cierto, sabe alguien del uso de este TE20-SE para este PIC16F628 que tenga algún problema.

 Voy a probarlo de todos modos, ya que es Flash, poco puedo perder ???. Ya comentaré como
me ha ido.
 
 Saludos a todos.
 
 

Incluso la época de agobio es digna de respeto.
Porque, no la ha creado el hombre, sino la naturaleza que puede ser dura pero jamas absurda.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: necesito programar un 16f628 !!ayuda!! con lo siguiente:
« Respuesta #24 en: 28 de Noviembre de 2006, 19:24:43 »
Hola.
No analice a fondo tu programa pero por lo poco que veo, si lo grabas no te vas a dar cuenta nunca de si realmente esta funcionando o no.

En ningun momento trabajas sobre los puertos de PIC, al menos para encender o apagar un led y corroborar que la demora funciona.

La proteccion de codigo no afecta en nada al programa. La unica diferencia es que si la activas, impedis que el codigo sea leido posteriormente(es para que no te copien el programa)

Saludos
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado toc-toc

  • PIC12
  • **
  • Mensajes: 57
Re: necesito programar un 16f628 !!ayuda!! con lo siguiente:
« Respuesta #25 en: 29 de Noviembre de 2006, 19:55:23 »

 Hola BrunoF, es cierto lo que indicas, el caso es que antes de quemar el chip,
como siempre hago una simulación con el MPLAB y de esta forma tan ardua
veo que ocurre en los registros y si cambian como esteraba que lo hicieran.

 Si, es tedioso, aunque como tu bien dices, cuando lo hago con el F84A, le añado
una subrutina con salida a un LED que me indique si funciona y si la cosa se
pone intrincada que a veces se pone, entonces le pongo una subrutina que me
saca un sonido y se que hasta ese punto el programa funciona, luego avanzo un
trozo de programa y le hago un CALL otra vez al sonido y así hasta lograr lo que
me he propuesto.

 Seguro que tu usas otras formas más intuitivas para depurar tus programas y
así ganas tiempo.

 En este inicio, lo que pretendo es tomarle el tranquillo al F628, ya se que no es
lo mismo queel F84, por cierto la tabla de registros SFR es muy grande, imagino
que es cuestión de centrar en lo importante en cada progama.

 Por cierto, en las hojas del fabricante he descubierto como iniciar el puerto A
con un ej. Solo que hay una cosa que no tengo clara, pone:
 
 BCF       STATUS,RP1          ; Esto xq es RP1, es el banco 1
                                         ; xq no hay nada definido aqui
 BSF       STATUS,RP0          ; Esto es el banco 0

 Bueno, el resto del ej. creo que esta claro.

 Vale no me enrollo mas.
Incluso la época de agobio es digna de respeto.
Porque, no la ha creado el hombre, sino la naturaleza que puede ser dura pero jamas absurda.

interticio

  • Visitante
Re: necesito programar un 16f628 !!ayuda!! con lo siguiente:
« Respuesta #26 en: 29 de Noviembre de 2006, 22:06:44 »

hola toc-toc, el tema de estos bits, es que el registro status, posee dos bit para selecionar el banco en el cual estas trabajando.
Por eso aca se setea RP0 y se pone a cero RP1, para seleccionar el banco uno, que es donde esta el registro TRISA que es para configurar el puerto.
 
BCF       STATUS,RP1         pone a cero RP1                                       
BSF       STATUS,RP0         pone a uno RP0

bueno espero que te aya servido nos vemos chau

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: necesito programar un 16f628 !!ayuda!! con lo siguiente:
« Respuesta #27 en: 29 de Noviembre de 2006, 22:19:58 »
Hola
Los bits RP0 y RP1 del registro STATUS definen el banco actual del PIC.
El pic 16F84A por ejemplo, posee sólo dos bancos: 0 y 1.
Mientras que otros mas grandes(como el 16F87XX) poseen 4 bancos: 0,1,2,3.

Entonces, en binario:

Si RP1= 0 y RP0= 0, entonces el PIC estará en el banco 0.
Si RP1= 0 y RP0= 1, entonces el PIC estará en el banco 1.
Si RP1= 1 y RP0= 0, entonces el PIC estará en el banco 2.
Si RP1= 1 y RP0= 1, entonces el PIC estará en el banco 3.

En el 16F84A, si bien existen ambos bits RP1 y RP0, sólo está implementado el bit RP0 debido a que sólo posee dos bancos: el 0 y el 1. Entonces con el BIT RP0 alcanza.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado toc-toc

  • PIC12
  • **
  • Mensajes: 57
Re: necesito programar un 16f628 !!ayuda!! con lo siguiente:
« Respuesta #28 en: 02 de Diciembre de 2006, 19:02:27 »
Hola! Saludos a todos.

 He estado realizando unas pruebas con un pequeño programa para entrenarme
con este F628. En este caso, compruebo si funciona este programa, debería encender
un LED de forma intermitente.
 
 Para lo cual, he ido sacando ideas de varios sitios y revisando las instrucciones que
he podido encontrar en las hojas de caracterisitcas del f628. Este es el listado:

;
; Que hace => Debe hacer. Encender un LED en RB0 durante un
; periodo de tiempo, pasado el cual, se apagara y permanece asi
; el mismo tiempo, para volver a empezar.
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;--------------- Encabezado -------------

   List P=PIC16F628
   #include <p16f628.inc>   ;inclusion de fichero de etiquetas

   __CONFIG   h'3F50'

   errorlevel      -302      ; Eliminar banco atencion

reg1   EQU   2CH      ;variables que usaremos  pongo
reg2   EQU   2DH      ; desde 2C porque en 1C no lo admite
            ; supongo que es porque esta usada.

   ORG 0x00      ; Empezamos a escribir el programa
;
CLRF   PORTA         ;inicializa porta para configurar
            ;salida datos latches
   MOVLW 0X07      ;apaga los comparadores y
   MOVWF CMCON      ;habilita pines para funciones i/o

   BCF   STATUS,RP1   ;selecciona banco1
   BSF   STATUS,RP0   ;selecciona banco 0
   MOVLW 0X1F      ;valor usado para inicializar
            ;direccion de datos
   MOVWF TRISA      ;Pone RA<4:0> como entradas
            ;TRISA<5> siempre leera como 1
            ;TRISA<7:6> depende del modo de oscilador
;------- Empieza programa -----

INICIO
   BSF   PORTB,0    ; pone a 1 RB0
   CALL   pausa      ;
   BCF   PORTB,0   ; pone a 0 RB0
   CALL   pausa      ;
   GOTO   INICIO      ; va a inicio


pausa   MOVLW      010H   ;Carga W con el valor 10H (16 en decimal)
       MOVWF      reg1       ;Mueve el contenido del W a reg1
ak1   MOVLW      0FFH   ;carga el acumulador con el valor FFH
     MOVWF         reg2     ;mueve el contenido del W a reg2
ak   DECFSZ           reg2,F    ;decrementa reg2, guarda el resultado en f,
                      ;y si es cero salta la siguiente instrucción
   GOTO      ak       ;va a decrementar mientras reg2 no sea cero.
   DECFSZ          reg1,F    ;decrementa reg1 cada vez que reg2 llega a cero
   GOTO      ak1      ;mientras reg1 no llegue a cero recarga reg2

   RETURN                  ;retorna al programa principal


   END               ;FIN



 Quiero que me digan porque esto no funciona ya que en el MPLAB lo he probado y
no parece que este correcto, el PORTB,0 se pone a 1, siempre está a 0. Lee
la instruccion BSF PORTB,0 y luego salta al retardo, sin haber cambiado el
nivel del puerto, al menos según el MPLAB.

 He probado a poner BSF TRISB,0 y este registro si funciona, luego BCF TRISB,0
y también cambia, pero el PORTB,0 sigue a 0 todo el tiempo. Puede ser la config.
de los puertos?

 Puede alguien decirme que estoy haciendo mal.

 Gracias por la ayuda.



 
Incluso la época de agobio es digna de respeto.
Porque, no la ha creado el hombre, sino la naturaleza que puede ser dura pero jamas absurda.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: necesito programar un 16f628 !!ayuda!! con lo siguiente:
« Respuesta #29 en: 02 de Diciembre de 2006, 20:51:35 »
   __CONFIG   h'3F50'

No es recomendable que definas la configuración asi. Será dificil para ti darte cuenta de la configuración utilizada y difícil para nosotros también poder comprenderla.

En cambio, utilizá por ejemplo:

   __CONFIG    _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _LVP_OFF & _INTRC_OSC_NOCLKOUT

Que es lo mísmo pero más legible.

reg1   EQU   2CH      ;variables que usaremos  pongo
reg2   EQU   2DH      ; desde 2C porque en 1C no lo admite
            ; supongo que es porque esta usada.


Mira en el datasheet el mapa de memoria del microcontrolador a utilizar. Fijate que está dividido en dos zonas: SFR  GPR. Todos los registros que quieras utilizar para realizar calculos en tu programa deben estar en una direccion GPR válida.
La primer direccion GPR válida para este uC es la 20H.


   BCF   STATUS,RP1   ;selecciona banco1
   BSF   STATUS,RP0   ;selecciona banco 0

ENTRE AMBAS configuran al PIC en el banco1.
El    BCF   STATUS,RP1 NO ASEGURA QUE EL PIC ESTE EN EL BANCO 1. SIMPLEMENTE ASEGURA QUE NO ESTE NI EN EL BANCO 2 NI 3(no estan implementados en este modelo de PIC)

Ahora si seteamos el banco 1 con la BSF   STATUS,RP0

   MOVLW 0X1F      ;valor usado para inicializar
            ;direccion de datos
   MOVWF TRISA      ;Pone RA<4:0> como entradas
            ;TRISA<5> siempre leera como 1
            ;TRISA<7:6> depende del modo de oscilador
;------- Empieza programa -----

INICIO
   BSF   PORTB,0    ; pone a 1 RB0
   CALL   pausa      ;
   BCF   PORTB,0   ; pone a 0 RB0
   CALL   pausa      ;
   GOTO   INICIO      ; va a inicio


Te faltó configurar el PUERTOB como salidas/entradas y volver al banco 0 del PIC. Estabas en el banco1 y no volves al banco0
Simulalo en el MPLAB y en la ventana watch agrega el registro TRISB. vas a ver que el    BSF   PORTB,0    ; pone a 1 RB0 pone a 1 el bit de TRISB y el     BCF   PORTB,0   ; pone a 0 RB0 lo pone a cero.
Estas trabajando en el banco incorrecto. Lo unico que esta haciendo el programa es configurar como entrada y salida constantemente el pin0 del PUERTOB.



Acá va el programa corregido:


   List P=PIC16F628
   #include <p16f628.inc>   ;inclusion de fichero de etiquetas

   __CONFIG   _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _LVP_OFF & _INTRC_OSC_NOCLKOUT


   errorlevel   -302      ; Eliminar banco atencion

reg1   EQU   2CH      ;variables que usaremos  pongo
reg2   EQU   2DH      ; desde 2C porque en 1C no lo admite
            ; supongo que es porque esta usada.

   ORG 0x00      ; Empezamos a escribir el programa

   CLRF   PORTA      ;inicializa porta para configurar
            ;salida datos latches
   MOVLW   0X07      ;apaga los comparadores y
   MOVWF   CMCON      ;habilita pines para funciones i/o

   BCF   STATUS,RP1
   BSF   STATUS,RP0   ;selecciona banco1
   MOVLW   0X1F      ;valor usado para inicializar
            ;direccion de datos

   MOVWF   TRISA      ;Pone RA<4:0> como entradas
            ;TRISA<5> siempre leera como 1
            ;TRISA<7:6> depende del modo de oscilador
   CLRF   TRISB      ;PORTB todo como salida
   BCF   STATUS,RP0   ;banco0

;------- Empieza programa -----

INICIO
   BSF   PORTB,0      ; pone a 1 RB0
   CALL   pausa      ;
   BCF   PORTB,0      ; pone a 0 RB0
   CALL   pausa      ;
   GOTO   INICIO      ; va a inicio

pausa   
   MOVLW   010H      ;Carga W con el valor 10H (16 en decimal)
   MOVWF   reg1      ;Mueve el contenido del W a reg1
ak1   MOVLW   0FFH      ;carga el acumulador con el valor FFH
   MOVWF   reg2      ;mueve el contenido del W a reg2
ak   DECFSZ   reg2,F      ;decrementa reg2, guarda el resultado en f,
            ;y si es cero salta la siguiente instrucción
   GOTO   ak      ;va a decrementar mientras reg2 no sea cero.
   DECFSZ   reg1,F      ;decrementa reg1 cada vez que reg2 llega a cero
   GOTO   ak1      ;mientras reg1 no llegue a cero recarga reg2

   RETURN         ;retorna al programa principal

   END         ;FIN
Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything