Autor Tema: Ayuda, aprendizaje y demas :D  (Leído 4743 veces)

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

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Re: Ayuda, aprendizaje y demas :D
« Respuesta #15 en: 27 de Enero de 2015, 10:49:03 »
Código: [Seleccionar]
 addlw    .256-.10       ; C will be set if number was >= 10
    BTFSC    STATUS,C
    addlw    .6                  ; ...adjust for 10..29
    addlw    -(.256-.10)   ; Back to original value
Este código en que parte lo meto?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda, aprendizaje y demas :D
« Respuesta #16 en: 27 de Enero de 2015, 11:23:49 »
Eso es para pasarlo de binario a un formato decimal como dije pasas de 0x0C a 0x12 ( 0001 0010 ) el nibble mayor tiene las decenas y el menor las unidades.

Yo lo usaria en la parte en que tomas los datos.

Suerte con la programacion

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Re: Ayuda, aprendizaje y demas :D
« Respuesta #17 en: 27 de Enero de 2015, 12:07:46 »
Esta parte no te entendí
Citar
Vas a tener que aplicar contadores para hacer la animacion. te decia que el tiempo del timer que elijas para resfrescar lso displays deberia ser un valor tal que multiplicandolo por un entero te de 0.5s Ejemplo 50ms.
De esa forma para hacer un "delay" de 0.5s solo deberias tener algo que cuente 100 veces la entrada a la interrupcion. Y podes usar un numero mas chico para el refresco de los displays

Y aun mas facil todavia..

Si reemplazas los delays  por un
BTFSS MIS_FLAGS,1

Y en la interrupcion de tu timer implementas contadores para solo poner a 1 los flags entonces estarias usando las interrupciones

Ya estoy con el programa y quiero que lo veas y me digas que cosas estan mal, porque se que le faltan un par de cosas:
Código: [Seleccionar]
;========================PLANTILLA 16F88=========================================
;_CONFIG1
;_CONFIG2
;CONFIGURATION BYTE 1 OPTIONS
;_CP_ALL ;ALL PROGRAM MEMORY PROTECTED
;_CP_OFF ;NO CODE PROTECTION
;_CCP1_RB0 CCP1 FUNCTION ON RB0
;_CCP1_RB3 CCP1 FUNCTION ON RB3
;_DEBUG_OFF IN-CIRCUIT DEBUGGER DISABLED, RB6 AND RB7 ARE GENERAL PURPOSE I/O PINS
;_DEBUG;_ON IN-CIRCUIT DEBUGGER ENABLED, RB6 AND RB7 ARE DEDICATED TO THE DEBUGGER
;_WRT_PROTECT;_OFF ;NO PROGRAM MEMORY WRITE PROTECTION
;_WRT_PROTECT_256 ;FIRST 256 PROGRAM MEMORY PROTECTED
;_WRT_PROTECT_2048 ;FIRST 2048 PROGRAM MEMORY PROTECTED
;_WRT_PROTECT_ALL ;ALL OF PROGRAM MEMORY PROTECTED
;_CPD_ON DATA EE MEMORY CODE PROTECTION ENABLED
;_CPD_OFF DATA EE MEMORY CODE PROTECTION DISABLED
;_LVP_ON LOW-VOLTAGE PROGRAMMING ENABLE ENABLED
;_LVP_OFF LOW-VOLTAGE PROGRAMMING ENABLE DISABLED
;_BODEN_ON BROWN OUT RESET DETEC ENABLED
;_BODEN_OFF BROWN OUT RESET DETEC DISABLED
;_MCLR_ON PIN FUNCTION IS MCLR
;_MCLR_OFF PIN FUNCTION IS DIGITAL INPUT, MCLR INTERNALLY TIED TO VDD
;_PWRTE_OFF 72 MSEC. TIME UP DELAY OFF
;_PWRTE_ON 72 MSEC. TIME UP DELAY ON
;_WDT_ON WATCHDOG TIMER ENABLE BIT ON
;_WDT_OFF WATCHDOG TIMER ENABLE BIT OFF
;_EXTRC_CLKOUT
;_EXTRC_IO ;HABILITA EL CLOCK EXTERNO -
;_INTRC_CLKOUT
;_INTRC_IO ;HABILITA EL OSCILADOR INTERNO - PINES RA6 Y RA7 ACTIVADOS
;_EXTCLK
;_HS_OSC HS OSCILLATOR
;_XT_OSC XT OSCILLATOR
;_LP_OSC LP OSCILLATOR
;CONFIGURATION BYTE 2 OPTIONS
;_IESO_ON INTERNAL EXTERNAL SWITCHOVER MODE ENABLED
;_IESO_OFF INTERNAL EXTERNAL SWITCHOVER MODE DISABLED
;_FCMEN_ON FAIL-SAFE CLOCK MONITOR ENABLED
;_FCMEN_OFF FAIL-SAFE CLOCK MONITOR DISABLED

