Autor Tema: pequeños proyectos  (Leído 55106 veces)

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

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #45 en: 27 de Noviembre de 2009, 11:15:47 »
aqui en españa los pic que mas se han usado son los 12c508,16f84 y 16f876.

el 12c508 era por el pirateo de las PS ONE.
y los 16f84 y los 16f876 por las targetas decodificadoras del C+ o viadigital.

el consumo de microchips esta basado en las necesidades de su utilizacion.y es un negocio muy grande para los fabricantes.
nunca se sabe que chip sera el proximo en hacerse famoso.solo hace falta una aplicacion lo suficientemente atractiva para que un usuario
que ni siquiera tiene idea de lo que son estos chips, dispare la venta de estos.y quizas la venta de estos bajen el precio.
aunque sea para un uso ilegal.   como dice el reflan. no hay mal que por bien no venga. :lol:

cual sera el proximo invento :?:



Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: pequeños proyectos
« Respuesta #46 en: 27 de Noviembre de 2009, 13:25:45 »
No tardarán en sacar algo para ver Gol TV  :D

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #47 en: 27 de Noviembre de 2009, 18:16:33 »
la verdad es que no me gusta nada el futbol.pero garcias a el descubri el potencial de los PICs. :)
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: pequeños proyectos
« Respuesta #48 en: 27 de Noviembre de 2009, 19:31:59 »
Yo aquí por Bolivia no vi ningún pic de gama baja, ni para comprar ni nadie que se trajera uno.
Si los tuviera por aquí y fueran baratos, ya los estaría exprimiendo hasta el último bit de memoria.

Por el momento lomas barato que puedo conseguir es un 16f628 aunque ya pasa tiempo de la última ves que pregunte y tal ves ya ni lo tienen.
También no esta demás decir que el 16f84 me parece muy mala inversión, pero para aprender yo creo que esta bien porque existen muchos ejemplos para este pic.
Hola Jojojorge5, creo que para aprender se puede aprender con casi cualquier micro 16Fxxx, y estoy totalmente de acuerdo contigo en que el 84a es una pésima inversión, el 628 es más barato y mejor.

Pero te cuento que he visto que existe a la venta un micro de 8pines el 12F675, que es un micro muy bueno para ser pequeño, también tengo algunos ejemplares jaja, si no me equivoco está entre 20 y 25 Bs al menos por aquí en Cocha.

saludos.
.

Desconectado JOJOJORGE5

  • PIC16
  • ***
  • Mensajes: 167
Re: pequeños proyectos
« Respuesta #49 en: 28 de Noviembre de 2009, 22:40:49 »
Hola Cryn.

entonces creo que me comprare uno para renegar un poco por la falta de recursos :D

aunque viendo el datasheet no esta del todo mal.

salu2:)

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: pequeños proyectos
« Respuesta #50 en: 01 de Diciembre de 2009, 12:19:15 »
Os dejo un proyectito que hice donde utilizo el 16f819 para un cuadro eléctrico especial. Es un cuadrito para subir o bajar 2 plataformas elevadoras.
Y para que utilizo un pic? Para evitar que pueda subir y bajar a la vez y me ahorro los contactos NC que impiden que puedas hacer esta maniobra funesta. A su vez y por ser una plataforma hidráulica debo activar un contactor para un motor eléctrico unos segundos antes de activar la electroválvula de subida (la de bajada no lleva motor eléctrico sino solo la electroválvula.)
No me lío mas, seguramente nunca vayais a utilizar mi programa tal cual porque es muy específico pero lo interesante es que para hacer el temporizador ajustable entre 0 y 2-3 segundos he utilizado la entrada ADC con un potenciómetro de 10k.
Tomo la lectura del pote, la guardo en una variable que será la que me indique que cantidad de veces debe repetir el bucle de demora. Facil, no?

; EL MICRO ESCANEA LOS PULSADORES DE SUBIR Y BAJAR PLATAFORMAS Y
; TEMPORIZA LA SALIDA CORRESPONDIENTE . EL TIEMPO PODRA AJUSTARSE
; POR MEDIO DE UN POTENCIOMETRO CONECTADO A LA ENTRADA ADC DEL MICRO.


   list      p=16f819           ; list directive to define processor
   #include <p16F819.inc>        ; processor specific variable definitions
   errorlevel  -302              ; suppress message 302 from list file

   __CONFIG   _CP_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _CCP1_RB2 & _DEBUG_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _WDT_OFF & _PWRTE_ON & _INTRC_IO



   Cblock 0x20
PDel0
PDel1
PDel2
PDel3
FLAG
timer1

   endc

;SALIDAS
#define EV1S   PORTB,0      ; SALIDA ELECTROVÁLVULA #1 SUBIR
#define EV1B   PORTB,1    ; SALIDA ELECTROVÁLVULA #1 BAJAR
#define EV2S   PORTB,2      ; SALIDA ELECTROVÁLVULA #2 SUBIR
#define EV2B   PORTB,3      ; SALIDA ELECTROVÁLVULA #2 BAJAR
#define K1      PORTB,4      ; SALIDA CONTACTOR MOTOR ELECTRICO

;ENTRADAS

#define S1      PORTA,1      ; ENTRADA SUBIR PLATAFORMA 1
#define B1      PORTA,2      ; ENTRADA BAJAR PLATAFORMA 1
#define S2      PORTA,3      ; ENTRADA SUBIR PLATAFORMA 2
#define B2      PORTA,4      ; ENTRADA BAJAR PLATAFORMA 2

;BANDERAS
#define S1F      FLAG,0  
#define S2F      FLAG,1
#define B1F      FLAG,2

      ORG     0x000       ; processor reset vector
      goto    Inicio

Inicio
      clrf    PORTB
      CLRF    PORTA          
      bsf    STATUS,RP0
      movlw    b'00000000'
      movwf    TRISB
      movlw    b'10000000'
      movwf    OPTION_REG   ; prescaler 8 para TMR0
                     ; pullups desactivadas
      movlw     b'01100000'
      movwf    OSCCON
      MOVLW    b'00001110'   ; Configure all pins
      MOVWF    ADCON1       ; as digital inputs
      MOVLW    b'11111111'      ; Value used to
      MOVWF    TRISA       ; Set RA<7:0> as inputs
      bcf    STATUS,RP0
      clrf    PORTB
      CLRF    FLAG
      movlw    b'11000000'
      movwf   ADCON0

MAIN
call delay20
TESTSUBIR1
      BTFSS   S1         ; ESTÁ PULSADO SUBIR PLATAFORMA 1?
      GOTO    JUMP1      ; NO, VAMOS A LIMPIAR Y SEGUIR
call delay20
      BTFSC    S1F         ; FLAG DE S1 ACTIVO ?
      GOTO    AVERS2      ; TESTSUBIR1;TESTSUBIR2   ; SI, SALTEAMOS
      BSF    K1         ; NO, ACTIVAMOS CONTACTOR DE MOTOR
      BSF    S1F         ; ACTIVAMOS FLAG PARA NO REPETIR
      CALL    DELAYADC   ; DEMORA (SUSTITUIR POR TEMPO CON ADC)
      BSF      EV1S      ; AHORA ACTIVAMOS LA ELECTROVALVULA DE SUBIR
      GOTO    MAIN      ; Y VOLVEMOS A EXPLORAR
JUMP1   
      BCF    S1F         ; LIMPIAMOS FLAG
      BCF    EV1S      ; DESACTIVAMOS ELECTROVALVULA DE SUBIR

TESTSUBIR2
      BTFSS   S2         ; ESTÁ PULSADO SUBIR PLATAFORMA 1?
      GOTO    JUMP2      ; NO, VAMOS A LIMPIAR Y SEGUIR
call delay20
      BTFSC    S2F         ; FLAG DE S1 ACTIVO ?
      GOTO    AVERS1      ; SI, SALTEAMOS
      BSF    K1         ; NO, ACTIVAMOS CONTACTOR DE MOTOR
      BSF    S2F         ; ACTIVAMOS FLAG PARA NO REPETIR
      CALL    DELAYADC   ; DEMORA (SUSTITUIR POR TEMPO CON ADC)
      BSF      EV2S      ; AHORA ACTIVAMOS LA ELECTROVALVULA DE SUBIR
      GOTO    MAIN      ; Y VOLVEMOS A EXPLORAR
JUMP2   
      BCF    S2F         ; LIMPIAMOS FLAG
      BCF    EV2S      ; DESACTIVAMOS ELECTROVALVULA DE SUBIR
      BCF      K1         ; DESCONECTAMOS MOTOR
TESTBAJAR1
      BTFSS   B1         ; ESTA PULSADO BAJAR PLATAFORMA 1?
      GOTO    EV1BOFF      ; NO, MIRAMOS SI ESTA PULSADO BAJAR 2
call delay20
      BTFSC   B1F
      GOTO    TESTBAJAR2
      BSF      B1F
      BSF      EV1B      ; SI, ACTIVAMOS ELECTROVALVULA DE BAJAR 1
   
TESTBAJAR2
      BTFSS   B2         ; ESTA PULSADO BAJAR PLATAFORMA 2?
      GOTO    EV2BOFF      ; NO, VOLVEMOS AL PRINCIPAL
call delay20
      BSF      EV2B      ; SI, ACTIVAMOS ELECTROVALVULA DE BAJAR 2
      GOTO   TESTBAJAR1   ; VOLVEMOS AL PRINCIPAL


EV1BOFF
      BCF    EV1B
      BCF    B1F
      GOTO    TESTBAJAR2

EV2BOFF
      BCF    EV2B
      BTFSC   B1F
      GOTO    TESTBAJAR1
      GOTO    MAIN

