Autor Tema: Preguntas sobre assembler  (Leído 11560 veces)

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

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Re: Preguntas sobre assembler
« Respuesta #15 en: 10 de Febrero de 2015, 20:06:29 »
No hay drama! Lo voy a probar con el que me acabas de corregir y te digo, porque el problema que tenía es que iniciaba el programa y cualquier dato que le mande a través de las llaves no se veía en los displays

Te dejo el programa así tal vez recuerdes un poco mientras pruebo el có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 )

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   .78
            MOVWF   CONTADOR_DISPLAYS
            CLRF    PORTB
            MOVLW   .0
            MOVWF   DISPLAY1
            MOVLW   .0
            MOVWF   DISPLAY2
            CLRF    FLAG

;   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
MOVF RCREG,W           ; FLUSH RECEIVE BUFFER

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


    GOTO MAIN


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

INTERRUPCION
;guardo contexto
    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
    CLRF     PORTB
;--------------------------------------------------------------------------
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 .217 ; Recargo mi temporizador
MOVWF TMR0
MOVLW .78 ; 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------------------------------------
    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

;******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,2    ;catodo2
MOVF DATO_DECENAS
MOVWF PORTB ; Aca supongo que todo lo demas que no es dato esta en 0
BSF  PORTB,3     ;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,3     ;catodo1
MOVF DATO_UNIDADES
MOVWF PORTB ; Aca supongo que todo lo demas que no es dato esta en 0
BSF PORTB,2         ;catodo2
BCF FLAG,2      ; Activo el flag para que pase al otro display ( 1 )
        BCF FLAG,1 ; Desactivo el flag del timer
RETURN


TOMAR_DATOS

MOVF PORTA ;supongo que esta en el porta el dato en el nibble bajo
        ANDLW 0x0F              ; solo dejo pasar el nibble bajo
MOVWF DATO_A_ENVIAR   ; lo guardo en DATO_A_ENVIAR asi las demas subrutinas pueden usar el valor original que se tomo
        addlw    .256-.10       ; Procedo a pasarlo a BCD
        BTFSC    STATUS,C
        addlw    .6                 
        addlw    -(.256-.10)   ; Final del paso a BCD
        MOVWF UNIDADES     ; Utilizo al registro como un registro temporal.  UNIDADES = decenas:unidades
    SWAPF  UNIDADES,W  ; Cambio de lugar los nibbles    W = unidades:decenas
        ANDLW 0x0F             ; Elimino las unidades en W, me quedan las decenas ... W = 0:decenas
        MOVWF DECENAS       ; Guardo las decenas
        MOVF UNIDADES        ; Vuelvo a cargar todo el resultado del BCD -> decenas:unidades
        ANDLW 0x0F             ; Elimino las decenas   W = 0:unidades
        MOVWF UNIDADES     ; Guardo las unidades

ENVIAR

;ENVIAR_DATO                             ;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

    BTFSS TXSTA,TRMT                ; Pregunto por si esta libre el USART para mandar otro dato
    RETURN
    MOVF    DATO_A_ENVIAR
    ANDLW  0x0F
    SUBLW   .9
    BTFSC   STATUS,C ; Si esta en 0 es negativo, es decir 9 - DATO_A_ENVIAR = negativo o 9 < DATO_A_ENVIAR  , apartir de 10 se pondria C = 1
    GOTO    SUMO30

SUMOA      ; el dato no es cero por lo tanto sumo A
    MOVF    DATO_A_ENVIAR
    ADDLW   .55 ; 'A' - 10
    MOVWF TXREG      ;Cargo el valor asi se envia
    RETURN

SUMO30       ; el dato que llega es 0 entonces sumo 0x30 a dato a enviar
    MOVF    DATO_A_ENVIAR
    ADDLW   0x30
    MOVWF TXREG      ;Cargo el valor asi se envia
    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"

CLRF     FLAG
            MOVLW    .0
            MOVWF    UNIDADES
            MOVLW    .0
            MOVWF    DECENAS
            GOTO     MULTI

MULTI

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

DISP1


            BANKSEL UNIDADES
            MOVF    UNIDADES,0
            BANKSEL PORTB
            MOVWF   PORTB

            MOVLW   B'00000010'
            MOVWF   CONTADOR_DISPLAYS
            BSF     PORTB,7
            RETURN
