Autor Tema: Progama barrido de LED  (Leído 3825 veces)

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

Desconectado rosalva40

  • PIC10
  • *
  • Mensajes: 19
Progama barrido de LED
« en: 16 de Abril de 2015, 14:05:54 »
Hola, soy nueno en el foro, la verdad que muy util , siempre entro a sacarme las dudas, pero esta vez no encontre ningun tema relacionado. Mi problema es el siguiente: Necesito hacer un programa que haga un barrido de de 7 BITS, osea que haga esto:

1 0 0 0 0 0 0
0 1 0 0 0 0 0
0 0 1 0 0 0 0
..................
0 0 0 0 0 0 1
0 0 0 0 0 1 0
..................
1 0 0 0 0 0 0

Y que se repita todo el tiempo esto. Cada secuencia de prendido de LED se prende cada 1 segundo , lo tengo que hacer con una interrupción TMR0. Tome el divisor PSA como 1:256, con el oscilador de 4 mhz, se hace una interrupcion en el timer0 cada 256Useg * 256 = 0,065s , y con el CONTADORTMR en 16,  logro hacer que se produzca la introduccion cada 1 Segundo (0,065seg*16 = 1,04seg).
Hice un DEBUG desde el MPlab y veo como el puerto C ( que es el uso como salida  para prender los LED) va variando correctamente, lo simule en el PIC Simulator, y el Puerto C cada 1 segundo se va cambiando y va haciendo la secuencia correcta, pero lo quiero simular en PROTEUS y no hay forma, no prende ningun LED.
El codigo es este:
Código: [Seleccionar]
list P=16F877A ;Comando que indica el Pic usado
#include "p16F877A.inc" ;Etiquetas genéricas para el Pic16F887

; CONFIG
; __config 0xFFFD
 __CONFIG _FOSC_XT & _WDTE_ON & _PWRTE_OFF & _BOREN_ON & _LVP_ON & _CPD_OFF & _WRT_OFF & _CP_OFF
W_TEMP EQU 0X21
STATUS_TEMP EQU 0X22
CONTADOR EQU 0x23
CONTADORTMR EQU 0x24

    ORG 0x00
    GOTO EMPEZAR
    ORG 0x04
    GOTO INTERRUPCION
    ORG 0x05

EMPEZAR
    BCF STATUS,RP1; Banco 1
    BSF STATUS,RP0

    CLRF TRISC
    MOVLW B'00000111'
    MOVWF OPTION_REG
    MOVLW B'00100000'
    MOVWF INTCON

    BCF STATUS,RP0
    CLRF PORTC

    MOVLW D'6'
    MOVWF TMR0

    MOVLW D'8'
    MOVWF CONTADORTMR

    MOVLW D'12'
    MOVWF CONTADOR

    BSF INTCON, GIE



_INICIO
    GOTO _INICIO
   


INTERRUPCION
;-------- RESPALDO W y STATUS
    MOVWF W_TEMP
    SWAPF STATUS,W
    MOVWF STATUS_TEMP
;--------
    DECFSZ CONTADORTMR,F ;---- Si no es 0 sale de la interrupcion
    GOTO SALIRINT

    MOVF CONTADOR,W
    CALL TABLA
    MOVWF PORTC
;--------------------- RESTAURAR
    SWAPF STATUS_TEMP,W
    MOVWF STATUS
    SWAPF W_TEMP,F
    SWAPF W_TEMP,W
;----------------------
    MOVLW D'8'  ;----- REINICIA CONTADORTMR
    MOVWF CONTADORTMR

    MOVLW D'6'  ;----- REINICIA TMR0
    MOVWF TMR0

    BCF INTCON,T0IF ;----- POne la bandera de interrupcion en 0

    DECFSZ CONTADOR,F
        RETFIE
    CALL  INICIO

TABLA
    ADDWF PCL,F
    RETLW 0x40
    RETLW 0x20
    RETLW 0x10
    RETLW 0x08
    RETLW 0x04
    RETLW 0x02
    RETLW 0x01
    RETLW 0x02
    RETLW 0x04
    RETLW 0x08
    RETLW 0x10
    RETLW 0x20
    RETLW 0x40


INICIO
    MOVLW D'12'
    MOVWF CONTADOR
    RETFIE


SALIRINT
    SWAPF STATUS_TEMP,W
    MOVWF STATUS
    SWAPF W_TEMP,F
    SWAPF W_TEMP,W

    MOVLW D'6'  ;----- REINICIA TMR0
    MOVWF TMR0

    BCF INTCON,T0IF ;----- POne la bandera de interrupcion en 0
    RETFIE

    END

Y aca paso una foto de como tengo configurado la simulacion en PROTEUS