AVERS1
      BTFSS   S1
      GOTO    LIMPIARS1
call delay20
      BSF      EV1S
      GOTO    TESTSUBIR2
LIMPIARS1
      BCF    EV1S
      GOTO    TESTSUBIR2

AVERS2
      BTFSS   S2
      GOTO    LIMPIARS2
call delay20
      BSF      EV2S
      GOTO    TESTSUBIR1
LIMPIARS2
      BCF    EV2S
      GOTO    TESTSUBIR1

; Aqui comienza la conversión AD
DELAYADC
      clrf    timer1; Limpio la variable
   
      bsf    ADCON0,ADON ; activo el conversor AD
start
      bsf      ADCON0,GO ; Y lo inicio
waiting
      btfsc   ADCON0,GO ; Espero termine la conversión
      goto   waiting
      movf   ADRESH,W   ; Muevo el resultado al acumulador
      btfsc    STATUS,Z    ; Y si es 0 entonces no temporizo
      goto    salida
      movwf   timer1 ; Muevo el acumulador a la variable

start3
      call    DEMORA      ; Llamo una demora
      decfsz   timer1,1  ; Y la repito tantas veces como lo indique la variable donde guardé la lectura del AD
      goto   start3               ; Volvemos al loop hasta terminar
salida
      bcf    ADCON0,ADON  ; Hemos terminado la temporización, desactivamos el ADC para que no consuma
      RETURN
               ; Y volvemos al menu
      


DEMORA  movlw     .5         ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel1,1   ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,1   ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  goto PDelL3         ; 2 ciclos delay
PDelL3  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.

delay20  movlw     .21       ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
aPLoop1  movlw     .237      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
aPLoop2  clrwdt              ; 1 clear watchdog
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      aPLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      aPLoop1    ; 2 no, loop
aPDelL1  goto aPDelL2         ; 2 ciclos delay
aPDelL2  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.


END
« Última modificación: 01 de Diciembre de 2009, 12:31:24 por pibe »
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: pequeños proyectos
« Respuesta #51 en: 01 de Diciembre de 2009, 12:46:20 »
Uno de mis proyectos más complejos fué una caja negra para una grúa , donde se grababan los eventos que ocurrían durante el día , meses y durante los años.
Para ello tuve que probarla en laboratorio antes de lanzarla al mercado y claro, no podía estar dias y dias dándole al mando de la grua para que me grabara los datos correspondientes!
Y me dije: Por qué no hacer una placa con un 16f877 y que me genere "pulsaciones" al azar y con una duración de tiempo al azar también? Y por que no una pausa sin pulsaciones al azar tambien?
Tenía 14 pulsadores o entradas, de la cuales 2 de ellas no debían presentarse tan a menudo. Vamos, que esas 2 entradas eran casos extraños.
Y como lo hago?
Busqué generación de nùmeros aleatorios y me encontré con el problema que al cabo de un tiempo estos números se repetían, o sea que eran "seudo azar". No me servía.
Y si utilizo la entrada AD y la conecto a una entrada alterna y muestreo cada X tiempo? Lo hice (tonto de mi) porque claro, el X tiempo era siempre el mismo el muestreo era por lo tanto siempre el mismo.
Vaya...
Desconecto por casualidad la alimentación alterna a la entrada AD , y voilá ! Muestreos al azar!!!
El ruido o simplemente por dejar el pin adc flotante me daba las lecturas que buscaba!

El resto fué coser y cantar.

Al igual que mi programa anterior, es dificil sino imposible que algún dia tengais que utilizar este programa para la misma aplicación. Pero sirve para demostrar que los numeros COMPLETAMENTE al azar son posibles !
Solo debereis utilizar el resultado obtenido de la conversión AD y hacer con ello lo que os plazca!

Os dejo el programa:

; PROBADOR DATALOGGER
; GENERADOR DE SALIDAS Y TIEMPOS AL AZAR POR PUERTOS B Y D

      List   p=16F877A   ;Tipo de procesador
   #include <p16f877a.inc>   ;processor specific definitions
      __config  _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_OFF & _LVP_OFF & _BODEN_OFF

   ERRORLEVEL -302      ;suppress "not in bank 0" message
   ERRORLEVEL -203      ;suppress  message
   ERRORLEVEL -305      ;suppress  message
   ERRORLEVEL -205      ;suppress  message

      cblock 0x20
RANDOM
RANDOMINC      ;variable para guardar el numero random para seleccionar la incidencia (anemometro, FS, BT)


PDel0   
PDel1
PDel2

temp


w_temp            ; variable used for context saving
status_temp         ; variable used for context saving
pclath_temp         ; variable used for context saving            
      endc

#define tempoflag  FLAG,0
#define toggle    FLAG,1 ; on/off de temperatura media

#define SUBIR   PORTB,7
#define BAJAR   PORTB,6
#define ELEV2   PORTB,5
#define ELEV3   PORTB,4
#define GD   PORTB,3
#define GI   PORTB,2
#define GIRO2   PORTB,1
#define GIRO3   PORTB,0

#define CAD  PORTD,6
#define CAT  PORTD,5
#define CARRO2  PORTD,4
#define CARRO3  PORTC,7

#define ANE  PORTD,1

#define FS  PORTC,3


      org   0x00      ;Vector de Reset
      goto   Inicio

;Programa principal

Inicio   
      movlw   0x07      ;deshabilitar-
      movwf   CMCON      ;-comparadores
        clrf   PORTB      ;Desconecta salidas
      clrf   PORTA
      clrf    PORTC
      clrf    PORTD
      bsf       STATUS,RP0   ;Selecciona banco 1
      
      movlw   0
      movwf   TRISB      ;
      movlw   b'00000010'
      movwf   TRISC      ;
      movlw   0
      movwf    TRISD
   ;   movwf   TRISE
      movlw   b'11000111'
      movwf   OPTION_REG   ;Preescaler de 128 asociado al WDT
      bcf      STATUS,RP0   ;Selecciona banco 0





;===========================================================================
;      Inicio de conversion de valores analogicos
;===========================================================================


;---------------------Configuracion CONVERTIDOR A/D-------------------------
CFGADC   
      bsf      STATUS,RP0   ;Banco 1
      bcf      STATUS,RP1
      movlw   b'00001110'; b'00000101'   ;seleccion tipo puertos A/D,
      movwf   ADCON1
      movlw   b'00000001'
      movwf   TRISA      ;RA0 in
      movlw    0 ;PORTE como SALIDA
      movwf    TRISE
      bcf      STATUS,RP0   ;Banco 0
      movlw   b'01000001'   ;seleccion Tad, canales para
      movwf   ADCON0      ;conversion y A/D=ON
      bcf      PIR1,ADIF   ;limpia flag de conversion completa



   
MAIN_LOOP
      CLRF PORTB
CLRF PORTD
CLRF PORTC
CLRF PORTE

      
MANIOBRA
;LLAMADA RUTINA GENERACION VALOR AL AZAR ENTRE 0 Y 3
CALL ROL4

;SI DIO 1 ENTONCES ES C+E, C o E
MOVF RANDOM,W
XORLW .1
BTFSC STATUS,Z
GOTO ES_1

;SI DIO 2 ENTONCES ES C+G, C o G
MOVF RANDOM,W
XORLW .2
BTFSC STATUS,Z
GOTO ES_2

;SI DIO 3 ENTONCES ES E+G, E o G
MOVF RANDOM,W
XORLW .3
BTFSC STATUS,Z
GOTO ES_3

;SI DIO 0 ENTONCES NO HACEMOS NADA
GOTO SALIDA



;RUTINA MANIOBRAS ELEV+CARRO, ELEVACION SOLO O CARRO SOLO
ES_1
;ROL 4 PARA VER QUE VELOCIDAD LLEVA
CALL RUTINA_ELEVACION
CALL RUTINA_CARRO
GOTO SALIDA

ES_2
;RUTINA MANIOBRAS GIRO+CARRO, GIRO SOLO O CARRO SOLO
CALL RUTINA_GIRO
CALL RUTINA_CARRO
GOTO SALIDA

ES_3
;RUTINA MANIOBRAS GIRO+ELEV, GIRO SOLO O ELEV SOLO
CALL RUTINA_ELEVACION
CALL RUTINA_GIRO
GOTO SALIDA


SALIDA
CALL ADC_INC
CALL TEMPORIZACION
GOTO MAIN_LOOP

RUTINA_ELEVACION
;MIRAMOS SI ES 3º VELOCIDAD
CALL ROL4
MOVF RANDOM,W
XORLW .3
BTFSS STATUS,Z
GOTO ELEVAC2
BSF ELEV2
BSF ELEV3
GOTO SUBIROBAJAR

;MIRAMOS SI ES 2º VELOCIDAD
ELEVAC2
MOVF RANDOM,W
XORLW .2
BTFSS STATUS,Z
GOTO ELEVAC1
BSF ELEV2
GOTO SUBIROBAJAR

;MIRAMOS SI ES 1º VELOCIDAD
ELEVAC1
MOVF RANDOM,W
XORLW .1
BTFSS STATUS,Z
RETURN

;mIRAMOS SI ES SUBIR O BAJAR
SUBIROBAJAR
CALL ROL2
BTFSS RANDOM,0
GOTO ESBAJAR
BSF SUBIR
RETURN

ESBAJAR
BSF BAJAR
RETURN



RUTINA_CARRO
;ROL 4 PARA VER QUE VELOCIDAD LLEVA
CALL ROL4