DISP2
            BANKSEL DECENAS
            MOVF    DECENAS,0
            BANKSEL PORTB
            MOVWF   PORTB
            MOVLW   B'00000001'
            MOVWF   CONTADOR_DISPLAYS
            BSF     PORTB,6
            BCF FLAG,0
        RETURN

 END

Los registros ya están declarados en CBLOCK

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Re: Preguntas sobre assembler
« Respuesta #16 en: 10 de Febrero de 2015, 20:11:40 »
Lo único que se ve en los displays son dos ceros, el multiplexado esta bien, pero no me toma los datos que le mando desde las llaves y apenas es el principio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Preguntas sobre assembler
« Respuesta #17 en: 11 de Febrero de 2015, 02:50:02 »
- Bueno con el programa que me pasaste veo que en MOSTRAR_DISPLAYS. Usa las variables:    MOVF DATO_DECENAS y como dije la salida de mi codigo es DECENAS lo mismo ocurre para las unidades. Deberias cambiar los nombres de esas variables.

- El codigo que pase le falta el RETURN


- Por otra parte solo vi un pedacito de codigo y me encontre con esto:

Código: [Seleccionar]
MULTI

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

Si observas SALTO1 sea cual sea la condicion que le de el BTFSS ( si salta o no ) va a ir a DISP2 por lo tanto es lo mismo que si existiera una sola instruccion "GOTO DISP2" , tambien se puede elimitar el GOTO SALTO1  y un equivalente a lo que tenes realizado ahi es :

Código: [Seleccionar]
MULTI

            BTFSS    CONTADOR_DISPLAYS,0
            GOTO     DISP2
            GOTO     DISP1

No me fije si esta bien, solo vi ese detalle. Ahora que lo miro te eproximaste un poco mal al tema de los 0, no necesitas 2 variables ni nada por el estilo, es simplemente poner un 0 a la salida y activar/desactivar los catodos, sin necesidad de tratarlos como 2 displays (sino como 1 solo display). ya que los numeros son iguales.
« Última modificación: 11 de Febrero de 2015, 02:54:17 por KILLERJC »

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Re: Preguntas sobre assembler
« Respuesta #18 en: 11 de Febrero de 2015, 18:03:31 »
Citar
No me fije si esta bien, solo vi ese detalle. Ahora que lo miro te eproximaste un poco mal al tema de los 0, no necesitas 2 variables ni nada por el estilo, es simplemente poner un 0 a la salida y activar/desactivar los catodos, sin necesidad de tratarlos como 2 displays (sino como 1 solo display). ya que los numeros son iguales.

Bueno cuando tengas un tiempito mira el programa entero y me decís, parece largo pero no es tanto. Y ya arregle la parte que me dijiste

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Preguntas sobre assembler
« Respuesta #19 en: 11 de Febrero de 2015, 21:37:39 »
Bueno cuando tengas un tiempito mira el programa entero y me decís, parece largo pero no es tanto. Y ya arregle la parte que me dijiste

Son 274 lineas, 200 si no cuento espacios y algunos comentarios.

Supongo que la parte de enviar el dato funciona bien. Asi que quedan 2 cosas por hacer..

1- Limitar para cuando este la "animacion" de los ceros que la funcion "Mostrar display" y/o las demas funciones se ejecuten cuando este en marcha la animacion esa.
2- Hacer el programa para los ceros, eso es todo.