;=====================================================================================
;
;=====================================================================================
; ENCABEZADOS
;=====================================================================================
LIST P=16F88, R=DEC ;ESPECIFICACIONES DEL MICRO
#INCLUDE <P16F88.INC> ; INCLUSION DE ARCHIVOS Y REGISTROS

    __CONFIG _CONFIG1, _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _MCLR_OFF & _LVP_OFF & _INTRC_IO
    __CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF



;=====================================================================================
; ETIQUETAS Y DECLARACION DE VARIABLES
; SE DEBE PONER EN CBLOCK EL INICIO DE LA MEMORIA RAM
; SEGUN EL MICROCONTROLADOR A USAR
;=====================================================================================
;SON 80 BYTES, BANCO 0
;VA DESDE LA POSICION DE MEMORIA H'20' HASTA H'6F'
CBLOCK H'20' ;SE PUEDE ESCRIBIR EN OCTAL O'23' EN BINARIO B'101' Y EN ASCII 'A'
    W_TEMP, STATUS_TEMP
FSR_TEMP, PCLATH_TEMP
    TEMP
    A_ENVIAR
    DECENAS
    UNIDADES
    CONTADOR
    FLAG2
    FLAG
    FLAGS
    CON_DIS
ENDC


;*** VARIABLES PARA TODOS LOS BANCOS ***
; SON 16 BYTES EN BANK0/1/2/3
;*******************************************
CBLOCK H'70' ;VAN DESDE H'70' HASTA H'7F'
;SON VARIABLES USADAS EN LA SUBRUTINA INTERRUPCION


ENDC



;BANCO 1 -- SON 80 BYTES, DESDE H'A0' HASTA H'EF'
;Y LUEGO VIENEN 16 BYTES COMPARTIDOS DESDE H'F0' HASTA H'FF'
CBLOCK H'A0'
ENDC

;BANCO 2 SON 80 BYTES, DESDE H'110' HASTA H'16F'
;Y LUEGO VIENEN 16 BYTES COMPARTIDOS DESDE H'170' HASTA H'17F'
CBLOCK H'110'
ENDC

;BANCO 3 SON 80 BYTES, DESDE H'190' HASTA H'1EF'
;Y LUEGO VIENEN 16 BYTES COMPARTIDOS DESDE H'1F0' HASTA H'1FF'
CBLOCK H'190'

    ENDC


; ORG 0x000
; GOTO BOOTSTART
          ;  ORG         0x004
         ;   GOTO        INTERRUPCION
ORG       0x00
.   GOTO        BOOTSTART
ORG       0x04
    GOTO        INTERRUPCION

INICIA
BANKSEL PORTA ; SELECT BANK OF PORTA
CLRF PORTA ; INITIALIZE PORTA BY
BANKSEL OSCCON
MOVLW 0X60  ;RELOJ INTERNO 4MHZ
MOVWF OSCCON
BANKSEL ANSEL ; SELECT BANK OF ADCON1
MOVLW 0X00  ; CONFIGURE ALL PINS
MOVWF ANSEL ; AS DIGITAL INPUTS
BANKSEL TRISA
MOVLW 0X0F  ; VALUE USED TO
MOVWF TRISA ; SET RA<7:0> AS INPUTS
BANKSEL TRISB
            CLRF TRISB
