Autor Tema: Ayuda inicio  (Leído 32932 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: Ayuda inicio
« Respuesta #30 en: 15 de Junio de 2006, 13:11:26 »
Código: ASM
  1. ;* Rutina de Pausa para tiempos largos
  2. ;* (Adecuada para un reloj de 4 Mhz)
  3. ;**************************************************************************
  4. ;Define constantes Para 20 milisegundos
  5. N     EQU 0x1A
  6. M     EQU 0x0
  7. cont1 EQU 0x20
  8. cont2 EQU 0x21
  9. ;inicia rutina
  10. pau   MOVLW N ;(1) Carga dato N
  11.       MOVWF cont1 ;(1) inicializa contador1 ciclo externo
  12. rep1  MOVLW M ;(1) Carga dato M
  13.       MOVWF cont2 ;(1) inicializa contador2 ciclo interno
  14. rep2  DECFSZ cont2,1 ;(1,2)Decrementa contador2 y escapa si cero
  15.       GOTO rep2 ;(2) si no es cero, repite ciclo interno
  16.       DECFSZ cont1,1 ;(1,2)Decrementa contador1 y escapa si cero
  17.       GOTO rep1 ;(2) si no es cero repite ciclo externo
  18. esc   RETURN ;(2) regresa de esta subrutina
  19. end

La duración de esta rutina en ciclos de reloj será

Tsub = 2+1+1+N*[1+1+(M-1)*(1+2)+2+1+2]+1-2+2+2 ciclos

Lo cual se puede simplificar como sigue

Tsub = [N*(3M+4)+7] Tcy

Donde Tcy es la duración en segundos de un ciclo de instrucción.

Cálculo de N.- Para lograr que la duración de la subrutina presentada sea de 20
milisegundos es necesario elegir adecuadamente el valor de la constante N.

Para una frecuencia de 4 Mhz Tcy = 1 µseg, entonces Tsub máximo =0.197639 seg.

Si deseamos Tsub = 20 mseg, haciendo M=256, despejando N

N = (Tsub/Tcy – 7)/(3M+4)

Sustituyendo valores N= 25.89 » 1Ah. (debido a la aproximación la rutina realmente
dura 20.08 mseg.

Espero y te sea de ayuda, cualquier duda o comentario pues unicamente lo posteas.

Saludos LabPIC
« Última modificación: 15 de Junio de 2006, 13:56:01 por LabPIC »
¡¡¡Viva México cabrones!!!

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #31 en: 15 de Junio de 2006, 13:42:03 »
Código: [Seleccionar]
ORG 0

bsf STATUS,RP0 ; activamos banco 1, poniendo RP0 a 1 y RP1 a 0
bcf STATUS,RP1 ; activamos banco 1, poniendo RP0 a 1 y RP1 a 0
N     EQU 0x1A
M     EQU 0x0
cont1 EQU 0x20
cont2 EQU 0x21

Movlw 07h ; pongo en digital el puerto A.
movwf ADCON1
MOVLW 0X00 ; carga 00000 en W
MOVWF TRISA ; puerto A todos salidas
MOVLW 0X00 ; carga 00000 en W
MOVWF TRISB ; puerto B todos salidas
MOVLW 0X00   ; carga 00000 en W
MOVWF TRISC ; puerto C todos salidas
MOVLW 0XFF ; carga 1111 en W
MOVWF TRISE ; puerto E todo entradas

bcf STATUS,RP0 ; volvemos al banco 0 poniendo RP0 a 0 y RP1 a 0
bcf STATUS,RP1 ; volvemos al banco 0 poniendo RP0 a 0 y RP1 a 0


CLRF PORTA ;inicializamos a 0 el puerto A
CLRF PORTB ;inicializamos a 0 el puerto B
CLRF PORTC ;inicializamos a 0 el puerto C


DEMORA
pau   MOVLW N ;(1) Carga dato N
      MOVWF cont1 ;(1) inicializa contador1 ciclo externo
rep1  MOVLW M ;(1) Carga dato M
      MOVWF cont2 ;(1) inicializa contador2 ciclo interno
rep2  DECFSZ cont2,1 ;(1,2)Decrementa contador2 y escapa si cero
      GOTO rep2 ;(2) si no es cero, repite ciclo interno
      DECFSZ cont1,1 ;(1,2)Decrementa contador1 y escapa si cero
      GOTO rep1 ;(2) si no es cero repite ciclo externo
esc   RETURN ;(2) regresa de esta subrutina
  END     

INICO

ESPERAR ;etiqueta
btfss   PORTE,0      ;si RE0 es 1 saltara el goto, si es 0 pasará a GOTO ESPERAR
CALL DEMORA
goto ESPERAR ;salta a la etiqueta esperar


enciende
movlw 0XFF ;cargo todo a 1 en W
movwf PORTB ;pongo a 1 todo el puerto B
movwf PORTA ;pongo a 1 todo el puerto A.
movwf PORTC ;pongo a 1 todo el puerto C.
btfsc PORTE,0      ;si RE0 está a 0 saltara el goto, si es 1 pasará a GOTO 
CALL DEMORA
goto enciende ;salta a la etiqueta apaga

CLRF PORTA ;inicializamos a 0 el puerto A
CLRF PORTB ;inicializamos a 0 el puerto B
CLRF PORTC ;inicializamos a 0 el puerto C
goto ESPERAR
END

Hay algo que estoy haciendo mal, porque ahora el proteus cuando pulso el pulsador no me activa a 1 los puertos A,B y C.


Desconectado LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: Ayuda inicio
« Respuesta #32 en: 15 de Junio de 2006, 14:01:47 »
Quita el END de la subrutina de DEMORA, unicamente puede haber uno, y este es al final de todo el programa.

Saludos LabPIC
¡¡¡Viva México cabrones!!!

Desconectado LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: Ayuda inicio
« Respuesta #33 en: 15 de Junio de 2006, 14:07:00 »
Cambia esta parte esta alreves:

Citar
ESPERAR   ;etiqueta
btfss   PORTE,0;si RE0 es 1 saltara el goto, si es 0 pasará a GOTO ESPERAR
goto ESPERAR;salta a la etiqueta esperar
CALL DEMORA

De igual manera
Citar
enciende
movlw 0XFF;cargo todo a 1 en W
movwf PORTB;pongo a 1 todo el puerto B
movwf PORTA;pongo a 1 todo el puerto A.
movwf PORTC;pongo a 1 todo el puerto C.
btfsc PORTE,0;si RE0 está a 0 saltara el goto, si es 1 pasará a GOTO 
goto enciende;salta a la etiqueta apaga
CALL DEMORA

Saludos LabPIC
« Última modificación: 15 de Junio de 2006, 14:42:00 por LabPIC »
¡¡¡Viva México cabrones!!!

Desconectado LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: Ayuda inicio
« Respuesta #34 en: 15 de Junio de 2006, 21:08:49 »
Código: ASM
  1. LIST P=PIC16F873A       ; PIC16F873A
  2.  
  3.                 #include "P16F873A.INC" ;
  4.  
  5.                 cblock 0x20             ;
  6.                 cont1                   ;
  7.                 cont2                   ;
  8.                 N                       ;
  9.                 M                       ;
  10.                 endc
  11.  
  12.                 org     0x00            ;Vector de reset        
  13.                 goto    INICIO          ;
  14.                 org     0x05            ;Página 0 de memoria de programa
  15.  
  16. INICIO          BSF     STATUS,RP0      ;Banco 1
  17.                 BCF     STATUS,RP1      ;Banco 1
  18.                 MOVLW   0x07            ;
  19.                 MOVWF   ADCON1          ;Puerto A como Digital
  20.                 CLRF    TRISA           ;Puerto A como salidas
  21.                 CLRF    TRISB           ;Puerto B como salidas
  22.                 CLRF    TRISC           ;Puerto C como salidas
  23.                 MOVLW   b'11101111'     ;
  24.                 MOVWF   TRISE           ;Puerto E como entradas
  25.  
  26. ESPERAR         BCF     STATUS,RP0      ;Banco 0
  27.                 BCF     STATUS,RP1      ;Banco 0
  28. checa           btfss   PORTE,0         ;si RE0 es 1 saltara el goto, si es 0 pasará a ESPERAR        
  29.                 goto    ESPERAR         ;salta a la etiqueta esperar   
  30.                 CALL    DEMORA          ;Limpiado del rebote
  31. chec1           BTFSS   PORTE,0         ;checa nuevamente si RE0=1
  32.                 GOTO    checa           ;si RA1=0 falsa alarma, vuelve a checar
  33.  
  34. enciende        movlw   0XFF            ;cargo todo a 1 en W
  35.                 movwf   PORTA           ;pongo a 1 todo el puerto B
  36.                 movwf   PORTB           ;pongo a 1 todo el puerto A.
  37.                 movwf   PORTC           ;pongo a 1 todo el puerto C.
  38.                 btfsc   PORTE,0         ;si RE0 está a 0 saltara el goto, si es 1 pasará a GOTO  
  39.                 goto    enciende        ;salta a la etiqueta apaga
  40.                 CALL    DEMORA
  41.  
  42.  
  43. DEMORA          MOVLW   N               ;Carga dato N
  44.                 MOVWF   cont1           ;Inicializa contador1 ciclo externo
  45. rep1            MOVLW   M               ;Carga dato M
  46.                 MOVWF   cont2           ;Inicializa contador2 ciclo interno
  47. rep2            DECFSZ  cont2,1         ;Decrementa contador2 y escapa si cero
  48.                 GOTO    rep2            ;si no es cero, repite ciclo interno
  49.                 DECFSZ  cont1,1         ;Decrementa contador1 y escapa si cero
  50.                 GOTO    rep1            ;Si no es cero repite ciclo externo
  51. esc             RETURN                  ;Regresa de esta subrutina
  52. end

picto te dejo el codigo con algunas correcciones, espero y te sea de ayuda.

Saludos LabPIC
« Última modificación: 16 de Junio de 2006, 12:26:15 por LabPIC »
¡¡¡Viva México cabrones!!!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda inicio
« Respuesta #35 en: 15 de Junio de 2006, 21:12:28 »
Hola picto, bueno...nunca dejes que una rutina llegue hasta el END.Podes obtener resultados indeseados. Cuando no queres que el micro haga nada mas, simplemente pone:

LOOP     goto   LOOP

por ej. eso es suficiente para que el micro se quede estancado alli de manera segura.



Hola, estas checkeando el PORTC,0 cuando en realidad deberia ser el PORTE,0
Cambia:

btfss   PORTC,0         ;si RE0 es 1 saltara el goto, si es 0 pasará a GOTO ESPERAR

Por
btfss   PORTE,0         ;si RE0 es 1 saltara el goto, si es 0 pasará a GOTO ESPERAR

Saludos.

Bruno, antes lo tenía en PORTE,0 pero no hacúia nada y he pegado el código de las pruebas´. PEro ya lo he solucionado!

Por cierto, es normal que con el MPlab al compilar me salgan todos estos errores?

No son errores, si tenes un error, no se crea el archivo .hex.

Message[301] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\P16F877A.INC 36 : MESSAGE: (Processor-header file mismatch.  Verify selected processor.) <- Tenes configurado un modelo de PIC en el MPLAB distinto al que estas trabajando. Anda en el MPLAB a la pestaña Configure--> Select Device y selecciona el que estes usando.

Warning[205] : Found directive in column 1. (ORG) -> Todas las directivas deben ir a partir de la segunda columna de codigo, es decir, hace un TAB antes de poner una instruccion.

Warning[203] : Found opcode in column 1. (bsf) -> Todas las instrucciones deben ir a partir de la segunda columna de codigo, es decir, hace un TAB antes de poner una instruccion.

Message[302] : Register in operand not in bank 0.  Ensure that bank bits are correct.
Te indica que estas haciendo referencia a un registro que no esta ubicado en el BANCO 0 del pic. Es simplemente para recordarte que verifiques que has pasado al banco correcto antes de trabajar con dicho registro.


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 LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: Ayuda inicio
« Respuesta #36 en: 15 de Junio de 2006, 21:14:21 »
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _CPD_OFF

Esta es la configuración de bits del PIC.

Saludos LabPIC
¡¡¡Viva México cabrones!!!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda inicio
« Respuesta #37 en: 15 de Junio de 2006, 21:17:33 »
LabPIC, esta instruccion de tu programa:

chec1       BTFSS    PORTA,0    ;checa nuevamente si RA0=1

deberia ser:

chec1       BTFSS    PORTE,0    ;checa nuevamente si RE0=1

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 LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: Ayuda inicio
« Respuesta #38 en: 15 de Junio de 2006, 21:20:25 »
Tienes razon BrunoF :D, una disculpa ando un poco despistado.

Saludos LabPIC
¡¡¡Viva México cabrones!!!

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Ayuda inicio
« Respuesta #39 en: 16 de Junio de 2006, 02:59:07 »
Esto está mal:


MOVLW b'11111111' ;

MOVWF   TRISE

El bit 4 debe estar a 0 para ser entradas salidas digitales, sino estas habilitando el puerto E para  modo PSP.
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #40 en: 16 de Junio de 2006, 04:53:15 »
Hola amigos, vamos por partes. Antes de probar el código que habeis colocado (muchas gracias) os pongo el código que he colocado al final para probar (sin demora) y lo he montado para ver como funciona.

La idea para empezar y aprender es es que cuando pulse el pulsador se iluminen todos los leds coenctados a los puertos A,B y C y si lo dejo de pulsar se apaguen.

He montado el circuito con este código (ahora me faltra depurarlo con lo que habeis puesto más arriba) y lo que pasa que cuando pulso el pulsador y lo dejo apretado el led parpadea muy rápido y lo que quiero es que se quede encendido hasta que yo deje de pulsar.

Esto es lo que he programado en el pic cuando lo he montado:
Código: [Seleccionar]
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off
; power up timer on
; watchdog off
; osc XT

ORG 0
bsf STATUS,RP0 ; activamos banco 1, poniendo RP0 a 1 y RP1 a 0
bcf STATUS,RP1 ; activamos banco 1, poniendo RP0 a 1 y RP1 a 0
Movlw 07h ; pongo en digital el puerto A
movwf ADCON1 ; pongo en digiatl el puerto A
MOVLW 0X00 ; carga 00000 en W
MOVWF TRISA ; puerto A todos salidas
MOVLW 0X00 ; carga 00000 en W
MOVWF TRISB ; puerto B todos salidas
MOVLW 0X00   ; carga 00000 en W
MOVWF TRISC ; puerto C todos salidas
MOVLW 0XFF ; carga 1111 en W
MOVWF TRISE ; puerto E todo entradas
bcf STATUS,RP0 ; volvemos al banco 0 poniendo RP0 a 0 y RP1 a 0
bcf STATUS,RP1 ; volvemos al banco 0 poniendo RP0 a 0 y RP1 a 0

espera_apaga ;etiqueta
CLRF PORTA ;inicializamos a 0 el puerto A
CLRF PORTB ;inicializamos a 0 el puerto B
CLRF PORTC ;inicializamos a 0 el puerto C
btfss PORTE,0      ;si RE0 es 1 saltara el goto, si es 0 pasará a esperar y apagar
Goto  espera_apaga ;salta a la etiqueta ESPERAR

enciende
movlw 0XFF ;cargo todo a 1 en W
movwf PORTB ;pongo a 1 todo el puerto B
movwf PORTA ;pongo a 1 todo el puerto A.
movwf PORTC ;pongo a 1 todo el puerto C.
btfss PORTE,0      ;si RE0 está a 1 saltara el goto espera_apaga, si es 0 pasará a GOTO enciende
goto    espera_apaga ;al estar RE0 a 0 salta a espera_apaga
goto enciende ;al estar RE0 a 1 salta a la etiqueta enciende

end

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #41 en: 16 de Junio de 2006, 05:07:53 »
Esto está mal:


MOVLW b'11111111' ;

MOVWF   TRISE

El bit 4 debe estar a 0 para ser entradas salidas digitales, sino estas habilitando el puerto E para  modo PSP.

Lo cambio por MOVLW b'11101111' ok?


Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #42 en: 16 de Junio de 2006, 05:46:15 »
He vuelto a compilar el HEX y lo he graabdo al PIC y ya hace lo que quería. Al pulsar se enciende el led, el dejar d epulsar se apaga, y si lo dejo pulsado se queda permanentemente encendido.

Lo raro que lo he hecho sin lo del antirrebotes y funciona....

Ahora voy a ir más allá.

Cada vez que pulse me encenderá 1 led, es decir 1 pulso= Patilla RA0 ON, segundo pulso RA1= ON así sucesivamente hasta llegar a RC7.

Que nervios. :mrgreen:

Todoe sto gracias a vosotros

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda inicio
« Respuesta #43 en: 16 de Junio de 2006, 05:55:27 »
Hola picto, si haces eso que decis, vas a ver el problema de no poner el antirrebote :D :D
Si no pones el antirrebote te va a contar mas de un pulso cuando presiones el pulsador  y mas de uno nuevamente cuando lo sueltes.
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 pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Ayuda inicio
« Respuesta #44 en: 16 de Junio de 2006, 06:20:54 »
EAAAA !! :-/ FELICIDADES!

Es el primer pasito a este apasionante mundo...ya verás que es como una droga; no lo podrás dejar  :mrgreen:

Por lo pronto acostúmbrate a poner esto en el encabezado de cada programa que hagas usando este micro (incluso sería interesante lo grabes como .asm para que lo tengas como plantilla):

   LIST p=16f877a      ; esto lo cambias si usas otro micro
   #include <p16f877a.inc>   ;y esto también
    __config  _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & BODEN_OFF

; Esto es para suprimir los mensajes de warning del MPLAB ( a veces son molestos)
   ERRORLEVEL -302      ;suppress "not in bank 0" message
   ERRORLEVEL -203      ;suppress  message
   ERRORLEVEL -305      ;suppress  message
   ERRORLEVEL -205      ;suppress  message

        org     00h              ; Vector de reset (aqui viene el micro cuando arranca)
        goto    Inicio           ; Y inmediatamente lo mandamos a Inicio
        org     04h              ; Vector de interrupciones             
        goto interrupciones ; para uso futuro si usas interrupciones
        org     05h              ; Aqui le dices al micro en que posicion de memoria comienza lo ;que sigue

   Inicio
; Aqui escribe tu programa principal
;
;


interrupciones
; Aqui escribes tu programas de interrupciones si lo tienes, sino no pasa nada. Es para usos ;futuros.
retfie

end ; aqui termina         
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"