;MIRAMOS SI ES 3º VELOCIDAD
CARRO_3
MOVF RANDOM,W
XORLW .3
BTFSS STATUS,Z
GOTO CARRO_2
BSF CARRO2
BSF CARRO3

GOTO CADOCAT

;MIRAMOS SI ES 2º VELOCIDAD
CARRO_2
MOVF RANDOM,W
XORLW .2
BTFSS STATUS,Z
GOTO CARRO_1
BSF CARRO2
GOTO CADOCAT

;MIRAMOS SI ES 1º VELOCIDAD
CARRO_1
MOVF RANDOM,W
XORLW .1
BTFSS STATUS,Z
RETURN

;mIRAMOS SI ES SUBIR O BAJAR
CADOCAT
CALL ROL2
BTFSS RANDOM,0
GOTO ESCAD
BSF CAT
RETURN

ESCAD
BSF CAD
RETURN


RUTINA_GIRO
;MIRAMOS SI ES 3º VELOCIDAD
CALL ROL4
MOVF RANDOM,W
XORLW .3
BTFSS STATUS,Z
GOTO GIRO_2
BSF GIRO2
BSF GIRO3
GOTO GDOGI

;MIRAMOS SI ES 2º VELOCIDAD
GIRO_2
MOVF RANDOM,W
XORLW .2
BTFSS STATUS,Z
GOTO GIRO_1
BSF GIRO2
GOTO GDOGI

;MIRAMOS SI ES 1º VELOCIDAD
GIRO_1
MOVF RANDOM,W
XORLW .1
BTFSS STATUS,Z
RETURN

;mIRAMOS SI ES GD O GI
GDOGI
CALL ROL2
BTFSS RANDOM,0
GOTO ESGD
BSF GI
RETURN

ESGD
BSF GD
RETURN


;ADC PARA INCIDENCIAS
ADC_INC
CALL RUN_ADC
ANDLW 0X0F
MOVWF RANDOMINC

btfsC STATUS,Z ;si las divisiones dio 0 entonces SEGUIMOS
RETURN
movf  RANDOMINC,W
XORLW .6
BTFSC STATUS,Z
BSF ANE
movf  RANDOMINC,W
XORLW .12
BTFSC STATUS,Z
BSF FS
RETURN


TEMPORIZACION
call demora_150ms
RETURN



;---------------------------------------------------------------------------

RUN_ADC   
   
      bcf      STATUS,RP0   ;Banco 0
      bcf      STATUS,RP1   ;Banco 0
      movlw   b'11000001'   ;repone a cero para que iorlw pueda
      movwf   ADCON0
      bcf      PIR1,ADIF   ;limpia flag de conversion completa
      nop
      nop

GO_ADC   
      bsf      ADCON0,GO_DONE   ;Inicio conversion

wait_ADC
      btfsc   ADCON0,GO_DONE   ;espera a que finalice la conversion
      goto   wait_ADC   ;bucle
      movlw   b'11000000'   ;repone a cero para que iorlw pueda
      movwf   ADCON0

READ_OK      ;La conversion esta en ADRESH:ADRESL
      movf   ADRESH,W
      return


      
demora_150ms
CALL RUN_ADC
MOVWF PDel0
btfsC STATUS,Z ;si las divisiones dio 0 entonces repetimos
GOTO demora_150ms
            
PLoop0_     movlw           .255      
           movwf           PDel1    
PLoop1_     movlw           .255  
           movwf           PDel2    
PLoop2_     nop                
           decfsz          PDel2, 1
           goto            PLoop2_  
           decfsz          PDel1,  1
           goto            PLoop1_  
             decfsz          PDel0,  1
           goto            PLoop0_  
PDelL1_     goto          PDelL2_      
PDelL2_     nop                
           return

ROL4
CALL RUN_ADC
ANDLW 0X03
MOVWF RANDOM
RETURN

ROL2
CALL RUN_ADC
ANDLW 0X01
MOVWF RANDOM
RETURN

   end         ;Fin del programa fuente


« Última modificación: 01 de Diciembre de 2009, 12:55:41 por pibe »
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #52 en: 01 de Diciembre de 2009, 18:09:27 »
todos los programas son bienvenidos.en todos ellos de aprende algo.por ejemlo para este subprograma.por ejemplo has usado las instrucciones decfsz.para hacer un retardo.



DEMORA  movlw     .5         ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel1,1   ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,1   ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  goto PDelL3         ; 2 ciclos delay
PDelL3  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.

/quote]

yo casi siempre uso temporizaciones como esta:

pausa1         clrf   AUX2
pausae3         clrf   AUX1
pausae2         clrf   AUX0
pausae         incf   AUX0,f
            btfss   AUX0,7
            goto   pausae

            incf   AUX1,f
            btfss   AUX1,4
            goto   pausae2      
            incf   AUX2,f;
            btfss   AUX2,0      ;cambiar a 1;      
            goto   pausae3   ;      
            retlw   0x00   

uso mas la instruccion btfsc. no se cual sistema consume menos recursos.no me ha dado tiempo a comprobarlo. :D
perdon por no hacer bien la cita.pero nunca me aclaro con estas herramientas de los foros
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: pequeños proyectos
« Respuesta #53 en: 01 de Diciembre de 2009, 18:38:16 »
No es ni mas ni menos que una rutinita generada por el clásico programa de demoras. No me pongo a ver si consume 1 o dos ciclos. Generalemente me gusta ir sobrado de micro en los proyectos que hago.
 Mas vale mas que menos y lamentarse luego :P