BANKSEL PORTA
            CLRF INTCON
            CALL    TIMER
            BANKSEL DISPLAY1
            MOVLW   B'00000001'
            MOVWF   CON_DIS
            CLRF    PORTB
            MOVLW   .0
            MOVWF   UNIDADES
            MOVLW   .0
            MOVWF   DECENAS
            CLRF    FLAG

; Variables usadas: W_TEMP, STATUS_TEMP, PCLATH_TEMP y la del ISR FLAGS ( creada por mi para tener el flag de interrupcion de recepcion )
; Codigo sacado del datasheet del PIC, salva el contenido de W, STATUS y PCLATH, realiza la interrupcion , y luego lo devuelve a su estado original para que ningun problema ocurra luego.
TIMER
            BANKSEL OPTION_REG
            MOVLW       B'00000110'
            MOVWF       OPTION_REG
            BCF INTCON,6             ;INT EXTERNAS
            BSF         INTCON,5              ;TMR0
            BCF         INTCON,4               ;INT RB0
            BCF         INTCON,3               ;INT RB4-RB7
            BCF         INTCON,1            ;BANDERA RB0
            BCF         INTCON,0         ;BANDERA RB4-RB7
            BCF         INTCON,2           ;BANDERA TMROIF
            BSF INTCON,7           ;INT GENERAL
            MOVLW D'217'
            BANKSEL     TMR0
            MOVWF TMR0
            RETURN


INTERRUPCION:
     MOVWF W_TEMP ;Copy W to TEMP register
     SWAPF STATUS, W ;Swap status to be saved into W
     CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
     MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register
     MOVF PCLATH, W ;Only required if using page 1
     MOVWF PCLATH_TEMP ;Save PCLATH into W
     CLRF PCLATH ;Page zero, regardless of current page

     ; Aca el codigo de tu ISR
    BTFSS    FLAG,0
    GOTO     MULTI
    DECFSZ   FLAG2;ACA SE HACE EL CONTEO DEL TIEMPO DE DECREMENTACION
    GOTO     MULTI
    MOVLW    .78    ; TIEMPO DE PARPADEO 0.5 SEG
    MOVWF    FLAG2
    BSF FLAGS,0  ; Si solo tenes inetrrupcion de RX, sino vas a tener que preguntar que interrupcion fue y actuar de acuerdo a eso
    BCF PIR1,RCIF
    BTFSS   FLAGS
    GOTO    ANIMACION
    ;COMO PONGO QUE SIGA MOSTRANDO LOS DATOS DE LAS LLAVES?
ANIMACION
            CLRF     FLAG
            MOVLW    .0
            MOVWF    UNIDADES
            MOVLW    .0
            MOVWF    DECENAS
            GOTO     MULTI

MULTI

            BTFSS    CON_DIS,0
            GOTO     SALTO1
            GOTO     DISP1
SALTO1
            BTFSS   CON_DIS,1
            GOTO    DISP2
            GOTO    DISP2

DISP1


            BANKSEL UNIDADES
            MOVF    UNIDADES,0
            BANKSEL PORTB
            MOVWF   PORTB

            MOVLW   B'00000010'
            MOVWF   CON_DIS
            BSF     PORTB,7
            GOTO    XX
DISP2
            BANKSEL DECENAS
            MOVF    DECENAS,0
            BANKSEL PORTB
            MOVWF   PORTB
            MOVLW   B'00000001'
            MOVWF   CON_DIS
            BSF     PORTB,6

     ; Fin del codigo de ISR
XX
            BCF      INTCON,TMR0IF
            MOVLW    .217
            MOVWF    TMR0
            MOVF     PCLATH_TEMP, W ;Restore PCLATH;
            MOVWF    PCLATH         ;Move W into PCLATH
        SWAPF    STATUS_TEMP, W ;Swap STATUS_TEMP register into W
                                    ;(sets bank to original state)
MOVWF    STATUS         ;Move W into STATUS register
SWAPF    W_TEMP, F ;Swap W_TEMP
SWAPF    W_TEMP, W      ;Swap W_TEMP into W
            RETFIE