Suerte haciendolo :), seran 2 lineas para cada subrutina o unas 4 lineas si lo haces en la seccion principal para el punto 1. Y para el punto 2 imagino que no mas de 20 o por ahi cerca.

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Re: Preguntas sobre assembler
« Respuesta #20 en: 11 de Febrero de 2015, 21:50:29 »
Igualmente no me esta tomando los datos que le mando por las llaves, me tendría que mostrar el número enviado pero siempre son ceros

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Preguntas sobre assembler
« Respuesta #21 en: 11 de Febrero de 2015, 22:14:11 »
debuggealo... usa el stimulus/ o modifica los SFR ) del MPLAB
Paso a paso para ver que este bien el programa y responda como se debe ante cada entrada. Si entra en una seccion que no deberia entrar acorde a tus planes entonces ahi tenes un problema.
« Última modificación: 12 de Febrero de 2015, 13:24:17 por KILLERJC »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Preguntas sobre assembler
« Respuesta #22 en: 12 de Febrero de 2015, 10:13:28 »
Código: ASM
  1. ; *************** Toma de datos y conversion a BCD ********************
  2. ;
  3. ; Registro de entrada: PORTA 3:0
  4. ; Registros de salida: dato original: DATO_A_ENVIAR , BCD: UNIDADES, DECENAS
  5.  
  6. TOMAR_DATOS
  7.  
  8.         BANKSEL PORTA
  9.             MOVF PORTA,W                ;supongo que esta en el porta el dato en el nibble bajo
  10.         ANDLW 0x0F              ; solo dejo pasar el nibble bajo
  11.             MOVWF DATO_A_ENVIAR   ; lo guardo en DATO_A_ENVIAR asi las demas subrutinas pueden usar el valor original que se tomo
  12.         addlw    .256-.10       ; Procedo a pasarlo a BCD
  13.         BTFSC    STATUS,C
  14.         addlw    .6
  15.         addlw    -(.256-.10)   ; Final del paso a BCD
  16.         MOVWF UNIDADES     ; Utilizo al registro como un registro temporal.  UNIDADES = decenas:unidades
  17.             SWAPF  UNIDADES,W  ; Cambio de lugar los nibbles    W = unidades:decenas
  18.         ANDLW 0x0F             ; Elimino las unidades en W, me quedan las decenas ... W = 0:decenas
  19.         MOVWF DECENAS       ; Guardo las decenas
  20.         MOVF UNIDADES,W        ; Vuelvo a cargar todo el resultado del BCD -> decenas:unidades
  21.         ANDLW 0x0F             ; Elimino las decenas   W = 0:unidades
  22.         MOVWF UNIDADES     ; Guardo las unidades
  23.         RETURN
  24.  
  25.  
  26. ; *************** Realiza multiplexado en los displays ********************
  27. ;
  28. ; Registro de entrada: FLAG,2 (flag de displays) , FLAG,1(flag de tiempo), DECENAS y UNIDADES
  29. ; Registros de salida: PORTB 3:0 bits BCD al 4511, PORTB,4 catodo_unidades y PORTB,5 catodo_decenas
  30.  
  31.  
  32. MOSTRAR_DISPLAYS
  33.     BANKSEL PORTA
  34.         BTFSC FLAG,2            ; Con este indico que display estoy mostrando, si esta en 1 significa que es mi 2do display
  35.         GOTO  display2
  36.  
  37. display1
  38.         BTFSS FLAG,1            ; Espero hasta que pase el tiempo se ejecute la interrupcion y me habilite la flag sino sigo saliendo
  39.         RETURN
  40.         BCF  PORTB,4            ; apago catodo_unidades
  41.         MOVF DECENAS,W
  42.         MOVWF PORTB             ; Aca supongo que todo lo demas que no es dato esta en 0
  43.         BSF  PORTB,5            ; enciendo mi diplay de decenas
  44.         BSF FLAG,2              ; Activo el flag para que pase al otro display ( 2 )
  45.     BCF FLAG,1          ; Desactivo el flag del timer
  46.         RETURN
  47.  
  48. display2
  49.         BTFSS FLAG,1
  50.         RETURN
  51.         BCF  PORTB,5            ; apago catodo_decenas
  52.         MOVF UNIDADES,W
  53.         MOVWF PORTB             ; Aca supongo que todo lo demas que no es dato esta en 0
  54.         BSF PORTB,4         ; activo catodo_unidades
  55.         BCF FLAG,2              ; Activo el flag para que pase al otro display ( 1 )
  56.     BCF FLAG,1          ; Desactivo el flag del timer
  57.         RETURN
  58.  
  59.  
  60. ; *************** Enia datos por la UART ********************
  61. ;
  62. ; Registro de entrada: DATOS_A_ENVIAR
  63. ; Registros de salida: Ninguno
  64.  
  65.  
  66. ENVIAR
  67.  
  68.                                 ;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
  69.     BANKSEL TXSTA
  70.     BTFSS TXSTA,TRMT            ; Pregunto por si esta libre el USART para mandar otro dato
  71.     RETURN
  72.     BANKSEL PORTA
  73.     MOVF    DATO_A_ENVIAR,W
  74.     ANDLW    0x0F               ; Limito a 15 aunque ya lo hice en tomar_datos
  75.     SUBLW   .9
  76.     BTFSC   STATUS,C            ; Si esta en 0 es negativo, es decir 9 - DATO_A_ENVIAR = negativo o 9 < DATO_A_ENVIAR  , apartir de 10 se pondria C = 1
  77.     GOTO    SUMO30
  78.  
  79. SUMOA                           ; el dato no es cero por lo tanto sumo A
  80.     MOVF    DATO_A_ENVIAR,W
  81.     ADDLW   .55                 ; 'A' - 10
  82.     MOVWF   TXREG               ;Cargo el valor asi se envia
  83.     RETURN
  84.  
  85. SUMO30                          ; el dato que llega es 0 entonces sumo 0x30 a dato a enviar
  86.     MOVF    DATO_A_ENVIAR,W
  87.     ADDLW   0x30
  88.     MOVWF   TXREG               ;Cargo el valor asi se envia
  89.     RETURN
  90.  
  91.  
  92.  
  93. ; *************** Enia datos por la UART ********************
  94. ;
  95. ; Registro de entrada: FLAG,1 (flag de tiempo) y FLAG,0 (indicador de que algo llego)
  96. ; Registros de salida: Ninguno
  97.  
  98.  
  99. ANIMACION
  100.  
  101.     BTFSS FLAG,0                ;Pregunto si algo llego, sino no hago nada.
  102.     RETURN
  103.     RETURN
  104.  
  105.  
  106.  
  107.  
  108.  END