Lo que tu haces es incrementar un contador, yo en cambio lo decremento y cuando llega a 0 saltea la proxima instrucción. Lo mismo pero con distinto olor :)
Igualmente ambas instrucciones tardan lo mismo, cada vez que comparas y saltas a la proxima instruccion son 2 ciclos.
« Última modificación: 01 de Diciembre de 2009, 18:40:50 por pibe »
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: pequeños proyectos
« Respuesta #54 en: 01 de Diciembre de 2009, 19:11:43 »
Con respecto a cual usa más recursos, las dos ocupan el micro y no se puede hacer nada más. Después respecto al uso de memoria de programa, contando las lineas que usan cada una para una misma temporización se van a dar cuenta  :mrgreen:

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #55 en: 11 de Diciembre de 2009, 23:21:48 »
bueno.seguimos implementando usarts por software.
ahora utilizare el 16F84 y usare sus interupciones.he intentado exponerlo con el comando code.pero salen las lineas desordenadas.
no se como hacerlo :(


;*****************************************www.ingeniopic.com***************************+******
; PROGRAMA : usart_16F84
; Funcion : recepcion de datos serie 
;           
;   
;  Revision : 1.0        12/12/2009            Programa para : PIC16F84
; CPU Clock : 4 MHz o 20Mhz                   Reloj instruccion :
;       WDT : Deshabilitado                  Tipo de reloj : XT
; Code Prot : OFF           
;*****************************************www.ingeniopic.com**********************************
;
;NOTAS:   este programa esta preparado para interrumpir el funcionamiento del programa programa principal para atender
;       una interrupcion por recepcion de datos provenientes de una usart.la velocidad de la usart podemos modificarla
;       cambiando el valor del registro BAUDRATE.que esta un poco mas abajo de la etiqueta INICIO.cuanto mayor sea la velocidad.mayor sera el margen de error.
;       el dato que recivamos por PB0 sera transmitido por PB1.
;      

      LIST   P=16F84   ;Se indica el modo de procesador
     
      RADIX   HEX      ;Sistema de numeracion hexadecimal

      INCLUDE   "P16F84.inc"   
     
               ;registros internos
      __CONFIG   _XT_OSC & _CP_OFF & _WDT_OFF

      ERRORLEVEL      -302


            CBLOCK    0x0C
            CONTADOR
            DATO
            BAUDRATE

            W_TEMP
            STATUS_TEMP
            PCLATH_TEMP
            ENDC


      
PUSH    MACRO               ;macro para salvar registros antes de una llamada a interrupcion   
        movwf   W_TEMP               
        swapf   STATUS,W
        movwf   STATUS_TEMP         
        clrf    STATUS               
        movfw   PCLATH               
        movwf   PCLATH_TEMP
        clrf    PCLATH
        ENDM

POP     MACRO               ;macro para restaurar registros   despues de una llamada a interrupcion
        movfw   PCLATH_TEMP         
        movwf   PCLATH
        swapf   STATUS_TEMP,W     
        movwf   STATUS
        swapf   W_TEMP,F         
        swapf   W_TEMP,W
        ENDM

      
      #define BANK0      bcf   STATUS,RP0
      #define BANK1      bsf STATUS,RP0
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
               ORG      0x00            ;Inicio en el Vector de Reset
              goto   INICIO            ;Va a la primera instruccion del programa
;<<<<<<---------------------- VECTOR DE INTEUPCIONES ------------------------>>>>>>>
               ORG      0x04            ;Inicio en el Vector de Reset
              goto   INTERRUPCIONES            ;Va a la primera instruccion del programa


;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO         BANK1
            movlw   b'10000000'      ;activar interrupcion por cambio de estado a 0 de RB0
            movwf   OPTION_REG
            movlw   b'10010000'      ;configura interrupcion por desbordaminto de TMR0 y  por cambio de estado a 0 de RB0
            movwf   INTCON
            movlw   b'00010001'      ;habilita interrupcion por cambio de estado en RB0/INT
            movwf   TRISB
            BANK0
            bsf      PORTB,1         ;establecer la salida usart a 1
            movlw   d'15'         ;valor para la velocidad de la usart
            movwf   BAUDRATE
            ;valores para el baudrate:para 4Mhz
            ;
            ;para divisor TMR0=000
            ;190=2400bps, 90=4800bps, 40=9600bps, 15=19200bps,
            ;
            ;para divisor TMR0=010
            ;97=1200bps,
            ;
            ;valores para el baudrate:para 20Mhz
            ;
            ;para divisor TMR0=000
            ;51=38400,31=57600.
         
;<<<<<<<------------------------------------------------PROGRAMA PRINCIPAL---------------------------------------->>>>>>>>>>>>>>         
PRINCIPAL      NOP
            
            goto   PRINCIPAL
            
;<<<<<<---------------------------------------------SUBPROGRAMA RECEPCION DE DATOS--------------------------
            
RECEPCION      clrf   CONTADOR      ;borra el contador de bits
            clrf   TMR0         ;borra TMR0
            movfw   BAUDRATE      ;carga valor del baudrate en w
            subwf   TMR0,w         ;comprueva si ha llegado al valor o se pasa
            btfss   STATUS,C      ;si es menos sigue comprovando
            goto   $-3
            
COMP1         clrf   TMR0         ;borra TMR0
COMP2         movfw   BAUDRATE      ;carga valor del baudrate en w
            subwf   TMR0,w         ;resta el contenido de TMR0 con el de w(comprovacion => )
            btfss   STATUS,C      ;comprueva si ha llegado al valor o se pasa
            goto   COMP2         ;si es menos sigue comprovando

            bcf      PORTB,2
            bsf      PORTB,2
            
            btfsc   PORTB,0         ;comprueva el estado del pin de entrada
            call   UNO            ;si es 1 salta a UNO
            btfss   PORTB,0         ;comprueva el estado del pin de entrada
            call   CERO         ;si es 0 salta a CERO

            incf   CONTADOR,F      ;incrementa el contador de bits
            movlw   0x08         ;valor de bit a comprovar
            xorwf   CONTADOR,W      ;hacer xor con CONTADOR
            btfss   STATUS,Z      ;comprueva si es igual
            goto   COMP1         ;si no es igual sigue las comprobaciones
            movfw   DATO         ;carga el dato recivido en w
            return               ;retorno de subprograma RECEPCION

UNO            rrf      DATO,F         ;rota a la derecha una posicion   
            bsf      DATO,7         ;pon a 1 el bit 7 del registro DATO
            return         ;retorna

CERO         rrf      DATO,F         ;rota a la derecha una posicion
            bcf      DATO,7         ;pon a 0 el bit 7 del registro DATO
            return         ;retorna
            
         
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<SUBPROGRAMA DE ENVIO DE DATOS>>>>>>>>>>>>>>>>>      

   
ENVIO         bsf      PORTB,1         ;establecer la salida a 1(evitar errores primer caracter)
ENVIO2         clrf   CONTADOR      ;borra el registro CONTADOR de bits
            bcf      PORTB,1         ;bit START   
            call   RETARDO   
            
ENV_1         btfsc   DATO,0         ;comprueva bit 0 del registro DATO(comprovacion de bits a enviar)
            call   UNOS         ;salta a UNOS si el bit leido es 1
            btfss   DATO,0         ;comprueva bit 0 del registro DATO(comprovacion de bits a enviar)
            call   CEROS         ;salta a CEROS si el bit leido es 0
ENV_2         rrf      DATO,F         ;rota a la derecha el registro DATO

            incf   CONTADOR,F      ;incrementa CONTADOR (registro contador de bits)
            movlw   0x08         ;valor de bits a leer
            xorwf   CONTADOR,W      ;comprueva si son 8
            btfss   STATUS,Z      ;si no es 8 repite la comprovacion del siguiente bit
            goto   ENV_1         ;comprueva de nuevo
            bsf      PORTB,1         ;establecer a 1 la salida
            return               ;retorna

UNOS         bsf      PORTB,1         ;saca valor 1 por pin 1 de PORTB
            call   RETARDO         ;tiempo de un bit
            return               ;retorna
CEROS         bcf      PORTB,1         ;saca valor 0 por pin 1 de PORTB
            call   RETARDO         ;tiempo de un bit
            return               ;retorna

;**********************************************RETARDO***************************************
;
;
RETARDO         clrf   TMR0         ;borra el temporizador
COMP         movfw   BAUDRATE      ;valor del retardo
            subwf   TMR0,w         ;comprueva si ha llegado al valor o se pasa
            btfss   STATUS,C      ;si es menos sigue comprovando
            goto   COMP
            return               ;si ha llegado retorna
;*********************************************INTERRUPCIONES******************************
INTERRUPCIONES   PUSH               ;guarda valores de registros
            btfss   INTCON,INTF      ;comprueva interrupcion por cambio de PB0/INT
            goto   SALIR         ;salir del programa
            call   RECEPCION      ;programa de recepcion de datos
            call   ENVIO         ;programa de envio de datos
SALIR         bcf      INTCON,INTF      ;borra bandera señalizadora de interrupcion por cambio en PB0/INT
            POP                  ;restaura valores de registros
            retfie               ;retorna y activa interrupciones

            end                  ;fin

Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: pequeños proyectos
« Respuesta #56 en: 12 de Diciembre de 2009, 00:47:07 »
Es cierto que se desordena un poco, pero ya te lo ordene, por lo menos los nemonicos; los comentarios no se desordenan mucho por eso lo deje como esta.


Código: ASM
  1. ;*****************************************www.ingeniopic.com***************************+******
  2. ; PROGRAMA : usart_16F84
  3. ; Funcion : recepcion de datos serie
  4. ;          
  5. ;  
  6. ;  Revision : 1.0        12/12/2009            Programa para : PIC16F84
  7. ; CPU Clock : 4 MHz o 20Mhz                   Reloj instruccion :
  8. ;       WDT : Deshabilitado                  Tipo de reloj : XT
  9. ; Code Prot : OFF          
  10. ;*****************************************www.ingeniopic.com**********************************
  11. ;
  12. ;NOTAS:   este programa esta preparado para interrumpir el funcionamiento del programa programa principal para atender
  13. ;       una interrupcion por recepcion de datos provenientes de una usart.la velocidad de la usart podemos modificarla
  14. ;       cambiando el valor del registro BAUDRATE.que esta un poco mas abajo de la etiqueta INICIO.cuanto mayor sea la velocidad.mayor sera el margen de error.
  15. ;       el dato que recivamos por PB0 sera transmitido por PB1.
  16. ;      
  17.  
  18.       LIST   P=16F84   ;Se indica el modo de procesador
  19.      
  20.       RADIX   HEX      ;Sistema de numeracion hexadecimal
  21.  
  22.       INCLUDE   "P16F84.inc"  
  23.      
  24.                ;registros internos
  25.       __CONFIG   _XT_OSC & _CP_OFF & _WDT_OFF
  26.  
  27.       ERRORLEVEL      -302
  28.  
  29.  
  30.             CBLOCK    0x0C
  31.             CONTADOR
  32.             DATO
  33.             BAUDRATE
  34.  
  35.             W_TEMP
  36.             STATUS_TEMP
  37.             PCLATH_TEMP
  38.             ENDC
  39.  
  40.  
  41.      
  42. PUSH    MACRO               ;macro para salvar registros antes de una llamada a interrupcion  
  43.         movwf   W_TEMP              
  44.         swapf   STATUS,W
  45.         movwf   STATUS_TEMP        
  46.         clrf    STATUS              
  47.         movfw   PCLATH              
  48.         movwf   PCLATH_TEMP
  49.         clrf    PCLATH
  50.         ENDM
  51.  
  52. POP     MACRO               ;macro para restaurar registros   despues de una llamada a interrupcion
  53.         movfw   PCLATH_TEMP        
  54.         movwf   PCLATH
  55.         swapf   STATUS_TEMP,W    
  56.         movwf   STATUS
  57.         swapf   W_TEMP,F        
  58.         swapf   W_TEMP,W
  59.         ENDM
  60.  
  61.      
  62.       #define BANK0      bcf   STATUS,RP0
  63.       #define BANK1      bsf STATUS,RP0
  64. ;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
  65.             ORG     0x00            ;Inicio en el Vector de Reset
  66.             goto    INICIO            ;Va a la primera instruccion del programa
  67. ;<<<<<<---------------------- VECTOR DE INTEUPCIONES ------------------------>>>>>>>
  68.             ORG     0x04            ;Inicio en el Vector de Reset
  69.             goto    INTERRUPCIONES            ;Va a la primera instruccion del programa
  70.  
  71.  
  72. ;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
  73. INICIO      BANK1
  74.             movlw   b'10000000'      ;activar interrupcion por cambio de estado a 0 de RB0
  75.             movwf   OPTION_REG
  76.             movlw   b'10010000'      ;configura interrupcion por desbordaminto de TMR0 y  por cambio de estado a 0 de RB0
  77.             movwf   INTCON
  78.             movlw   b'00010001'      ;habilita interrupcion por cambio de estado en RB0/INT
  79.             movwf   TRISB
  80.             BANK0
  81.             bsf     PORTB,1         ;establecer la salida usart a 1
  82.             movlw   d'15'         ;valor para la velocidad de la usart
  83.             movwf   BAUDRATE
  84.             ;valores para el baudrate:para 4Mhz
  85.             ;
  86.             ;para divisor TMR0=000
  87.             ;190=2400bps, 90=4800bps, 40=9600bps, 15=19200bps,
  88.             ;
  89.             ;para divisor TMR0=010
  90.             ;97=1200bps,
  91.             ;
  92.             ;valores para el baudrate:para 20Mhz
  93.             ;
  94.             ;para divisor TMR0=000
  95.             ;51=38400,31=57600.
  96.          
  97. ;<<<<<<<------------------------------------------------PROGRAMA PRINCIPAL---------------------------------------->>>>>>>>>>>>>>        
  98. PRINCIPAL   NOP
  99.            
  100.             goto   PRINCIPAL
  101.            
  102. ;<<<<<<---------------------------------------------SUBPROGRAMA RECEPCION DE DATOS--------------------------
  103.            
  104. RECEPCION   clrf    CONTADOR      ;borra el contador de bits
  105.             clrf    TMR0         ;borra TMR0
  106.             movfw   BAUDRATE      ;carga valor del baudrate en w
  107.             subwf   TMR0,w         ;comprueva si ha llegado al valor o se pasa
  108.             btfss   STATUS,C      ;si es menos sigue comprovando
  109.             goto    $-3
  110.            
  111. COMP1       clrf    TMR0         ;borra TMR0
  112. COMP2       movfw   BAUDRATE      ;carga valor del baudrate en w
  113.             subwf   TMR0,w         ;resta el contenido de TMR0 con el de w(comprovacion => )
  114.             btfss   STATUS,C      ;comprueva si ha llegado al valor o se pasa
  115.             goto    COMP2         ;si es menos sigue comprovando
  116.  
  117.             bcf     PORTB,2
  118.             bsf     PORTB,2
  119.            
  120.             btfsc   PORTB,0         ;comprueva el estado del pin de entrada
  121.             call    UNO            ;si es 1 salta a UNO
  122.             btfss   PORTB,0         ;comprueva el estado del pin de entrada
  123.             call    CERO         ;si es 0 salta a CERO
  124.  
  125.             incf    CONTADOR,F      ;incrementa el contador de bits
  126.             movlw   0x08         ;valor de bit a comprovar
  127.             xorwf   CONTADOR,W      ;hacer xor con CONTADOR
  128.             btfss   STATUS,Z      ;comprueva si es igual
  129.             goto    COMP1         ;si no es igual sigue las comprobaciones
  130.             movfw   DATO         ;carga el dato recivido en w
  131.             return               ;retorno de subprograma RECEPCION
  132.  
  133. UNO         rrf     DATO,F         ;rota a la derecha una posicion  
  134.             bsf     DATO,7         ;pon a 1 el bit 7 del registro DATO
  135.             return         ;retorna
  136.  
  137. CERO        rrf     DATO,F         ;rota a la derecha una posicion
  138.             bcf     DATO,7         ;pon a 0 el bit 7 del registro DATO
  139.             return         ;retorna
  140.            
  141.          
  142. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<SUBPROGRAMA DE ENVIO DE DATOS>>>>>>>>>>>>>>>>>      
  143.  
  144.    
  145. ENVIO       bsf     PORTB,1         ;establecer la salida a 1(evitar errores primer caracter)
  146. ENVIO2      clrf    CONTADOR      ;borra el registro CONTADOR de bits
  147.             bcf     PORTB,1         ;bit START  
  148.             call    RETARDO  
  149.            
  150. ENV_1       btfsc   DATO,0         ;comprueva bit 0 del registro DATO(comprovacion de bits a enviar)
  151.             call    UNOS         ;salta a UNOS si el bit leido es 1
  152.             btfss   DATO,0         ;comprueva bit 0 del registro DATO(comprovacion de bits a enviar)
  153.             call    CEROS         ;salta a CEROS si el bit leido es 0
  154. ENV_2       rrf     DATO,F         ;rota a la derecha el registro DATO
  155.  
  156.             incf    CONTADOR,F      ;incrementa CONTADOR (registro contador de bits)
  157.             movlw   0x08         ;valor de bits a leer
  158.             xorwf   CONTADOR,W      ;comprueva si son 8
  159.             btfss   STATUS,Z      ;si no es 8 repite la comprovacion del siguiente bit
  160.             goto    ENV_1         ;comprueva de nuevo
  161.             bsf     PORTB,1         ;establecer a 1 la salida
  162.             return               ;retorna
  163.  
  164. UNOS        bsf     PORTB,1         ;saca valor 1 por pin 1 de PORTB
  165.             call    RETARDO         ;tiempo de un bit
  166.             return               ;retorna
  167. CEROS       bcf     PORTB,1         ;saca valor 0 por pin 1 de PORTB
  168.             call    RETARDO         ;tiempo de un bit
  169.             return               ;retorna
  170.  
  171. ;**********************************************RETARDO***************************************
  172. ;
  173. ;
  174. RETARDO     clrf    TMR0         ;borra el temporizador
  175. COMP        movfw   BAUDRATE      ;valor del retardo
  176.             subwf   TMR0,w         ;comprueva si ha llegado al valor o se pasa
  177.             btfss   STATUS,C      ;si es menos sigue comprovando
  178.             goto    COMP
  179.             return               ;si ha llegado retorna
  180. ;*********************************************INTERRUPCIONES******************************
  181. INTERRUPCIONES
  182.             PUSH                    ;guarda valores de registros
  183.             btfss   INTCON,INTF      ;comprueva interrupcion por cambio de PB0/INT
  184.             goto    SALIR         ;salir del programa
  185.             call    RECEPCION      ;programa de recepcion de datos
  186.             call    ENVIO         ;programa de envio de datos
  187. SALIR       bcf     INTCON,INTF      ;borra bandera señalizadora de interrupcion por cambio en PB0/INT
  188.             POP                  ;restaura valores de registros
  189.             retfie               ;retorna y activa interrupciones
  190.  
  191.             end                  ;fin

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #57 en: 12 de Diciembre de 2009, 10:57:30 »
voy a intentar hacerlo yo haber que tal queda.ademas he quitado dos lineas que solo las utilizaba para depurar el codigo.

Código: [Seleccionar]

;*****************************************www.ingeniopic.com***************************+******
; PROGRAMA : usart_16F84
; Funcion : recepcion de datos serie 
;           
;   
;  Revision : 1.0        12/12/2009            Programa para : PIC16F84
; CPU Clock : 4 MHz o 20Mhz                   Reloj instruccion :
;       WDT : Deshabilitado                  Tipo de reloj : XT
; Code Prot : OFF           
;*****************************************www.ingeniopic.com**********************************
;
;NOTAS:   este programa esta preparado para interrumpir el funcionamiento del programa programa principal para atender
;       una interrupcion por recepcion de datos provenientes de una usart.la velocidad de la usart podemos modificarla
;       cambiando el valor del registro BAUDRATE.que esta un poco mas abajo de la etiqueta INICIO.cuanto mayor sea la velocidad.mayor sera el margen de error.
;       el dato que recivamos por PB0 sera transmitido por PB1.
;     

      LIST   P=16F84   ;Se indica el modo de procesador
     
      RADIX   HEX      ;Sistema de numeracion hexadecimal

      INCLUDE   "P16F84.inc"   
     
               ;registros internos
      __CONFIG   _XT_OSC & _CP_OFF & _WDT_OFF

      ERRORLEVEL      -302


            CBLOCK    0x0C
            CONTADOR
            DATO
            BAUDRATE

            W_TEMP
            STATUS_TEMP
            PCLATH_TEMP
            ENDC


     
PUSH    MACRO               ;macro para salvar registros antes de una llamada a interrupcion   
        movwf   W_TEMP               
        swapf   STATUS,W
        movwf   STATUS_TEMP         
        clrf    STATUS               
        movfw   PCLATH               
        movwf   PCLATH_TEMP
        clrf    PCLATH
        ENDM

POP     MACRO               ;macro para restaurar registros   despues de una llamada a interrupcion
        movfw   PCLATH_TEMP         
        movwf   PCLATH
        swapf   STATUS_TEMP,W     
        movwf   STATUS
        swapf   W_TEMP,F         
        swapf   W_TEMP,W
        ENDM

     
      #define BANK0      bcf   STATUS,RP0
      #define BANK1      bsf STATUS,RP0
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
               ORG      0x00            ;Inicio en el Vector de Reset
              goto   INICIO            ;Va a la primera instruccion del programa
;<<<<<<---------------------- VECTOR DE INTEUPCIONES ------------------------>>>>>>>
               ORG      0x04            ;Inicio en el Vector de Reset
              goto   INTERRUPCIONES            ;Va a la primera instruccion del programa


;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO         BANK1
            movlw   b'10000000'      ;activar interrupcion por cambio de estado a 0 de RB0
            movwf   OPTION_REG
            movlw   b'10010000'      ;configura interrupcion por desbordaminto de TMR0 y  por cambio de estado a 0 de RB0
            movwf   INTCON
            movlw   b'00010001'      ;habilita interrupcion por cambio de estado en RB0/INT
            movwf   TRISB
            BANK0
            bsf      PORTB,1         ;establecer la salida usart a 1
            movlw   d'15'         ;valor para la velocidad de la usart
            movwf   BAUDRATE
            ;valores para el baudrate:para 4Mhz
            ;
            ;para divisor TMR0=000
            ;190=2400bps, 90=4800bps, 40=9600bps, 15=19200bps,
            ;
            ;para divisor TMR0=010
            ;97=1200bps,
            ;
            ;valores para el baudrate:para 20Mhz
            ;
            ;para divisor TMR0=000
            ;51=38400,31=57600.
         
;<<<<<<<------------------------------------------------PROGRAMA PRINCIPAL---------------------------------------->>>>>>>>>>>>>>         
PRINCIPAL      NOP
           
            goto   PRINCIPAL
           
;<<<<<<---------------------------------------------SUBPROGRAMA RECEPCION DE DATOS--------------------------
           
RECEPCION      clrf   CONTADOR      ;borra el contador de bits
            clrf   TMR0         ;borra TMR0
            movfw   BAUDRATE      ;carga valor del baudrate en w
            subwf   TMR0,w         ;comprueva si ha llegado al valor o se pasa
            btfss   STATUS,C      ;si es menos sigue comprovando
            goto   $-3
           
COMP1         clrf   TMR0         ;borra TMR0
COMP2         movfw   BAUDRATE      ;carga valor del baudrate en w
            subwf   TMR0,w         ;resta el contenido de TMR0 con el de w(comprovacion => )
            btfss   STATUS,C      ;comprueva si ha llegado al valor o se pasa
            goto   COMP2         ;si es menos sigue comprovando

                       
            btfsc   PORTB,0         ;comprueva el estado del pin de entrada
            call   UNO            ;si es 1 salta a UNO
            btfss   PORTB,0         ;comprueva el estado del pin de entrada
            call   CERO         ;si es 0 salta a CERO

            incf   CONTADOR,F      ;incrementa el contador de bits
            movlw   0x08         ;valor de bit a comprovar
            xorwf   CONTADOR,W      ;hacer xor con CONTADOR
            btfss   STATUS,Z      ;comprueva si es igual
            goto   COMP1         ;si no es igual sigue las comprobaciones
            movfw   DATO         ;carga el dato recivido en w
            return               ;retorno de subprograma RECEPCION

UNO            rrf      DATO,F         ;rota a la derecha una posicion   
            bsf      DATO,7         ;pon a 1 el bit 7 del registro DATO
            return         ;retorna

CERO         rrf      DATO,F         ;rota a la derecha una posicion
            bcf      DATO,7         ;pon a 0 el bit 7 del registro DATO
            return         ;retorna
           
         
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<SUBPROGRAMA DE ENVIO DE DATOS>>>>>>>>>>>>>>>>>     

   
ENVIO             bsf      PORTB,1         ;establecer la salida a 1(evitar errores primer caracter)
ENVIO2         clrf   CONTADOR      ;borra el registro CONTADOR de bits
                 bcf      PORTB,1         ;bit START   
                 call   RETARDO   
           
ENV_1             btfsc   DATO,0         ;comprueva bit 0 del registro DATO(comprovacion de bits a enviar)
                 call   UNOS         ;salta a UNOS si el bit leido es 1
                 btfss   DATO,0         ;comprueva bit 0 del registro DATO(comprovacion de bits a enviar)
                 call   CEROS         ;salta a CEROS si el bit leido es 0
ENV_2             rrf      DATO,F         ;rota a la derecha el registro DATO

                 incf   CONTADOR,F      ;incrementa CONTADOR (registro contador de bits)
                 movlw   0x08         ;valor de bits a leer
                 xorwf   CONTADOR,W      ;comprueva si son 8
                 btfss   STATUS,Z      ;si no es 8 repite la comprovacion del siguiente bit
                 goto   ENV_1         ;comprueva de nuevo
                 bsf      PORTB,1         ;establecer a 1 la salida
                 return               ;retorna

UNOS                bsf      PORTB,1         ;saca valor 1 por pin 1 de PORTB
                 call   RETARDO         ;tiempo de un bit
                 return               ;retorna
CEROS              bcf      PORTB,1         ;saca valor 0 por pin 1 de PORTB
                 call   RETARDO         ;tiempo de un bit
                 return               ;retorna

;**********************************************RETARDO***************************************
;
;
RETARDO          clrf   TMR0         ;borra el temporizador
COMP            movfw   BAUDRATE      ;valor del retardo
                 subwf   TMR0,w         ;comprueva si ha llegado al valor o se pasa
                 btfss   STATUS,C      ;si es menos sigue comprovando
                 goto   COMP
                 return               ;si ha llegado retorna
;*********************************************INTERRUPCIONES******************************
INTERRUPCIONES   PUSH               ;guarda valores de registros
                 btfss   INTCON,INTF      ;comprueva interrupcion por cambio de PB0/INT
                 goto   SALIR         ;salir del programa
                 call   RECEPCION      ;programa de recepcion de datos
                 call   ENVIO         ;programa de envio de datos
SALIR              bcf      INTCON,INTF      ;borra bandera señalizadora de interrupcion por cambio en PB0/INT
                  POP                  ;restaura valores de registros
                  retfie               ;retorna y activa interrupciones

                  end                  ;fin


« Última modificación: 12 de Diciembre de 2009, 11:07:33 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #58 en: 12 de Diciembre de 2009, 11:16:41 »
valla! parece que me ha quedado algo mejor que la primera vez que lo intente.no tanto como a ti poseidon20 pero por algo se empieza  :D
la verdad que como profesor seria bastante malo.no se me da muy bien los mecanismos de presentacion.sera por el poco tiempo de que dispongo.y prefiero
gastarlo en realizar codigo.
por eso tengo mi pagina web tan poquito actualizada. :)
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #59 en: 14 de Agosto de 2011, 11:04:10 »
hola de nuevo.acabo de realizar un programa que muestra un mensage por una LCD de 16x2 . la particularidad de este programa es que puede visualizar
un mensage que pasa entre paginas de la flash sin que se corte y tengamos que hacer varios punteros de tabla.
este programa esta diseñado para el 16f876 y las tablas ocupan sus 3 ultimas paginas.asi que podemos visualizar un mensage de algo mas de 6kBytes
el modo de funcionamiento para controlar la LCD es de 8 bit.