BOOTSTART
   BANKSEL   OSCCON
   MOVLW   0X60   ;RELOJ INTERNO 4MHZ
   MOVWF   OSCCON
   BANKSEL PORTA       ; BANK0
   MOVLW     B'11110000'
   MOVWF     PORTA
   MOVLW     B'00000011'
   MOVWF     PORTB

   BANKSEL TRISA       ; BANK1
   MOVLW     B'11110000'
   MOVWF     TRISA
   MOVLW     B'00100111'
   MOVWF     TRISB
   MOVLW     B'00000000'
   MOVWF     ANSEL         ; PORTA INPUTS = DIGITAL NOT ANALOG
   ;
   ; BAUD RATE SETTINGS
   ;
   ;  BAUD VALUES WITH BRGH = 0
   ;  ((20000000/9600)/64)-1 = 32
   ;    MOVLW     D'207'    ;  1200 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'103'          ;  2400 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'25'           ;  9600 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'12'           ; 19200 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'255'          ;  1200 BAUD @ 20 MHZ FOSC +1.73 ERR
   ;    MOVLW     D'129'          ;  2400 BAUD @ 20 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'32'          ;  9600 BAUD @ 20 MHZ FOSC -1.36 ERR
   ;    MOVLW     D'15'          ; 19200 BAUD @ 20 MHZ FOSC +1.73 ERR

   ;  BAUD VALUES WITH BRGH = 1
   ;  ((20000000/9600)/16)-1 = 32
   MOVLW     D'25'         ;  9600 BAUD @ 20 MHZ FOSC +0.16 ERR
   MOVWF     SPBRG
   MOVLW     B'00100100'    ; BRGH = 1
   MOVWF     TXSTA           ; ENABLE ASYNC TRANSMISSION, SET BRGH
   BANKSEL   RCSTA       ; BANK0
   MOVLW     B'10010000'
   MOVWF     RCSTA          ; ENABLE ASYNC RECEPTION
   MOVF RCREG,W
   MOVF RCREG,W           ; FLUSH RECEIVE BUFFER


MAIN:
   ; Aca tu programa principal
   CALL TOMAR_DATOS
   CALL ENVIAR
 CALL MOSTRAR_DISPLAY
  CALL RECIBIR
   GOTO MAIN


TOMAR_DATOS:
    addlw    .256-.10       ; C will be set if number was >= 10
    BTFSC    STATUS,C
    addlw    .6                  ; ...adjust for 10..29
    addlw    -(.256-.10)   ; Back to original value
    SWAPF PORTA,W  ; Aca toomo datos lo paso a BCD y guardo en variable
    ANDLW 0x0F
    MOVF  A_ENVIAR
    SUBWF A_ENVIAR,0
    ;COMO SE SI ES MAYOR O MENOR A 10?

    RETURN

ENVIAR:
     BTFSS PIR1,TXIF
     RETURN
     BTFSC     DECENAS
     ADDLW     UNIDADES
     GOTO      DEC1
     BTFSS     DECENAS
     GOTO      MUEVO
     NOP
     GOTO      DEC1
MUEVO
     MOVLW     .30
     MOVWF     UNIDADES

DEC1
     MOVF      PORTA      ;muevo depende el puerto en donde conecte
     MOVWF     TXREG      ;Aca envio

     RETURN







;lo mismo para todo lo demas

     END
En si la primer parte de configuraciones es una tabla que nos dieron en el colegio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda, aprendizaje y demas :D
« Respuesta #18 en: 27 de Enero de 2015, 13:37:40 »
mire rapidamente el codigo aunque me marie de tantos comments entre otras cosas.

Voy a hacer un codigo rapido para que entiendas lo que digo.

Código: [Seleccionar]
org 0x00
    NOP
    NOP
    GOTO configuracion
org 0x04
    GOTO interrupcion


configuracion:
      ; Aca configuro todo (puertos, timers, inicializo todas las  variables a 00 o el valor que tengan, cargo valor de timer y activo interrupciones al ultimo )
    GOTO main


;******COMIENZO DE INTERRUPCION********

interrupcion:
;guardo contexto
BTFSC PIR1,RCIF ; Pregunto por si llego algo en la UART
        GOTO int_uart