Hasta ahi funciona perfectamente a no ser que tengas algo mal en la rutina de interrupcion/configuracion. La parte de los ceros no esta realizada pero esta facil de hacer (y podes hacerlo de 2 formas, una que siga enviando por UART y la otra que solo haga la animacion).
Problemas que encontre en el codigo que te pase yo:

Faltaron unos BANKSEL
Faltaron un par de ,W en los MOVF ( asumi que los mandaba a W)

Eso me paso por hacerlo en el aire y no mirar el datasheet.

Por tu parte encuentro otras cosas.
TOMAR_DATOS usa los 4 primeros bits del PORTA, aun asi vos los configuraste como salidas.... si los tenes como salida y le pusiste un cero antes, vas a leer 0.
Tambien el que muestra en los displays usa el PORTB de 5:0 esos 6 bits que como se puede ver en el codigo que tenes esta como entradas algunos y no como salida.

Tu codigo:
Código: ASM
  1. MOVLW     B'11110000'
  2.         MOVWF     TRISA
  3.         MOVLW     B'00100111'
  4.         MOVWF     TRISB

Si no podes cambiar eso de orden vas a tener que mostrarlo en otros bits y eso queda pendiente de vos.
Suerte de ahora en adelante. Estudia el codigo, mira donde estas poniendo los datos, etc, no hagas un copy-paste.
« Última modificación: 12 de Febrero de 2015, 14:35:04 por KILLERJC »

Desconectado syndu

  • PIC10
  • *
  • Mensajes: 12