Si algiuen me podria dar una mano se lo agradeceria.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Progama barrido de LED
« Respuesta #1 en: 16 de Abril de 2015, 17:30:28 »
Que tal Rosalva40,

He visto tu codigo y el primer detalle que econtré es que estas habilitando el WDT y eso hara que el micro se este continuamente reseteando ya que por ninguna parte del codigo utilizas la instrucion CLRWDT. Si no deseas utilizar el WD necestas deshabilitarlo cambiando el _WDTE_ON por _WDTE_OFF.
Despues ensamble el codigo con MPLAB 8.83 y realice la simulacion en PROTEUS y trabaja bien a excepcion de que el bit 7 del puerto C no se enciende, pero eso es un bug que tú pudieras localizar. Pero si me trabajo la simulacion en PROTEUS.

No pude ver ninguna imagen que hubieras adjuntado.

Saludos,

elreypic.

Desconectado rosalva40

  • PIC10
  • *
  • Mensajes: 19
Re: Progama barrido de LED
« Respuesta #2 en: 16 de Abril de 2015, 22:35:57 »
Que tal Rosalva40,

He visto tu codigo y el primer detalle que econtré es que estas habilitando el WDT y eso hara que el micro se este continuamente reseteando ya que por ninguna parte del codigo utilizas la instrucion CLRWDT. Si no deseas utilizar el WD necestas deshabilitarlo cambiando el _WDTE_ON por _WDTE_OFF.
Despues ensamble el codigo con MPLAB 8.83 y realice la simulacion en PROTEUS y trabaja bien a excepcion de que el bit 7 del puerto C no se enciende, pero eso es un bug que tú pudieras localizar. Pero si me trabajo la simulacion en PROTEUS.

No pude ver ninguna imagen que hubieras adjuntado.

Saludos,

elreypic.


Muchas gracias, al bit 7 lo uso para otra cosa, no tengo que encenderlo. Ah yo pense que configurando el OPTION_REG y poniendo PSA=0 ya estaba desabilitando eso, pasa que soy  nuevo en esto, y todabia no entiendo bien que es el WTD.
Hice lo que me dijiste y anda perfecto en proteus, nunca me iba a dar cuenta de eso, gracias
« Última modificación: 16 de Abril de 2015, 22:38:20 por rosalva40 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Progama barrido de LED
« Respuesta #3 en: 16 de Abril de 2015, 22:44:04 »
el WDT es simple de entender. Si lo tenes habilitado es como un contador, cuenta ciclos de reloj (el preescaler es para que cuente mas rapido o menos, segun si cuenta 1 cada 64 o 8 ciclos por ejemplo)

Imaginatelo ahora como un registro de 8 bits que cuenta esos ciclos, cuando llega a 0xFF y pasa a 0x00 se produce un overflow y esto le avisa al micro que puede haber existido un problema y ejecuta un reset en el programa.
Es util cuando hay posibilidades que por algun ruido o algo el programa se desvie de su curso original y caiga sobre un area de memoria que no hay instrucciones. Entonces al no haber isntrucciones que pongan a 0 ese "registro" del WDT el micro se resetearia. Volviendo al programa original de la persona sin necesidad de su interaccion.

De tenerlo habilitado cada cierta cantidad de instrucciones deberias de poner un CLRWDT para limpiarlo. Aunque para la mayoria de los hobbies esta siempre desactivado.

Desconectado rosalva40

  • PIC10
  • *
  • Mensajes: 19
Re: Progama barrido de LED
« Respuesta #4 en: 16 de Abril de 2015, 22:58:18 »
el WDT es simple de entender. Si lo tenes habilitado es como un contador, cuenta ciclos de reloj (el preescaler es para que cuente mas rapido o menos, segun si cuenta 1 cada 64 o 8 ciclos por ejemplo)

Imaginatelo ahora como un registro de 8 bits que cuenta esos ciclos, cuando llega a 0xFF y pasa a 0x00 se produce un overflow y esto le avisa al micro que puede haber existido un problema y ejecuta un reset en el programa.
Es util cuando hay posibilidades que por algun ruido o algo el programa se desvie de su curso original y caiga sobre un area de memoria que no hay instrucciones. Entonces al no haber isntrucciones que pongan a 0 ese "registro" del WDT el micro se resetearia. Volviendo al programa original de la persona sin necesidad de su interaccion.

De tenerlo habilitado cada cierta cantidad de instrucciones deberias de poner un CLRWDT para limpiarlo. Aunque para la mayoria de los hobbies esta siempre desactivado.

 Es verdad lo del PSA es el divisor, puse cualquier cosa, gracias, mas o menos me quedo claro, debo leer mas jaja....


 

anything