Código: [Seleccionar]

;************************************************** www.ingeniopic.com ***************************************************
; PROGRAMA : mensage.asm
; Funcion : control de temperatura
;          
;  
;  Revision : 1.0        7/8/2011            Programa para : PIC16F876A
; CPU Clock : 4 MHz                     Reloj instruccion :
;       WDT : Deshabilitado                  Tipo de reloj : XT
; Code Prot : OFF          
;************************************************* www.ingeniopic.com **************************************************
LIST P=16F876A ; Se emplea el PIC 16F876A
RADIX HEX ; Sistema de numeraci¢n hexadecimal
INCLUDE  "P16F876A.INC"
__CONFIG    _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF
ERRORLEVEL -302

;ZONA DE ETIQUETAS
CBLOCK 0X20
TEMP_W
OFFSET
RESUL
INDICE
TEMP_PCL
TEMP_PCLATH
AUX0
AUX1
AUX2
CONT_CARACTER
ENDC

BANK0 MACRO ;CONMUTACION DE BANCOS
BCF STATUS,IRP
bcf STATUS,RP0
bcf STATUS,RP1
ENDM
BANK1 MACRO
BCF STATUS,IRP
bsf STATUS,RP0
bcf STATUS,RP1
ENDM
BANK2 MACRO
BSF STATUS,IRP
bcf STATUS,RP0
bsf STATUS,RP1
ENDM
BANK3 MACRO
BSF STATUS,IRP
bsf STATUS,RP0
bsf STATUS,RP1
ENDM