Re: Preguntas sobre assembler
« Respuesta #23 en: 15 de Febrero de 2015, 17:50:54 »
hola otra vez! gracias por ayuda! ya arregle lo que dijiste, ceo q lo solucione, sin embargo tengo un problema :( no me llega a 5v  la salida! apenas llega a 2,5 .... no se porque! quizas sea algo en el codigo :S espero puedan ayudarme! adjunto codigo!

Desconectado syndu

  • PIC10
  • *
  • Mensajes: 12
Re: Preguntas sobre assembler
« Respuesta #24 en: 15 de Febrero de 2015, 17:51:33 »
hola otra vez! gracias por ayuda! ya arregle lo que dijiste, ceo q lo solucione, sin embargo tengo un problema :( no me llega a 5v  la salida! apenas llega a 2,5 .... no se porque! quizas sea algo en el codigo :S espero puedan ayudarme! adjunto codigo!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Preguntas sobre assembler
« Respuesta #25 en: 15 de Febrero de 2015, 18:12:02 »
La solucion mas simple a para saber si es el programa es mirar con un osciloscopio el pin de salida, si cumple o no cuando le pedis el 100% de duty. Fijate en eso y luego si ves que no cumple con ese duty observamos el programa.

Desconectado syndu

  • PIC10
  • *
  • Mensajes: 12
Re: Preguntas sobre assembler
« Respuesta #26 en: 22 de Febrero de 2015, 16:32:29 »
La solucion mas simple a para saber si es el programa es mirar con un osciloscopio el pin de salida, si cumple o no cuando le pedis el 100% de duty. Fijate en eso y luego si ves que no cumple con ese duty observamos el programa.

listo, el problema era que no mostraba la componente completa DC de la salida del pic, ya sale los 5V.. ahora lo quedo resolver es como hacer que prenda mi led, rgb,, porque cuando conecto todo en fisico no me anda :S al parecer los led, me consumen voltaje, lo que hace que mi onda llegue a 2V.... otra cosa, a travez de la pc, debo enviarle valores a las variables, Var_C,Var_T, para cambiar de colores y hacer que dure un tiempo determinado.... la cosa es que no se como hacerlo, reviso y sale algo de como enviar txtos.... pero y quiero enviar numeros, o sea, crear un menu que me pida los valores de Var_C,Var_T para variar loc colores y los tiempos..... tengo el MAXr232, pero sinceramente solo se, que debo conectar el TX del DB9 al RX del pic y viceversa.... gracias por su ayuda, aca el codigo!


hola! mi preguta es la siguiente, como uedo enviar datos al pic desde la pc, lo que quiero es enviar por ejplo,mel numero 1, al cierta variable que tengo en mi programa, la idea es que a travez del teclado mande el numero 1 al pic, este lo guarde en la variable que quiero y luego haga lo que debe hacer.... tengo la tabla ASCII, pero la verdad no tengo mucha idea de como hacerlo. GRACIAS! mi pic es el 16f887 y trabajo en ASM....este el el codigo


;-----------------------------------------------------------------------------------------------------------
; Proyecto: Secuencia 16 colores
; Autor: Lab de digitales2
; Fecha: 2014-2015
; Micro: PIC16F887
; Clock: oscilador interno 4MHz
;-----------------------------------------------------------------------------------------------------------
list p=16f887
#include <p16f887.inc>
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
;------------------------------------------------------------------
;configuro inicio del programa con el vector reset/interrupcion
;************************************************* ****************
org 00H
goto inicio

org 04h
goto Interrupcion
;-----------------------------------------------------------------------
; Inicia Programa
; CONFIGURO I/O
;************************************************* *********************
inicio
;-------------------------------------------------------------------------
; Configuro Variables
;************************************************* ************************
CBLOCK 20H
pwm_r, pwm_v, pwm_a ; variables para saber si ya se cumplio mi Ton
W2, Status2 ; variables de respaldo
Var_1,Var_2,Var_3 ; variables para saber si ya se cumplieron los ciclos de trabajo
Var_C ; variable para saber en que color estoy
cont1 ; variable que decremento para saber si ya cumpli tiempo
Var_T ; esta variable se cargara con 1, para T=10ms, 2 para T=20ms... 200 para T=2s
ENDC
;---------------------------------------------------------------------
; configuro Interrupcion cada 40us
;************************************************* ********************
BANKSEL OPTION_REG
Movlw b'00000010'
Movwf OPTION_REG
Movlw b'10100000'
Movwf INTCON
BANKSEL ANSEL
clrf ANSELH
BANKSEL TRISD
clrf TRISB
BANKSEL PORTA
clrf PORTB
;-------------------------------------------------------------------------
; Defino pin de puertos
;************************************************* ************************
#Define Led_r PORTB,0
#Define Led_v PORTB,1
#Define Led_a PORTB,2

;--------------------------------------------------------------------------
; Pregunto la variable "Var_C" para ver en que color me encuentro, dependiendo del valor que tome Var_C decido en que color estar
;************************************************* *************************

Carga_duty
movf Var_C,W
addwf PCL, F
goto rojo
goto Azul
goto verde
goto amarillo
goto agua
goto magenta
goto orange
goto bonito
goto morado
goto marron
goto violeta
goto oscuro
goto verde1
goto rosado
goto verde2
goto blanco
;-------------------------------------------------------------------------
; Cargo las variables con los distintos dutys para generar
;los colores correspondientes
;************************************************* ************************

rojo
movlw .255
movwf pwm_r
movlw .0
movwf pwm_v
movlw .0
movwf pwm_a
goto Pregunto_Pwm

verde
movlw .0
movwf pwm_r
movlw .255
movwf pwm_v
movlw .0
movwf pwm_a
goto Pregunto_Pwm

Azul
movlw .0
movwf pwm_r
movlw .0
movwf pwm_v
movlw .255
movwf pwm_a
goto Pregunto_Pwm

amarillo
movlw .255
movwf pwm_r
movlw .255
movwf pwm_v
movlw .0
movwf pwm_a
goto Pregunto_Pwm
agua
movlw .0
movwf pwm_r
movlw .255
movwf pwm_v
movlw .255
movwf pwm_a
goto Pregunto_Pwm

magenta
movlw .255
movwf pwm_r
movlw .0
movwf pwm_v
movlw .255
movwf pwm_a
goto Pregunto_Pwm

orange
movlw .255
movwf pwm_r
movlw .140
movwf pwm_v
movlw .0
movwf pwm_a
goto Pregunto_Pwm

bonito
movlw .0
movwf pwm_r
movlw .250
movwf pwm_v
movlw .154
movwf pwm_a
goto Pregunto_Pwm

morado
movlw .147
movwf pwm_r
movlw .112
movwf pwm_v
movlw .219
movwf pwm_a
goto Pregunto_Pwm

marron
movlw .139
movwf pwm_r
movlw .69
movwf pwm_v
movlw .19
movwf pwm_a
goto Pregunto_Pwm

violeta
movlw .238
movwf pwm_r
movlw .130
movwf pwm_v
movlw .238
movwf pwm_a
goto Pregunto_Pwm

oscuro
movlw .25
movwf pwm_r
movlw .25
movwf pwm_v
movlw .112
movwf pwm_a
goto Pregunto_Pwm

verde1
movlw .46
movwf pwm_r
movlw .139
movwf pwm_v
movlw .87
movwf pwm_a
goto Pregunto_Pwm

rosado
movlw .220
movwf pwm_r
movlw .20
movwf pwm_v
movlw .60
movwf pwm_a
goto Pregunto_Pwm

verde2
movlw .144
movwf pwm_r
movlw .238
movwf pwm_v
movlw .144
movwf pwm_a
goto Pregunto_Pwm

blanco
movlw .255
movwf pwm_r
movlw .255
movwf pwm_v
movlw .255
movwf pwm_a
goto Pregunto_Pwm

;-------------------------------------------------------------------------
;Pregunto si ya cumplieron los ciclos de trabajo,
; configuro Interrupcion cada 40us
;************************************************* ********************
Pregunto_Pwm
movf Var_T,W ;cargo el valor necesario para generar los distintos
movwf cont1 ; tiempos de 10ms a 2s
BANKSEL TMR0
Movlw .251
Movwf TMR0
Pregunto_Pwm1
movf pwm_r,0
subwf Var_1,0
btfss STATUS,C
goto on_r
goto off_r
off_r
bcf Led_r
goto Pregunto_v
on_r
bsf Led_r
goto Pregunto_v

Pregunto_v
movf pwm_v,0
subwf Var_2,0
btfss STATUS,C
goto on_v
goto off_v
off_v
bcf Led_v
goto Pregunto_a
on_v
bsf Led_v
goto Pregunto_a

Pregunto_a
movf pwm_a,0
subwf Var_3,0
btfss STATUS,C
goto on_a
goto off_a
off_a
bcf Led_a
btfss PORTB,3
goto Pregunto_Pwm1
bcf PORTB,3
clrf Var_1
clrf Var_2
clrf Var_3
decfsz cont1 ;decremento contador, para saber si ya cumpli con mi tiempo
goto Pregunto_Pwm1
goto Carga_duty
on_a
bsf Led_a
btfss PORTB,3
goto Pregunto_Pwm1
bcf PORTB,3
clrf Var_1
clrf Var_2
clrf Var_3
decfsz cont1
goto Pregunto_Pwm1
goto Carga_duty

;--------------------------------------------------------------------
;rutina de interrupcion
;************************************************* *******************

Interrupcion
;---------------------------------------------------------------------
;guardamos registros importantes
;************************************************* ********************
movwf W2
movf STATUS,w
movwf Status2
;--------------------------------------------------------------------
;pregunto si Var_X llego a 255, si es si, la cargo a 0
;verifico si se cumplio el periodo correspondiente
;************************************************* ********************
incf Var_1,f
movlw .255
subwf Var_1,0
btfss STATUS,Z
goto Pregunto_var2
clrf Var_1
bsf PORTB,3
Pregunto_var2
incf Var_2,f
movlw .255
subwf Var_2,0
btfss STATUS,Z
goto Pregunto_var3
clrf Var_2
bsf PORTB,3
Pregunto_var3
incf Var_3,f
movlw .255
subwf Var_3,0
btfss STATUS,Z
goto inte
clrf Var_3
bsf PORTB,3
;-------------------------------------------------------------------
; devuelvo valor a w y status, tambien pongo en bajo Toif
;************************************************* ***************
inte
bcf INTCON,T0IF
Movlw .251
Movwf TMR0

movf Status2,w
movwf STATUS
movf W2,W
retfie
end

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Preguntas sobre assembler
« Respuesta #27 en: 22 de Febrero de 2015, 17:53:14 »
A la salida del PIC tendrias 5V o 0V, luego las caidas de tension del led es fija ( ejemplo 2V ) y lo demas deberia caer sobre la resistencia de ese led. No se que estas midiendo vos si la caida de tension del diodo o desde el pin del PIC

Por el tema de conectarlo a la PC lo haces por el UART, tenes que configurar todos los registros ( los baudios, polaridad, etc etc ) y configuras para que cuando reciba un dato active una interrupcion. Luego desde la PC le envias caracteres ASCII. esto no complica mucho, ya que si te fijas los numeros solo se le suman 0x30 hexa...

Es decir si recibis un 0x38 en la PC se escribio 8

Luego haces lo que quieras con todo lo que recibis. Por ejemplo recibir 3 caracteres y eso guardarlo en rojo, luego 3 mas y en azul y asi. lo que llega queda en un registro llamado RCREG.

Con respecto a la parte fisica busca por internet PIC MAX232 y seguro que encontras los circuitos para eso.

Tal ves esto te sirva de ejemplo:
http://www.oz1bxm.dk/PIC/628uart.htm
« Última modificación: 22 de Febrero de 2015, 18:32:00 por KILLERJC »

Desconectado syndu

  • PIC10
  • *
  • Mensajes: 12
Re: Preguntas sobre assembler
« Respuesta #28 en: 22 de Febrero de 2015, 21:40:02 »
A la salida del PIC tendrias 5V o 0V, luego las caidas de tension del led es fija ( ejemplo 2V ) y lo demas deberia caer sobre la resistencia de ese led. No se que estas midiendo vos si la caida de tension del diodo o desde el pin del PIC

Por el tema de conectarlo a la PC lo haces por el UART, tenes que configurar todos los registros ( los baudios, polaridad, etc etc ) y configuras para que cuando reciba un dato active una interrupcion. Luego desde la PC le envias caracteres ASCII. esto no complica mucho, ya que si te fijas los numeros solo se le suman 0x30 hexa...

Es decir si recibis un 0x38 en la PC se escribio 8

Luego haces lo que quieras con todo lo que recibis. Por ejemplo recibir 3 caracteres y eso guardarlo en rojo, luego 3 mas y en azul y asi. lo que llega queda en un registro llamado RCREG.

Con respecto a la parte fisica busca por internet PIC MAX232 y seguro que encontras los circuitos para eso.


Tal ves esto te sirva de ejemplo:
http://www.oz1bxm.dk/PIC/628uart.htm


o sea, que si yo quiero enviar a la variable Var_C un 1. debo preguntar por 5 bits, para ver si es Var_C, luego si es si, pregunto por el bits 6 que serie el valor, en este caso un 1??
y gracias!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Preguntas sobre assembler
« Respuesta #29 en: 22 de Febrero de 2015, 22:36:28 »
No, vos recibis de a 1 byte.

Si vos de la PC mandas esto: "12"

recibirias 2 bytes, 0x31 y 0x32

Luego cuando recibas podes hacer que el primer numero vaya a Var_C o que ambos numeros los convertis en binario y alamacenas en Var_C


 

anything