BTFSS INTCON,TMR0IF ; Pregunto si la interrupcion fue del timer
GOTO salir_int ; Aca podria seguir agregando por eso pregunte arriba, y puse el GOTO, sino no hacia flata pregunta si era lo unico 2 que estaba activo
DECF  CONTADOR_DISPLAYS ;Implemento contador por si es muy corta la interrupcion y para hacerla mas larga ( es decir contar la cantidad de interrupciones )
BTFSS STATUS,Z
GOTO salir_int
BSF    FLAG,1 ; mi flag al pasar X veces por aca habilitando que se muestre
MOVLW 0xXX ; Recargo mi temporizador
MOVWF TMR0
MOVLW 0xXX ; Recargo mi contador
MOVWF CONTADOR_DISPLAYS
BCF INTCON,TMR0IF
GOTO salir_int

int_uart

BSF FLAG,0 ; mi flag de que llego algo por la UART
        MOVF RCREG ; Limpio el buffer de lectura
        MOVF RCREG ; Limpio el buffer de lectura
        MOVF RCREG ; Limpio el buffer de lectura, 3 por que es posible tener 2 en la FIFO + 1 en el shift register, al vaciar la FIFO se pone a 0 RCIF

salir_int
;devuelvo el contexto
RETFIE

;******FIN DE INTERRUPCION********

;******COMIENZO DE PROGRAMA PRINCIPAL********

main:
CALL tomar_datos
CALL enviar
CALL mostrar_displays
CALL animacion
GOTO main


mostrar_displays
BTFSC FLAG,2   ; Con este indico que display estoy mostrando, si esta en 1 significa que es mi 2do display
Goto Display2

Display1:
BTFSC FLAG,1   ; Espero hasta que pase el tiempo se ejecute la interrupcion y me habilite la flag sino sigo saliendo
RETURN
BCF  PORTB,catodo2
MOVF dato_decenas
MOVWF PORTB ; Aca supongo que todo lo demas que no es dato esta en 0
BSF  PORTB,catodo1
BSF FLAG,2     ; Activo el flag para que pase al otro display ( 2 )
        BCF FLAG,1 ; Desactivo el flag del timer
RETURN

Display2:
BTFSC FLAG,1
RETURN
BCF  PORTB,catodo1
MOVF dato_unidades
MOVWF PORTB ; Aca supongo que todo lo demas que no es dato esta en 0
BSF PORTB,catodo2
BCF FLAG,2     ; Activo el flag para que pase al otro display ( 1 )
        BCF FLAG,1 ; Desactivo el flag del timer
RETURN

animacion:
BTFSS FLAG,0
        RETURN
;Aca parecido nomas que deberia contar un poco mas ya que el otro delay es mas corto o directamente aplicar la interrupcion a este.Y el otro no hacerle un "delay"
        BCF FLAG,0
        RETURN

tomar_datos:
MOVF PORTA ;supongo que esta en el porta el dato en el nibble bajo
        ANDLW 0x0F
MOVWF DATO_A_ENVIAR
        ;paso a BCD, codigo q pase antes
        ANDLW 0x0F
        MOVWF UNIDADES
SWAPF DATO_A_ENVIAR,W
        ANDLW 0x0F
        MOVWF DECENAS
        RETURN

enviar:

BTFSS PIR1,TXIF
RETURN
        ;Aca me fijo si es de 0 a 9 asi le sumo 0x30 ('0') o si es una A a F asi le sumo una 'A' a DATO_A_ENVIAR
        MOVWF TXREG ;Cargo el valor asi se envia
RETURN

Lamentablemente creo que lo termine haciendo casi todo yo.. nuevamente e.e
Tendrias que hacer 2 partes de codigo y listo, tenes terminado tu programa, al menos es de la forma que lo encararia yo, seguro que otro tiene otra perspectiva diferente y mejor.
« Última modificación: 27 de Enero de 2015, 13:45:57 por KILLERJC »

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Re: Ayuda, aprendizaje y demas :D
« Respuesta #19 en: 27 de Enero de 2015, 15:01:03 »
Te lo agradezco mucho y si casi todo vos lo hiciste discúlpame, para que hace meses que no encaro un programa y estaba algo oxidado. Si pudiera te daría +10 xD

Lo voy a programar y simular. Luego lo subo así vez tu obra de arte :D

Gracias de nuevo!


 

anything