org 5
INICIO
BANK0
CLRF PORTA ; Initialize PORTA by

BANK1
MOVLW 0x06 ; Configure all pins
MOVWF ADCON1 ; as digital inputs
MOVLW 0xCF ; Value used to
MOVWF TRISA ; Set RA<3:0> as inputs

;PROGRAMA PRINCIPAL

movlw b'01000000' ;activado interrupcion por desbordamiento de tmr0
movwf INTCON
movlw b'00000001' ;activado interrupcion por desbordamiento de TMR1
movwf PIE1
movlw 0xff
movwf TRISA ;porta como entradas
movlw 0x00 ;
movwf TRISB ;
movlw b'00011111'
movwf TRISC ;portc como ENTRADAS
movlw b'00000000'
movwf OPTION_REG ;configuracion del WDT(div128)y activa resistencias pull-up
BANK0 ;selecciona el banco 0
clrf PORTB ;borra PORTB
clrf PORTC
movlw b'00000101'
movwf T1CON ;configuracion del TMR1 preescaler sin divisiones

bcf PIR1,TMR2IF ;borra flag de desbordamiento de TMR2

movlw 0XFF ;valor final de sector
movwf TEMP_PCL ;temporal del PCL
;clrf CONT_PCL


movlw 0x08 ;pagina donde esta ubicada la tabla(DIR 0X800 =pagina1)
MOVWF TEMP_PCLATH



;***********************************************PRINCIPIO DEL PROGRAMA********************************************************************
 
  

PRINCIPAL CALL LCD



REP GOTO REP


;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<INICIALIZA LCD>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        
LCD         clrf   INTCON ;deshabilita las interrupciones
         BANK0 ;selecciona el banco 0
         clrf   PORTA ;borra lacht del PORTA
         BANK1 ;selecciona el banco 1
         movlw   0x06
         movwf   ADCON1
         clrf    TRISA         ; Puerta A como salidas digitales


call UP_LCD ;prepara puerta de E/S
call BORRA_Y_HOME ;borra el display y posicion 0 para caracter.
call LCD_DELAY
movlw b'00110000' ;8 bit interfaz,1 linea LCD,5x8 pixel.
call FUNCTION_SET ;envia funcion
call LCD_DELAY
movlw b'00001100' ;display on,cursor off,blinking off.
call DISPLAY_ON_OFF ;envia funcion
call LCD_DELAY
movlw b'00000110' ;Establece la dirección de movimiento del cursor
call ENTRY_MODE_SET
call LCD_DELAY


call BIENVENIDA


        
BUCLE       goto   BUCLE



;********************************************* MENSAGE LCD *********************************************
;La funcion de este programa es visualizar los caracteres de la tabla.en un lcd de 16 caracteres por 2 lineas.
;para ello se almacenan los primeros 40 caracteres de la tabla en la DDRAM.para obtener un mejor efecto visual
;los primeros 16 caracteres de la tabla estaran en blanco.
;Una vez cargados los caracteres en la DDRAM,comenzaremos la rotacion del mensage por la pantalla.hasta que el caracter-
;numero 40,quede en la posicion mas a la izquierda de la pantalla.que serian 24 desplazamientos.
;Posteriormente borraremos la pantalla y colocaremos el cursor en la primera direccion de la DDRAM
;grabaremos los siguientes 40 caracteres de la tabla.pero cogeremos 16 de los ultimos caracteres que utilizamos
;en la primera visualizacion.de esta forma obtendremos un efecto visual de que el mensage no se ha cortado.

;En las lineas de abajo explico como funciona.

;Datos de la tabla:
;................ESTA ES UNA PRUEVA DE ME NSAGES LARGOS QUE CONTIENE UNA CANTIDAD DE CARACTERES LIMITADA POR LA MEMORIA

;1ª grabacion en DDRAM.los puntos son en realidad 16 espacios en blanco.
;................ESTA ES UNA PRUEVA DE ME

;2ª grabacion.
;UNA PRUEVA DE MENSAGES LARGOS QUE CONTIE

;3ª grabacion
;ARGOS QUE CONTIENE UNA CANTIDAD DE CARAC

;4ª grabacion
;ANTIDAD DE CARACTERES LIMITADA POR LA ME

;5ª grabacion
;MITADA POR LA MEMORIA...................

;Despues de cada grabacion se realizara 24 desplazamientos hacia la izquierda.si nos fijamos bien
;notaremos que despues de 24 desplazamientos,los caracteres coinciden con la siguiente grabacion.
;este es el efecto visual que hara que parezca un solo mensage muy largo.aunque en realidad son 5 mensages superpuestos
  

            
BIENVENIDA BANK0 ;selecciona banco 0
clrf CONT_CARACTER ;incrementa registro contador de caracteres
clrf   RESUL ;

retorn      movf   OFFSET,W ;carga en W el puntero de tabla
         addwf   RESUL,W ;suma el contenido de W al registro RESUL
call MENSAGE ;salta a tabla de caraceres
incf RESUL,F ;incrementa resul
incf INDICE,F ;incrementa indice de tabla
movf TEMP_W,W ;restaura W
call   LCD_DATO ;introduce caracter contenido en W a la ddram de la LCD.
movlw d'40' ;numero de caracteres de la ddram(primera fila)
subwf RESUL,W ;resta el valor contenido en W al registro RESUL.
btfss STATUS,C ;comprueva si se llego a meter los 40 caracteres en la ddram de la LCD
goto retorn ;si no ha llegado salta a retorn en caso contrario continua

FDG call ROTA_IZQ ;rota el LCD hacia la izquierda
call pausa1 ;pausa de rotacion de la LCD
incf CONT_CARACTER,F ;incrementa el contador de caracteres
movlw .24 ;carga valor de desplazamientos hacia la izquierda para mostrar el mensage completo del a ddram.40-16=24 =>  40 bytes - 16 caracteres visibles = 24 caracteres no visibles
xorwf CONT_CARACTER,w ;comprueva si se llego al valor anterior
btfss STATUS,Z ;si no ha llegado,sigue rotando
goto FDG
movlw .16 ;numero de bytes visibles de la LCD (LCD 16x2)
subwf INDICE,F ;desplaza el indice para grabar los 16 ultimos caracteres del primer mensage de la ddr,en los 16 primeros caracteres del siguiente mensage

clrf CONT_CARACTER ;borra contador de caracteres
clrf   RESUL ;borra RESUL
call BORRA_Y_HOME ;borra el display y posicion 0 para caracter.
goto retorn ;siguiente mensage


;************************************************ RETARDO **********************************************************
pausa1 clrf AUX2
pausae3 clrf AUX1
pausae2 clrf AUX0
pausae incf AUX0,f
btfss AUX0,7 ;valor de emporizacion
goto pausae
incf AUX1,f
btfss AUX1,7 ;valor de temporizacion
goto pausae2
incf AUX2,f
btfss AUX2,1 ;velor de temporizacion
goto pausae3
return

;************************************************ MENSAGE ******************************************************


MENSAGE movlw 0xfc
xorwf INDICE,W ;compara si es igual al indice
btfsc STATUS,Z ;si es asi.(valor final del sector)
fin_bank incf TEMP_PCLATH,F ;incrementa PCLATH (para leer datos del siguiente sector)
bsf PCLATH,3 ;conmuta pagina 1 antes de la llamada al subprograma MENSAGE que esta hubicado en la misma

movlw d'32' ;valor del final de la memoria de programa
xorwf TEMP_PCLATH,W ;comparalo con temporal de paginacion
btfsc STATUS,Z
return ;si ha llegado termina el programa de visualizacion de mensages en LCD


call TABLA ;localiza caracter a leer en la tabla
movwf TEMP_W ;guarda el valor localizado de la tabla en el temporal del acumulador
clrf PCLATH ;borra PCLATH antes de retornar a la pagina 0
return ;retorna

org 0x800 ;direccion de memoria donde se hubicara la tabla(primer byte de la pagina 1)

TABLA movf TEMP_PCLATH,W ;carga en w el valor de la pagina
movwf PCLATH ;conmuta la pagina
movfw   INDICE ;carga el contenido de INDICE en w
addwf   PCL,f ;direcciona el valor a leer de la tabla.

dt   "                En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua,"
dt " rocín flaco y galgo corredor. Una olla de algo más vaca que carnero, salpicón las más noches, duelos y quebrantos los sábados, lentejas los viernes, algún palomin"
dt   "o de añadidura los domingos, consumían las tres partes de su hacienda. El resto della concluían sayo de velarte, calzas de velludo para las fiestas con sus pantufl"
dt "os de lo mismo, los días de entre semana se honraba con su vellori de lo más fino. Tenía en su casa una ama que pasaba de los cuarenta, y una sobrina que no llegab"
dt   "a a los veinte, y un mozo de campo y plaza, que así ensillaba el rocín como tomaba la podadera. Frisaba la edad de nuestro hidalgo con los cincuenta años, era de c"
dt "omplexión recia, seco de carnes, enjuto de rostro; gran madrugador y amigo de la caza. Quieren decir que tenía el sobrenombre de Quijada o Quesada (que en esto hay"
dt " alguna diferencia en los autores que deste caso escriben), aunque por conjeturas verosímiles se deja entender que se llama Quijana; pero esto importa poco a nuest"
dt "ro cuento; basta que en la narración dél no se salga un punto de la verdad. Es, pues, de saber, que este sobredicho hidalgo, los ratos que estaba ocioso (que eran "
dt "los más del año) se daba a leer libros de caballerías con tanta afición y gusto, que olvidó casi de todo punto el ejercicio de la caza, y aun la administración de "
dt "su hacienda; y llegó a tanto su curiosidad y desatino en esto, que vendió muchas hanegas de tierra de sembradura, para comprar libros de caballerías en que leer; y"
dt " así llevó a su casa todos cuantos pudo haber dellos; y de todos ningunos le parecían tan bien como los que compuso el famoso Feliciano de Silva: porque la clarida"
dt "d de su prosa, y aquellas intrincadas razones suyas, le parecían de perlas; y más cuando llegaba a leer aquellos requiebros y cartas de desafío, donde en muchas pa"
dt "rtes hallaba escrito: la razón de la sinrazón que a mi razón se hace, de tal manera mi razón enflaquece, que con razón me quejo de la vuestra fermosura, y también "
dt "cuando leía: los altos cielos que de vuestra divinidad divinamente con las estrellas se fortifican, y os hacen merecedora del merecimiento que merecela vuestra gra"
   dt   "deza. Con estas y semejantes razones perdía el pobre caballero el juicio, y desvelábase por entenderlas, y desentrañarles el sentido, que no se lo sacara, ni las e"
dt " entendiera el mismo Aristóteles, si resucitara para sólo ello. No estaba muy bien con las heridas que don Belianis daba y recibía, porque se imaginaba quepor gran"
dt   "des maestros que le hubiesen curado, no dejaría de tener el rostro y todo el cuerpo lleno de cicatrices y señales; pero con todo alababa en su autor aquel acabar s"
dt "u libro con la promesa de aquella inacabable aventura, y muchas veces le vino deseo de tomar la pluma, y darle fin al pie de la letra como allí se promete; y sin d"
dt   "uda alguna lo hiciera, y aun saliera con ello, si otros mayores y continuos pensamientos no se lo estorbaran. Tuvo muchas veces competencia con el cura de su lugar"
dt " (que era hombre docto graduado en Sigüenza), sobre cuál había sido mejor caballero, Palmerín de Inglaterra o Amadís de Gaula; mas maese Nicolás, barbero del mismo"
dt " pueblo, decía que ninguno llegaba al caballero del Febo, y que si alguno se le podía comparar, era don Galaor, hermano de Amadís de Gaula, porque tenía muy acomod"
dt "ada condición para todo; que no era caballero melindroso, ni tan llorón como su hermano, y que en lo de la valentía no le iba en zaga. En resolución, él se enenfra"
dt "scó tanto en su lectura, que se le pasaban las noches leyendo de claro en claro, y los días de turbio en turbio, y así, del poco dormir y del mucho leer, se le sec"
dt "ó el cerebro, de manera que vino a perder el juicio. Llenósele la fantasía de todo aquello que leía en los libros, así de encantamientos, como de pendencias, batal"
dt "las, desafíos, heridas, requiebros, amores, tormentas y disparates imposibles, y asentósele de tal modo en la imaginación que era verdad toda aquella máquina de aq"
dt "uellas soñadas invenciones que leía, que para él no había otra historia más cierta en el mundo. Decía él, que el Cid Ruy Díaz había sido muy buen caballero; pero q"
dt "ue ver con el caballero de la ardiente espada, que de sólo un revés había partido por medio dos fieros y descomunales gigantes. Mejor estaba con Bernardo del Carpi"
dt "Carpio, porque en Roncesvalle había muerto a Roldán el encantado, valiéndose de la industria de Hércules, cuando ahogó a Anteo, el hijo de la Tierra, entre los bra"
dt "brazos. Decía mucho bien del gigante Morgante, porque con ser de aquella generación gigantesca, que todos son soberbios y descomedidos, él solo era afable y bien c"
dt "riado; pero sobre todos estaba bien con Reinaldos de Montalbán, y más cuando le veía salir de su castillo y robar cuantos topaba, y cuando en Allende robó aquel íd"
dt "olo de Mahoma, que era todo de oro, según dice su historia. Diera él, por dar una mano de coces al traidor de Galalón, al ama que tenía y aun a su sobrina de añadi"
dt   "dura. En efecto, rematado ya su juicio, vino a dar en el más extraño pensamiento que jamás dio loco en el mundo, y fue que le pareció convenible y necesario, así p"
dt "ara el aumento de su honra, como para el servicio de su república, hacerse caballero andante, e irse por todo el mundo con sus armas y caballo a buscar las aventur"
dt "as, y a ejercitarse en todo aquello que él había leído, que los caballeros andantes se ejercitaban, deshaciendo todo género de agravio, y poniéndose en ocasiones y"
dt " peligros, donde acabándolos, cobrase eterno nombre y fama. Imaginábase el pobre ya coronado por el valor de su brazo por lo menos del imperio de Trapisonda: y así"
dt " con estos tan agradables pensamientos, llevado del estraño gusto que en ellos sentía, se dió priesa a poner en efecto lo que deseaba. Y lo primero que hizo, fue l"
dt "impiar unas arma"

org 0x1f00

dt "s, que habían sido de sus bisabuelos, que, tomadas de orín y llenas de moho, luengos siglos había que estaban puestas y olvidadas en un rincón. Lim"
dt "piólas y aderezólas lo mejor que pudo; pero vió que tenían una gran falta, y era que no tenía celada de encaj"


org 0x500
include "lcd_cxx_V2.inc"

end


y aqui pongo la libreria para la lcd.no esta acabada pero sirve para el funcionamiento de este programa:

Código: [Seleccionar]
;LCD_CXX.ASM
 
 
;El conjunto de rutinas que se presentan a continuaci¢n permiten realizar
;las tareas b sicas de control del m¢dulo de visualizaci¢n LCD. Se emplean
;con los PIC 16c8xx. En el programa principal se deber  reservar memoria
;para el bloque de variables que utiliza el LCD del modo:
LCD_VAR EQU 0x5A ;direccion de inicio del bloque para meter datos en variables

;BLOQUE DE ETIQUETAS
 
 
   #define ENABLE       bsf PORTA,2 ;Activa E
   #define DISABLE    bcf PORTA,2 ;Desactiva
   #define LEER       bsf PORTA,1 ;Pone LCD en Modo RD
   #define ESCRIBIR    bcf PORTA,1 ;Pone LCD en Modo WR
   #define OFF_COMANDO    bcf PORTA,0 ;Desactiva RS (modo comando)
   #define ON_COMANDO    bsf PORTA,0 ;Activa RS (modo datos)
   CBLOCK    LCD_VAR
      LCD_TEMP_2   ;Inicio de las variables. Ser  la primera direcci¢n libre
            ; disponible
      LCD_TEMP_1  
   ENDC      
 
       LIST
;RUTINA UP_LCD: Con esta rutina se configura el PIC para que trabaje con el LCD.
 
 
UP_LCD
      BANK1    ;Banco 1
  
       clrf    TRISB;PORTB       ;RB <0-7> salidas digitales
      clrf    TRISB;PORTA       ;RA <0-4> salidas digitales
       BANK0    ;Banco 0
      OFF_COMANDO       ;RS=0
      DISABLE       ;E=0
      return
 
 
;RUTINA LCD_BUSY: Con esta rutina se chequea el estado del
;flag BUSY del m¢dulo LCD, que indica, cuando est  activado, que el
;m¢dulo a£n no ha terminado el comando anterior. La rutina espera a
;que se complete cualquier comando anterior antes de retornar al
;programa principal, para poder enviar un nuevo comando.
 
 
LCD_BUSY   LEER          ;Pone el LCD en Modo RD
         BANK1
         movlw    H'FF'
         movwf    TRISB       ;Puerta B como entrada
         BANK0    ;Selecciona el banco 0
         ENABLE          ;Activa el LCD
         nop
L_BUSY       btfsc    PORTB,7      ;Chequea bit de Busy
         goto    L_BUSY
      
         DISABLE        ;Desactiva LCD
         BANK1
         clrf    TRISB       ;Puerta B salida
         BANK0
         ESCRIBIR         ;Pone LCD en modo WR
         return
 
 
;RUTINA LCD_E: Se trata de una peque¤a rutina que se encarga de generar
;un impulso de 1æ s (para una frecuencia de funcionamiento de 4 Mhz)
;por la patita de salida de la Puerta A RA2, que se halla conectada
;a la se¤al E (Enable) del m¢dulo LCD. Con esta rutina se pretende activar
;al m¢dulo LCD.
 
 
LCD_E       ENABLE         ;Activa E
         nop
         DISABLE         ;Desactiva E
         return
 
 
;RUTINA LCD_DATO: Es una rutina que pasa el contenido cargado en el
;registro W, el cual contiene un car cter ASCII, a la PUERTA B, para
;visualizarlo por el LCD o escribirlo en la CGRAM.
 
 
LCD_DATO    OFF_COMANDO       ;Desactiva RS (modo comando)
         movwf   PORTB       ;Valor ASCII a sacar por PORTB
         call    LCD_BUSY    ;Espera a que se libere el LCD
         ON_COMANDO       ;Activa RS (modo dato)
         call    LCD_E       ;Genera pulso de E
          return
 
 
;RUTINA LCD_REG: Rutina parecida a la anterior, pero el contenido de W
;ahora es el c¢digo de un comando para el LCD, que es necesario pasar
;tambi‚n a la PUERTA B para su ejecuci¢n.
 
 
LCD_REG    OFF_COMANDO       ;Desactiva RS (modo comando)
         BANK0
         movwf    PORTB       ;C¢digo de comando
      
         call    LCD_BUSY    ;LCD libre?.
        
         call    LCD_E       ;S¡. Genera pulso de E.
          return
 
 
;RUTINA LCD_INI: Esta rutina se encarga de realizar la secuencia de
;inicializaci¢n del m¢dulo LCD de acuerdo con los tiempos dados por
;el fabricante (15 ms). Se especifican los valores de DL, N y F,
;as¡ como la configuraci¢n de un interfaz de 8 l¡neas con el bus
;de datos del PIC, y 2 l¡neas de 16 caracteres de 5 x 7 pixels.
 
 
LCD_INI      
         movlw   b'00111000'
         call   LCD_REG    ;C¢digo de instrucci¢n
        
         call   LCD_DELAY   ;Temporiza
         movlw   b'00111000'
         call   LCD_REG      ;C¢digo de instrucci¢n
         call   LCD_DELAY   ;Temporiza
         movlw    b'00111000'
         call   LCD_REG      ;C¢digo de instrucci¢n
         call    LCD_DELAY   ;Temporiza
         return
 
 
;RUTINA BORRA_Y_HOME: Borra el display y retorna el cursor a la posici¢n 0.
 
 
BORRA_Y_HOME   movlw    b'00000001'    ;Borra LCD y Home.
            call    LCD_REG
            return
 
 
;RUTINA DISPLAY_ON_CUR_OFF: Control del display y cursor.
;Activa el display y desactiva es cursor
 
DISPLAY_ON_OFF   ;movlw b'00001100'    ;LCD on, cursor off.
         call    LCD_REG
         return
;RUTINA LCD_LINEA2

LCD_LINEA2      movlw   0xC0
            call   LCD_REG
            return
;RUTINA LCD_LINEA1

LCD_LINEA1      movlw   0x80
            call   LCD_REG
            return

ROTA_DER movlw b'00011000'

call LCD_REG
 call    LCD_DELAY   ;Temporiza
return

SET_DDRAM ;movlw b'00100000'
call LCD_REG
call LCD_DELAY
return

FUNCTION_SET
call LCD_REG
return
ENTRY_MODE_SET
call LCD_REG
return
ROTA_IZQ
movlw b'00011100'
call LCD_REG
return
 
;RUTINA LCD_DELAY: Se trata de un rutina que implementa un retardo
;o temporizaci¢n de 5 ms. Utiliza dos variables llamadas LCD_TEMP_1
;y LCD_TEMP_2, que se van decrementando hasta alcanzar dicho tiempo.
 
 
LCD_DELAY   clrwdt
         movlw    10
         movwf    LCD_TEMP_1
         clrf    LCD_TEMP_2
LCD_DELAY_1 decfsz   LCD_TEMP_2,F
         goto   LCD_DELAY_1
         decfsz   LCD_TEMP_1,F
         goto   LCD_DELAY_1
         return


  
         LIST
« Última modificación: 14 de Agosto de 2011, 17:06:10 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)


 

anything