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

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

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: pequeños proyectos
« Respuesta #60 en: 14 de Agosto de 2011, 11:51:49 »
Gracias Groudman!, interesante tecnica la de ir cargando en la ddram!!!  :mrgreen:
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #61 en: 14 de Agosto de 2011, 12:28:45 »
pero hay otra?  :D la verdad es que es la primera vez que me lio en serio con las LCD.y no entiendo mucho del tema.se me ocurrio hacerlo asi porque es lo primero que se me bino a la cabeza.
pero ahora que lo dices tambien se podria cargar solo en los primero 16Bytes.sin utilizar el desplazamiento del LCD.haciendo el desplazamiento por
software.
en todo caso. creo que de la forma que lo he hecho consumire menos recursos del pic.al mantenerlo libre durante el desplazamiento de los caracteres.

saludos.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: pequeños proyectos
« Respuesta #62 en: 14 de Agosto de 2011, 15:09:48 »
Muy bueno grounman, lo has conseguido (no tenia ninguna duda de que lo harias), y con un texto del Quijote, para que luego digan que los de ciencias somos unos incultos.  :lol: :lol:

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #63 en: 14 de Agosto de 2011, 17:08:33 »
espero que no se hechen encima los de derechos d e autor. :D :D :D
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #64 en: 05 de Septiembre de 2011, 18:34:18 »
bueno.pongo este programa que es una modificacion del anterior para trabajar en el modo 4bit.de esta forma nos ahorraremos 4 pin del microcontrolador.
tambien he inseratado la rutina que comprueva el flag BUSY.aunque en este modo de funcionamiento normalmente lo que se hace es darle mas tiempo
a la LCD a que termine sus ejecuciones internas.
por eso me ha costado mas terminar esta parte.ya que no hay muchos ejemplos en internet en este modo de funcionamiento de 4bit y uso del flag BUSY.

Código: [Seleccionar]

;************************************************** www.ingeniopic.com ***************************************************
; PROGRAMA : mensage_16f876_4bit.asm
; Funcion : visualizacion de un mensage largo en el modo LCD 4bit
;          
;  
;  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
TEMPLCD
TEMP_PORTB
PDel0
TEMP_RS
ENDC

BANK0 MACRO ;CONMUTACION DEL BANCO 0
BCF STATUS,IRP
bcf STATUS,RP0
bcf STATUS,RP1
ENDM
BANK1 MACRO ;CONMUTACION DEL BANCO 1
BCF STATUS,IRP
bsf STATUS,RP0
bcf STATUS,RP1
ENDM
BANK2 MACRO ;CONMUTACION DEL BANCO 2
BSF STATUS,IRP
bcf STATUS,RP0
bsf STATUS,RP1
ENDM
BANK3 MACRO ;CONMUTACION DEL BANCO 3
BSF STATUS,IRP
bsf STATUS,RP0
bsf STATUS,RP1
ENDM
PULSO MACRO ;PULSO EN TERMINAL E DE LA LCD
bsf         PORTA,2
            call        RETARDO
            bcf         PORTA,2
ENDM



#define COMANDOS    bcf PORTA,0 ;Desactiva RS (modo comando)
   #define DATOS     bsf PORTA,0 ;Activa RS (modo datos)
#define E EQU 2
#define   RS EQU 0
#define READ bsf PORTA,1
#define WRITE bcf PORTA,1
#define ENABLE bsf PORTA,2 ;habilita LCD
#define DISABLE bcf PORTA,2 ;deshabilita LCD


org 5
INICIO
BANK0
clrf PORTA ; inicializa PORTA
clrf PORTB ; inicializa PORTB
BANK1
movlw 0x06 ; configura los pin
movwf ADCON1 ; como entradas digitales
movlw 0xCF ; Value used to
movwf TRISA ; activa RA<3:0> como entradas

movlw 0x00 ;
movwf TRISB ;PORTB como salidas
BANK0 ;selecciona el banco 0
clrf PORTB ;borra PORTB
movlw 0XFF ;valor final de sector
movwf TEMP_PCL ;temporal del PCL
movlw 0x08 ;pagina donde esta ubicada la tabla(DIR 0X800 =pagina1)
movwf TEMP_PCLATH

;***********************************************PRINCIPIO DEL PROGRAMA********************************************************************
 
PRINCIPAL CALL LCD
REP GOTO REP ;fin del programa.


;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<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 LCDINI ;inicializa la LCD
call BIENVENIDA ;salta a mensage de bienvenida


         return




;********************************************* 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
  
;**************************************************** FUNCIONAMIENTO DE ALGUNAS RUTINAS ************************************************
;
;Ddebido a que el uso de una libreria para LCD es un desaprobecho de los recursos del pic.ya que ocupariamos una gran
;parte de la memoria de programa.y perdida de tiempo en las llamadas a estas rutinas.
;He decidido insertar los comandos en el programa principal.estos comandos iran precedidos de una instruccion para
;la conmutacion entre datos y comandos.ejamplo:
;
;envio de un comando a la LCD:
;COMANDOS
;MOVLW 0X01 ;envio del comando HOME
;CALL   BYTE
;
;envio de un datos a la LCD:
;DATOS
;MOVLW 'A' ;envio del caracter "A"
;CALL BYTE
;
;************************************************************MENSAGE DE BIENVENIDA******************************************************  
        
BIENVENIDA BANK0 ;selecciona banco 0
clrf CONT_CARACTER ;incrementa registro contador de caracteres
clrf   RESUL ;borra registro RESUL

retorn      DATOS ;selecciona modo de envio de datos
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   BYTE ;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 COMANDOS ;selecciona modo de envio de comandos
movlw b'00011100' ;comando de rotacion a izquierdas
call BYTE ;envia comando
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

COMANDOS ;selecciona el modo comando para la LCD
movlw 0X01 ;HOME. posicion 0 de la DD RAM.
           call   BYTE ;envia comando
goto retorn ;siguiente mensage



;************************************************** INICIALIZACION LCD *************************************************************
LCDINI     COMANDOS ;selecciona el modo comando para la LCD
movlw 0X02 ;HOME. posicion 0 de la DD RAM.
           call   BYTE
           movlw   0X28 ;FUNCTION SET. bus 4bit,LCD 1 linea.
           call    BYTE
           movlw   0X0C ;DISPLAY ON/OFF. display on.
           call    BYTE
           movlw   0X06 ;ENTRY MODE.incremento del cursor
           call    BYTE
           movlw   0X01   ;CLEAR DISPLAY. borra display y activa incremento del cursor
           call    BYTE
           return

;********************************************** ENVIO DE NIBLES  A LA LCD ******************************************************

BYTE                 BANK0 ;selcciona el banco 0
movwf   TEMPLCD ;guarda el contenido de W en registro temporal TEMPLCD
call LCD_BUSY ;comprueva si el LCD esta libre
            movlw   0x0f ;pon a 0 el nible alto de W
            andwf   PORTB,F ;borra el nible alto de portb sin tocar el nible bajo.
            movf    TEMPLCD,W ;carga el contenido de TEMPLCD en W
            andlw   0xf0 ;seleccionar el nible alto de W
            iorwf   PORTB,F ;manda nible alto de W a PORTB.
PULSO ;pulso de 1ms en terminal E de la LCD
            movlw   0x0f ;pon a 0 el nible alto de W
            andwf   PORTB,F ;borra el nible alto de portb sin tocar el nible bajo.
            swapf   TEMPLCD,W ;inbierte los nibles del registro TEMPLCD
            andlw   0xf0 ;seleccionar el alto bajo de W
            iorwf   PORTB,F ;manda nible alto de W a PORTB.
PULSO ;pulso de 1ms en terminal E de la LCD
return ;retorna


LCD_BUSY           call RETARDO ;retardo para evitar que la lectura del flag BUSY se quede bloqueado.
                                               movfw PORTA ;carga en W el contenido de PORTA
andlw 0x01 ;guarda el valor del estado del bit RS
movwf TEMP_RS ;salva el valor de RS en el registro temporal
COMANDOS ;selecciona el modo comandos
BANK1 ;selecciona banco 1
         movlw    H'F0' ;
         movwf    TRISB       ;nible alto de PORT B como entrada
         BANK0     ;Selecciona el banco 0
READ           ;Pone el LCD en Modo RD "lectura"
         ENABLE           ;Activa el LCD (lectura del nible alto)
L_BUSY      btfsc    PORTB,7       ;Chequea bit de Busy
         goto    L_BUSY ;espera a que la LCD este libre
       DISABLE         ;Desactiva LCD

ENABLE ;Activa el LCD (lectura del nible bajo)
call RETARDO ;retardo de 1ms
DISABLE ;Desactiva LCD

         BANK1 ;selecciona banco 1
         clrf    TRISB       ;Puerta B salida
         BANK0 ;Selecciona el banco 0
         WRITE         ;Pone LCD en modo WR

movfw TEMP_RS ;restaura el valor de SR
iorwf PORTA,f ;activa en PORTA el bit RS
         return ;retorna


;************************************************ RETARDO DE VELOCIDAD DE DESPLAZAMIENTO **********************************************************
pausa1 clrf AUX2
pausae3 clrf AUX1
pausae2 clrf AUX0
pausae incf AUX0,f
btfss AUX0,7 ;valor de temporizacion
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
;************************************************ RETARDO 1mS **********************************************************

RETARDO   movlw   .248       ; 1 set numero de repeticion
         movwf   PDel0     ; 1 |
PLoop0   clrwdt             ; 1 clear watchdog
         decfsz  PDel0, 1   ; 1 + (1) es el tiempo 0  ?
         goto    PLoop0     ; 2 no, loop
PDelL1   goto PDelL2         ; 2 ciclos delay
PDelL2   clrwdt               ; 1 ciclo delay
         return               ; 2+2 Fin.
;************************************************ 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

« Última modificación: 08 de Septiembre de 2011, 16:48:49 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #65 en: 08 de Septiembre de 2011, 18:59:54 »
pongo este programa que realiza pruevas con comandos de la LCD.en el corrijo caracteres y tambien visualizo alguno especial.

Código: [Seleccionar]

;************************************************** www.ingeniopic.com ***************************************************
; PROGRAMA : pruevas_LCD_v1.asm
; Funcion : pruevas con los comandos de una lcd en modo a 4bits
;           
;   
;  Revision : 1.0        8/9/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
TEMPLCD
TEMP_PORTB
PDel0
TEMP_RS
ENDC

BANK0 MACRO ;CONMUTACION DEL BANCO 0
BCF STATUS,IRP
bcf STATUS,RP0
bcf STATUS,RP1
ENDM
BANK1 MACRO ;CONMUTACION DEL BANCO 1
BCF STATUS,IRP
bsf STATUS,RP0
bcf STATUS,RP1
ENDM
BANK2 MACRO ;CONMUTACION DEL BANCO 2
BSF STATUS,IRP
bcf STATUS,RP0
bsf STATUS,RP1
ENDM
BANK3 MACRO ;CONMUTACION DEL BANCO 3
BSF STATUS,IRP
bsf STATUS,RP0
bsf STATUS,RP1
ENDM
PULSO MACRO ;PULSO EN TERMINAL E DE LA LCD
bsf         PORTA,2
            call        RETARDO
            bcf         PORTA,2
ENDM



#define COMANDOS    bcf PORTA,0 ;Desactiva RS (modo comando)
    #define DATOS    bsf PORTA,0 ;Activa RS (modo datos)
#define E EQU 2
#define     RS EQU 0
#define READ bsf PORTA,1
#define WRITE bcf PORTA,1
#define ENABLE bsf PORTA,2 ;habilita LCD
#define DISABLE bcf PORTA,2 ;deshabilita LCD


org 5
INICIO
BANK0
clrf PORTA ; inicializa PORTA
clrf PORTB ; inicializa PORTB
BANK1
movlw 0x06 ; configura los pin
movwf ADCON1 ; como entradas digitales
movlw 0xCF ; Value used to
movwf TRISA ; activa RA<3:0> como entradas

movlw 0x00 ;
movwf TRISB ;PORTB como salidas
BANK0 ;selecciona el banco 0
clrf PORTB ;borra PORTB
movlw 0XFF ;valor final de sector
movwf TEMP_PCL ;temporal del PCL
movlw 0x08 ;pagina donde esta ubicada la tabla(DIR 0X800 =pagina1)
movwf TEMP_PCLATH

;***********************************************PRINCIPIO DEL PROGRAMA********************************************************************
 
PRINCIPAL CALL LCD
REP GOTO REP ;fin del programa.


;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<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 LCDINI ;inicializa la LCD
call PRUEVAS ;salta a mensage de bienvenida
    return

;************************************************************ PRUEVAS ******************************************************   
         
PRUEVAS NOP
DATOS ;activa envio de datos
MOVLW 'E'
CALL BYTE
MOVLW 's'
CALL BYTE
MOVLW 'p'
CALL BYTE
MOVLW 'a'
CALL BYTE
MOVLW 'ñ'
CALL BYTE
MOVLW 'a'
CALL BYTE


COMANDOS ;activa envio de comandos
MOVLW B'00001110' ;activa display,y el cursor
CALL BYTE
MOVLW B'00000100' ;decremento del cursor
CALL BYTE

DATOS ;activa envio de datos
MOVLW ' '
CALL BYTE
MOVLW ' '
CALL BYTE

COMANDOS ;activa envio de comandos
MOVLW B'00000110' ;incremento del cursor
CALL BYTE

DATOS ;activa envio de datos
MOVLW b'11101110' ;letra "ñ"
CALL BYTE
MOVLW 'a'
CALL BYTE
MOVLW ' '
CALL BYTE
MOVLW 'F'
CALL BYTE
MOVLW 'C'
CALL BYTE
MOVLW '.'
CALL BYTE

COMANDOS
MOVLW B'00010100'; mueve el cursor a la derecha
CALL BYTE
MOVLW B'00010000'; mueve el cursor a la izquierda
CALL BYTE
MOVLW B'00010000'; mueve el cursor a la izquierda
CALL BYTE
MOVLW B'00001101'; display on,cursor on.
CALL BYTE
MOVLW B'00001111'; display on,cursor on,parpadeo on.
CALL BYTE
goto $-2
RETURN



;************************************************** INICIALIZACION LCD *************************************************************
LCDINI    COMANDOS ;selecciona el modo comando para la LCD
movlw 0X02 ;HOME. posicion 0 de la DD RAM.
          call    BYTE
          movlw  0X28 ;FUNCTION SET. bus 4bit,LCD 1 linea.
          call    BYTE
          movlw   0X0C ;DISPLAY ON/OFF. display on.
          call    BYTE
          movlw   0X06 ;ENTRY MODE.incremento del cursor
          call    BYTE
          movlw   0X01  ;CLEAR DISPLAY. borra display y activa incremento del cursor
          call    BYTE
          return




;********************************************** ENVIO DE NIBLES  A LA LCD ******************************************************

BYTE        BANK0 ;selcciona el banco 0
movwf   TEMPLCD ;guarda el contenido de W en registro temporal TEMPLCD
call LCD_BUSY ;comprueva si el LCD esta libre
            movlw   0x0f ;pon a 0 el nible alto de W
            andwf   PORTB,F ;borra el nible alto de portb sin tocar el nible bajo.
            movf    TEMPLCD,W ;carga el contenido de TEMPLCD en W
            andlw   0xf0 ;seleccionar el nible alto de W
            iorwf   PORTB,F ;manda nible alto de W a PORTB.
PULSO ;pulso de 1ms en terminal E de la LCD
            movlw   0x0f ;pon a 0 el nible alto de W
            andwf   PORTB,F ;borra el nible alto de portb sin tocar el nible bajo.
            swapf   TEMPLCD,W ;inbierte los nibles del registro TEMPLCD
            andlw   0xf0 ;seleccionar el alto bajo de W
            iorwf   PORTB,F ;manda nible alto de W a PORTB.
PULSO ;pulso de 1ms en terminal E de la LCD
return ;retorna


LCD_BUSY    call RETARDO ;retardo para evitar que la lectura del flag BUSY se quede bloqueado.
movfw PORTA ;carga en W el contenido de PORTA
andlw 0x01 ;guarda el valor del estado del bit RS
movwf TEMP_RS ;salva el valor de RS en el registro temporal
COMANDOS ;selecciona el modo comandos
BANK1 ;selecciona banco 1
          movlw    H'F0' ;
          movwf    TRISB        ;nible alto de PORT B como entrada
          BANK0    ;Selecciona el banco 0
READ          ;Pone el LCD en Modo RD "lectura"
          ENABLE          ;Activa el LCD (lectura del nible alto)
L_BUSY      btfsc    PORTB,7      ;Chequea bit de Busy
          goto    L_BUSY ;espera a que la LCD este libre
      DISABLE        ;Desactiva LCD

ENABLE ;Activa el LCD (lectura del nible bajo)
call RETARDO ;retardo de 1ms
DISABLE ;Desactiva LCD

          BANK1 ;selecciona banco 1
          clrf    TRISB        ;Puerta B salida
          BANK0 ;Selecciona el banco 0
          WRITE          ;Pone LCD en modo WR

movfw TEMP_RS ;restaura el valor de SR
iorwf PORTA,f ;activa en PORTA el bit RS
          return ;retorna


;************************************************ RETARDO DE VELOCIDAD DE DESPLAZAMIENTO **********************************************************
pausa1 clrf AUX2
pausae3 clrf AUX1
pausae2 clrf AUX0
pausae incf AUX0,f
btfss AUX0,7 ;valor de temporizacion
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
;************************************************ RETARDO 1mS **********************************************************

RETARDO  movlw   .248      ; 1 set numero de repeticion
        movwf   PDel0      ; 1 |
PLoop0  clrwdt              ; 1 clear watchdog
        decfsz  PDel0, 1  ; 1 + (1) es el tiempo 0  ?
        goto    PLoop0    ; 2 no, loop
PDelL1  goto PDelL2          ; 2 ciclos delay
PDelL2  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.

end

Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #66 en: 09 de Septiembre de 2011, 19:32:10 »
y ahora pongo el programa anterior pero para un PIC18F2550.

Código: [Seleccionar]

;************************************************** www.ingeniopic.com ***************************************************
; PROGRAMA : teclado_LCD_v1.asm
; Funcion : pruevas con teclado y lcd
;           
;   
;  Revision : 1.0        9/9/2011            Programa para : PIC18F2550
; CPU Clock : 48 MHz                     Reloj instruccion :
;       WDT : Deshabilitado                  Tipo de reloj : XT
; Code Prot : OFF           
;************************************************* www.ingeniopic.com **************************************************
;
;NOTA: se han activado las resistencias pull-up de PORTB.debido a que se nproducia un error al leer el bit BUSY de la LCD.
;      ya que las salidas de la lcd se quedan en alta impedancia.y el pic no leia correctamente D7.

LIST P=18F2550 ; Se emplea el PIC 16F876A
RADIX HEX ; Sistema de numeraci¢n hexadecimal
INCLUDE  "P18F2550.INC"
CONFIG FOSC = HS       ;Osc por XTAL 20mhz
      CONFIG DEBUG = OFF
      CONFIG PWRT = OFF
      CONFIG BOR  = OFF
      CONFIG WDT = OFF
      CONFIG MCLRE = ON
      CONFIG PBADEN = OFF
      CONFIG LVP = OFF
      CONFIG CP0 = OFF
      CONFIG CP1 = OFF
      CONFIG CP2 = OFF
      CONFIG CP3 = OFF
      CONFIG CPB = OFF
      CONFIG CPD = OFF
ERRORLEVEL -302

;ZONA DE ETIQUETAS
CBLOCK 0X20

AUX0
AUX1
AUX2
TEMPLCD
PDel0
PDel1
TEMP_RS
            FLAGS
ENDC


PULSO MACRO ;PULSO EN TERMINAL E DE LA LCD
bsf         PORTA,2
            call        RETARDO
            bcf         PORTA,2
ENDM



#define COMANDOS    bcf PORTA,0 ;Desactiva RS (modo comando)
    #define DATOS    bsf PORTA,0 ;Activa RS (modo datos)
#define E EQU 2
#define     RS EQU 0
#define READ bsf PORTA,1
#define WRITE bcf PORTA,1
#define ENABLE bsf PORTA,2 ;habilita LCD
#define DISABLE bcf PORTA,2 ;deshabilita LCD

;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
          ORG    0x00      ;Inicio en el Vector de Reset
  goto   INICIO      ;ir a la primera instruccion del programa


ORG 0X001C
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO    clrf    INTCON,ACCESS    ; deshabilita todas la interrupciones
clrf UCON,1
clrf FLAGS ;borra registro de banderas
movlw b'01110000' ;activa resistencias pull-up (evitar fallo lectura BUSY LCD)
movwf INTCON2




;***********************************************PRINCIPIO DEL PROGRAMA********************************************************************
 
PRINCIPAL CALL LCD
REP GOTO REP ;fin del programa.


;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<INICIALIZA LCD>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
         
LCD         clrf   INTCON ;deshabilita las interrupciones
          clrf   PORTA ;borra lacht del PORTA
clrf LATA
          movlw   0x0F
          movwf   ADCON1
movlw 0x07
movwf CMCON
          clrf    TRISA          ; Puerta A como salidas digitales

CLRF PORTB
CLRF LATB
CLRF TRISB


call LCDINI ;inicializa la LCD
call PRUEVAS ;salta a mensage de bienvenida
    return

;************************************************************ PRUEVAS ******************************************************   
         
PRUEVAS NOP
DATOS ;activa envio de datos
MOVLW 'E'
CALL BYTE
MOVLW 's'
CALL BYTE
MOVLW 'p'
CALL BYTE
MOVLW 'a'
CALL BYTE
MOVLW 'ñ'
CALL BYTE
MOVLW 'a'
CALL BYTE


COMANDOS ;activa envio de comandos
MOVLW B'00001110' ;activa display,y el cursor
CALL BYTE
MOVLW B'00000100' ;decremento del cursor
CALL BYTE

DATOS ;activa envio de datos
MOVLW ' '
CALL BYTE
MOVLW ' '
CALL BYTE

COMANDOS ;activa envio de comandos
MOVLW B'00000110' ;incremento del cursor
CALL BYTE

DATOS ;activa envio de datos
MOVLW b'11101110' ;letra "ñ"
CALL BYTE
MOVLW 'a'
CALL BYTE
MOVLW ' '
CALL BYTE
MOVLW 'F'
CALL BYTE
MOVLW 'C'
CALL BYTE
MOVLW '.'
CALL BYTE

COMANDOS
MOVLW B'00010100'; mueve el cursor a la derecha
CALL BYTE
MOVLW B'00010000'; mueve el cursor a la izquierda
CALL BYTE
MOVLW B'00010000'; mueve el cursor a la izquierda
CALL BYTE
MOVLW B'00001101'; display on,cursor on.
CALL BYTE
MOVLW B'00001111'; display on,cursor on,parpadeo on.
CALL BYTE
goto $-2
RETURN



;************************************************** INICIALIZACION LCD *************************************************************
LCDINI    COMANDOS ;selecciona el modo comando para la LCD
movlw 0X02 ;HOME. posicion 0 de la DD RAM.
          call    BYTE
          movlw  0X28 ;FUNCTION SET. bus 4bit,LCD 1 linea.
          call    BYTE
          movlw   0X0C ;DISPLAY ON/OFF. display on.
          call    BYTE
          movlw   0X06 ;ENTRY MODE.incremento del cursor
          call    BYTE
          movlw   0X01  ;CLEAR DISPLAY. borra display y activa incremento del cursor
          call    BYTE
          return




;********************************************** ENVIO DE NIBLES  A LA LCD ******************************************************

BYTE        movwf   TEMPLCD ;guarda el contenido de W en registro temporal TEMPLCD
call LCD_BUSY ;comprueva si el LCD esta libre
            movlw   0x0f ;pon a 0 el nible alto de W
            andwf   PORTB,F ;borra el nible alto de portb sin tocar el nible bajo.
            movf    TEMPLCD,W ;carga el contenido de TEMPLCD en W
            andlw   0xf0 ;seleccionar el nible alto de W
            iorwf   PORTB,F ;manda nible alto de W a PORTB.
PULSO ;pulso de 1ms en terminal E de la LCD
            movlw   0x0f ;pon a 0 el nible alto de W
            andwf   PORTB,F ;borra el nible alto de portb sin tocar el nible bajo.
            swapf   TEMPLCD,W ;inbierte los nibles del registro TEMPLCD
            andlw   0xf0 ;seleccionar el alto bajo de W
            iorwf   PORTB,F ;manda nible alto de W a PORTB.
PULSO ;pulso de 1ms en terminal E de la LCD
return ;retorna


LCD_BUSY    call RETARDO ;retardo para evitar que la lectura del flag BUSY se quede bloqueado.
movf PORTA,W ;carga en W el contenido de PORTA
andlw 0x01 ;guarda el valor del estado del bit RS
movwf TEMP_RS ;salva el valor de RS en el registro temporal
COMANDOS ;selecciona el modo comandos
movlw    H'F0' ;
          movwf    TRISB        ;nible alto de PORT B como entrada
READ          ;Pone el LCD en Modo RD "lectura"
ENABLE          ;Activa el LCD (lectura del nible alto)
L_BUSY      btfsc    PORTB,7      ;Chequea bit de Busy
          goto    L_BUSY ;espera a que la LCD este libre
      DISABLE        ;Desactiva LCD
ENABLE ;Activa el LCD (lectura del nible bajo)
call RETARDO ;retardo de 1ms
DISABLE ;Desactiva LCD
clrf    TRISB        ;Puerta B salida
          WRITE          ;Pone LCD en modo WR
movf TEMP_RS,W ;restaura el valor de SR
iorwf PORTA,f ;activa en PORTA el bit RS
          return ;retorna


;************************************************ RETARDO DE VELOCIDAD DE DESPLAZAMIENTO **********************************************************
pausa1 clrf AUX2
pausae3 clrf AUX1
pausae2 clrf AUX0
pausae incf AUX0,f
btfss AUX0,7 ;valor de temporizacion
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
;************************************************ RETARDO 1mS **********************************************************

RETARDO  movlw     .67       ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .35       ; 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 
        return              ; 2+2 Fin.



end

Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #67 en: 11 de Septiembre de 2011, 17:51:32 »
este programa envia caracteres a la LCD desde un teclado de 4x4.

Código: [Seleccionar]

;************************************************** www.ingeniopic.com ***************************************************
; PROGRAMA : teclado_LCD_v1.asm
; Funcion : pruevas con teclado y lcd
;           
;   
;  Revision : 1.0        9/9/2011            Programa para : PIC18F2550
; CPU Clock : 48 MHz                     Reloj instruccion :
;       WDT : Deshabilitado                  Tipo de reloj : XT
; Code Prot : OFF           
;************************************************* www.ingeniopic.com **************************************************
;
;NOTA: se han activado las resistencias pull-up de PORTB.debido a que se nproducia un error al leer el bit BUSY de la LCD.
;      ya que las salidas de la lcd se quedan en alta impedancia.y el pic no leia correctamente D7.

LIST P=18F2550 ; Se emplea el PIC 18F2550
RADIX HEX ; Sistema de numeraci¢n hexadecimal
INCLUDE  "P18F2550.INC"
CONFIG FOSC = HS       ;Osc por XTAL 20mhz
      CONFIG DEBUG = OFF
      CONFIG PWRT = OFF
      CONFIG BOR  = OFF
      CONFIG WDT = OFF
      CONFIG MCLRE = ON
      CONFIG PBADEN = OFF
      CONFIG LVP = OFF
      CONFIG CP0 = OFF
      CONFIG CP1 = OFF
      CONFIG CP2 = OFF
      CONFIG CP3 = OFF
      CONFIG CPB = OFF
      CONFIG CPD = OFF
ERRORLEVEL -302

;ZONA DE ETIQUETAS
CBLOCK 0X20

AUX0
AUX1
AUX2
TEMPLCD
PDel0
PDel1
TEMP_RS
            FLAGS
ROTA_KEYB
ENDC


PULSO MACRO ;PULSO EN TERMINAL E DE LA LCD
bsf         PORTA,2
            call        RETARDO
            bcf         PORTA,2
ENDM



#define COMANDOS    bcf PORTA,0 ;Desactiva RS (modo comando)
    #define DATOS    bsf PORTA,0 ;Activa RS (modo datos)
#define E EQU 2
#define     RS EQU 0
#define READ bsf PORTA,1
#define WRITE bcf PORTA,1
#define ENABLE bsf PORTA,2 ;habilita LCD
#define DISABLE bcf PORTA,2 ;deshabilita LCD
#define GIE_ON bsf INTCON,GIE
#define GIE_OFF bcf INTCON,GIE

;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
          ORG    0x00      ;Inicio en el Vector de Reset
  goto   INICIO      ;ir a la primera instruccion del programa
;<<<<<<---------------------- VECTOR DE INTERRUPCIONES ALTA PRIORIDAD ---------------->>>>>>>>>>
ORG 0X08
goto INTERRUPCIONES
;<<<<<<---------------------- VECTOR DE INTERRUPCIONES BAJA PRIORIDAD ---------------->>>>>>>>>>
ORG 0X18
goto INTERRUPCIONES


ORG 0X001C
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO   
movlw b'00001000' ;permiso de la interrupción por cambio de estado del PORTB
movwf INTCON
clrf UCON,1
clrf FLAGS ;borra registro de banderas
movlw b'01110000' ;activa resistencias pull-up (evitar fallo lectura BUSY LCD)
movwf INTCON2

clrf PIE1,1      ; deshabilita interrupciones perifericas
movlw 0x01
movwf ROTA_KEYB




;***********************************************PRINCIPIO DEL PROGRAMA********************************************************************
 
PRINCIPAL CALL LCD
REP CALL REFR_KEYB
GOTO REP ;fin del programa.


;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<INICIALIZA LCD>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
         
LCD         GIE_OFF;clrf   INTCON ;deshabilita las interrupciones
          ;clrf   PORTA ;borra lacht del PORTA
;MOVLW 0XFF
;MOVWF PORTA
;MOVLW 0XFF
CLRF LATA
          movlw   0x0F
          movwf   ADCON1
movlw 0x07
movwf CMCON
          clrf    TRISA          ; Puerta A como salidas digitales
;MOVLW 0XFF
;MOVWF PORTA
;CLRF PORTB
;movlw 0x0f
;movwf TRISB
CLRF LATB
;CLRF TRISB
movlw 0x0f
movwf TRISB
clrf UCON,1


call LCDINI ;inicializa la LCD
call PRUEVAS ;salta a mensage de bienvenida
    return

;************************************************************ PRUEVAS ******************************************************   
         
PRUEVAS NOP
DATOS ;activa envio de datos LCD

MOVLW 'C' ;texto de la primera fila
CALL BYTE
MOVLW 'l'
CALL BYTE
MOVLW 'a'
CALL BYTE
MOVLW 'v'
CALL BYTE
MOVLW 'e'
CALL BYTE
MOVLW ' '
CALL BYTE
MOVLW 'D'
CALL BYTE
MOVLW 'e'
CALL BYTE
MOVLW ' '
CALL BYTE
MOVLW 'A'
CALL BYTE
MOVLW 'c'
CALL BYTE
MOVLW 'c'
CALL BYTE
MOVLW 'e'
CALL BYTE
MOVLW 's'
CALL BYTE
MOVLW 'o'
CALL BYTE


COMANDOS ;activa envio de comandos LCD


MOVLW B'00001111' ;display on,cursor on,parpadeo on.
CALL BYTE
MOVLW 0XC0     ;principio de la segunda linea
CALL BYTE
DATOS ;activa envio de datos LCD

return

REFR_KEYB movlw 0Xf0 ;nible bajo de POTB como salida
movwf TRISB
movf PORTB,W ;leer PORTB para borrar RBIF por una condición de unión mal hecha
bcf INTCON,RBIF ;se evita que salte la interrupcion al ejecutar el programa
rlncf ROTA_KEYB,F ;rota hacia la izquierda
btfsc ROTA_KEYB,4 ;comprueva si el bit se ha salido del nible bajo.
swapf ROTA_KEYB,F ;si es asi,invierte los nibles
movf ROTA_KEYB,W ;guarda el valor del registro de rotacion en W
andlw 0X0F ;tener en cuenta solo el nible bajo
movwf PORTB ;sacalo por PORTB
GIE_ON ;habilita interrupciones generales
return ;retorna

;************************************************** INICIALIZACION LCD *************************************************************
LCDINI    COMANDOS ;selecciona el modo comando para la LCD
movlw 0X02 ;HOME. posicion 0 de la DD RAM.
          call    BYTE
          movlw  0X28 ;FUNCTION SET. bus 4bit,LCD 2 linea.
          call    BYTE
          movlw   0X0C ;DISPLAY ON/OFF. display on.
          call    BYTE
          movlw   0X06 ;ENTRY MODE.incremento del cursor
          call    BYTE
          movlw   0X01  ;CLEAR DISPLAY. borra display y activa incremento del cursor
          call    BYTE
          return




;********************************************** ENVIO DE NIBLES  A LA LCD ******************************************************

BYTE        movwf   TEMPLCD ;guarda el contenido de W en registro temporal TEMPLCD
call LCD_BUSY ;comprueva si el LCD esta libre
            movlw   0x0f ;pon a 0 el nible alto de W
            andwf   PORTB,F ;borra el nible alto de portb sin tocar el nible bajo.
            movf    TEMPLCD,W ;carga el contenido de TEMPLCD en W
            andlw   0xf0 ;seleccionar el nible alto de W
            iorwf   PORTB,F ;manda nible alto de W a PORTB.
PULSO ;pulso de 1ms en terminal E de la LCD
            movlw   0x0f ;pon a 0 el nible alto de W
            andwf   PORTB,F ;borra el nible alto de portb sin tocar el nible bajo.
            swapf   TEMPLCD,W ;inbierte los nibles del registro TEMPLCD
            andlw   0xf0 ;seleccionar el alto bajo de W
            iorwf   PORTB,F ;manda nible alto de W a PORTB.
PULSO ;pulso de 1ms en terminal E de la LCD
return ;retorna


LCD_BUSY    call RETARDO ;retardo para evitar que la lectura del flag BUSY se quede bloqueado.
movf PORTA,W ;carga en W el contenido de PORTA
andlw 0x01 ;guarda el valor del estado del bit RS
movwf TEMP_RS ;salva el valor de RS en el registro temporal
COMANDOS ;selecciona el modo comandos
movlw    H'FF' ;
          movwf    TRISB        ;PORT B como entrada
;MOVWF LATB
READ          ;Pone el LCD en Modo RD "lectura"
ENABLE          ;Activa el LCD (lectura del nible alto)
L_BUSY      btfsc    PORTB,7      ;Chequea bit de Busy
          goto    L_BUSY ;espera a que la LCD este libre
      DISABLE        ;Desactiva LCD
ENABLE ;Activa el LCD (lectura del nible bajo)
call RETARDO ;retardo de 1ms
DISABLE ;Desactiva LCD

movlw 0X0F ;nible bajo como entradas
movwf TRISB
bsf INTCON2,RBPU ;deshabilita resistencias pull-up de PORTB
;MOVWF LATB
;clrf    PORTB        ;Puerta B salida
          WRITE          ;Pone LCD en modo WR
movf TEMP_RS,W ;restaura el valor de SR
iorwf PORTA,f ;activa en PORTA el bit RS
          return ;retorna


;************************************************ RETARDO DE VELOCIDAD DE DESPLAZAMIENTO **********************************************************
;pausa1 clrf AUX2
pausae3 clrf AUX1
pausae2 clrf AUX0
pausae incf AUX0,f
btfss AUX0,7 ;valor de temporizacion
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
;************************************************ RETARDO 1mS **********************************************************

RETARDO  movlw     .67       ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .35       ; 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  return              ; 2+2 Fin.


INTERRUPCIONES

btfsc INTCON,RBIF
call TECLADO
retfie

TECLADO movf PORTB,W ;leer PORTB para borrar RBIF por una condición de unión mal hecha
bcf INTCON,RBIF ;borra flag de interrupcion por cambio de estado de PORTB

;comparacion de entradas por PORTB desde el teclado
movlw 0x14
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_1
movlw 0x24
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_2
movlw 0x44
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_3
movlw 0x81
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_A
movlw 0x12
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_4
movlw 0x22
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_5
movlw 0x42
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_6
movlw 0x82
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_B
movlw 0x11
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_7
movlw 0x21
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_8
movlw 0x41
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_9
movlw 0x84
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_C
movlw 0x18
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_F
movlw 0x28
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_0
movlw 0x48
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_E
movlw 0x88
xorwf PORTB,W
btfsc STATUS,Z
goto TECLA_D



retfie


TECLA_1 btfsc PORTB,4 ;comprueva si la tecla esta pulsada
goto $-2 ;si esta pulsada,espera
movlw '1' ;dato a enviar por la LCD
call BYTE ;envia dato
return
TECLA_2 btfsc PORTB,5
goto $-2
movlw '2'
call BYTE
return
TECLA_3 btfsc PORTB,6
goto $-2
movlw '3'
call BYTE
return
TECLA_A btfsc PORTB,7
goto $-2
movlw 'A'
call BYTE
return
TECLA_4 btfsc PORTB,4
goto $-2
movlw '4'
call BYTE
return
TECLA_5 btfsc PORTB,5
goto $-2
movlw '5'
call BYTE
return
TECLA_6 btfsc PORTB,6
goto $-2
movlw '6'
call BYTE
return
TECLA_B btfsc PORTB,7
goto $-2
movlw 'B'
call BYTE
return
TECLA_7 btfsc PORTB,4
goto $-2
movlw '7'
call BYTE
return
TECLA_8 btfsc PORTB,5
goto $-2
movlw '8'
call BYTE
return
TECLA_9 btfsc PORTB,6
goto $-2
movlw '9'
call BYTE
return
TECLA_C btfsc PORTB,7
goto $-2
movlw 'C'
call BYTE
return
TECLA_F btfsc PORTB,4
goto $-2
movlw 'F'
call BYTE
return
TECLA_0 btfsc PORTB,5
goto $-2
movlw '0'
call BYTE
return
TECLA_E btfsc PORTB,6
goto $-2
movlw 'E'
call BYTE
return
TECLA_D btfsc PORTB,7
goto $-2
movlw 'D'
call BYTE
return

end

Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #68 en: 23 de Septiembre de 2011, 17:02:30 »
hola de nuevo.el programa que expongo al igual que alguno de los anteriores.tambien pongo el ejemplo de visualizar el texto del quijote en una LCD de 16
caracteres por 2 lineas.
en este caso estoy usando el PIC18F2550.y en vez de usar el direccionamiento indirecto para leer las tablas de caracteres,uso las instrucciones
especiales que tiene este pic para la lectura de tablas.
solo hay que indicarle en los registros TBLPTRL y TBLPTRH el principio de la direccion eeprom de donde esta la tabla hubicada.
y en TBLPTRL_TOP y TBLPTRH_TOP,la direccion eeprom del ultimo caracter a leer de la tabla.

si modificamos adecuadamente el programa.tambien podriamos enviar trozos de texto en vez de una frase tan larga.

tambien pondre el asm y la simulacion en proteus para provarlo.

Código: [Seleccionar]
;************************************************** www.ingeniopic.com ***************************************************
; PROGRAMA : mensage_18F_tblptr_4bit
; Funcion : visualizacion de un mensage en una LCD de 16caracteres 2 lineas.en el modo a 4bit.sin el sistema de direccionamiento indirecto
;           
;   
;  Revision : 1.0        22/9/2011            Programa para : PIC18F2550
; CPU Clock : 48 MHz                     Reloj instruccion :
;       WDT : Deshabilitado                  Tipo de reloj : XT
; Code Prot : OFF           
;************************************************* www.ingeniopic.com **************************************************
;


LIST P=18F2550 ; Se emplea el PIC 18F2550
RADIX HEX ; Sistema de numeraci¢n hexadecimal
INCLUDE  "P18F2550.INC"
CONFIG FOSC = HS       ;Osc por XTAL 20mhz
      CONFIG DEBUG = OFF
      CONFIG PWRT = OFF
      CONFIG BOR  = OFF
      CONFIG WDT = OFF
      CONFIG MCLRE = ON
      CONFIG PBADEN = OFF
      CONFIG LVP = OFF
      CONFIG CP0 = OFF
      CONFIG CP1 = OFF
      CONFIG CP2 = OFF
      CONFIG CP3 = OFF
      CONFIG CPB = OFF
      CONFIG CPD = OFF
ERRORLEVEL -302

;ZONA DE ETIQUETAS
CBLOCK 0X20

AUX0
AUX1
AUX2
TEMPLCD
PDel0
PDel1
TEMP_RS
            FLAGS
DIR_EEPROM
TBLPTRL_TOP
TBLPTRH_TOP
CONT_CARACTER
RESUL

ENDC


PULSO MACRO ;PULSO EN TERMINAL E DE LA LCD
bsf         PORTA,2
            call        RETARDO
            bcf         PORTA,2
ENDM


#define COMANDOS    bcf PORTA,0 ;Desactiva RS (modo comando)
    #define DATOS    bsf PORTA,0 ;Activa RS (modo datos)
#define E EQU 2
#define     RS EQU 0
#define READ bsf PORTA,1
#define WRITE bcf PORTA,1
#define ENABLE bsf PORTA,2 ;habilita LCD
#define DISABLE bcf PORTA,2 ;deshabilita LCD


;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
          ORG    0x00      ;Inicio en el Vector de Reset
  goto   INICIO      ;ir a la primera instruccion del programa
;<<<<<<---------------------- VECTOR DE INTERRUPCIONES ALTA PRIORIDAD ---------------->>>>>>>>>>
;ORG 0X08
;goto INTERRUPCIONES
;<<<<<<---------------------- VECTOR DE INTERRUPCIONES BAJA PRIORIDAD ---------------->>>>>>>>>>
;ORG 0X18
;goto INTERRUPCIONES


ORG 0X001C
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO   
movlw b'00001000' ;permiso de la interrupción por cambio de estado del PORTB
movwf INTCON
clrf UCON,1
clrf FLAGS ;borra registro de banderas
movlw b'01110000' ;activa resistencias pull-up (evitar fallo lectura BUSY LCD)
movwf INTCON2

clrf PIE1,1      ; deshabilita interrupciones perifericas






;***********************************************PRINCIPIO DEL PROGRAMA********************************************************************
 
PRINCIPAL
CALL LCD




;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<INICIALIZA LCD>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
         
LCD         clrf LATA
          movlw   0x0F
          movwf   ADCON1
movlw 0x07
movwf CMCON
          clrf    TRISA          ; Puerta A como salidas digitales
bsf PORTA,3
clrf LATB
          movlw 0x07

          clrf    TRISB   

movlw 0x0f
movwf TRISB
clrf UCON,1
movlw b'10001000'
movwf T0CON
clrf TMR0L
clrf TMR0H
movlw 0XFF
movwf DIR_EEPROM ;carga la direccion


call LCDINI ;inicializa la LCD
call PRUEVAS ;salta a mensage de bienvenida
    return

;************************************************************ PRUEVAS ******************************************************   
         
PRUEVAS call BIENVENIDA
goto PRUEVAS

;************************************************** INICIALIZACION LCD *************************************************************
LCDINI    COMANDOS ;selecciona el modo comando para la LCD
movlw 0X02 ;HOME. posicion 0 de la DD RAM.
          call    BYTE
          movlw  0X28 ;FUNCTION SET. bus 4bit,LCD 2 linea.
          call    BYTE
          movlw   0X0C ;DISPLAY ON/OFF. display on.
          call    BYTE
          movlw   0X06 ;ENTRY MODE.incremento del cursor
          call    BYTE
          movlw   0X01  ;CLEAR DISPLAY. borra display y activa incremento del cursor
          call    BYTE
          return

;********************************************** ENVIO DE NIBLES  A LA LCD ******************************************************

BYTE        movwf   TEMPLCD ;guarda el contenido de W en registro temporal TEMPLCD
call LCD_BUSY ;comprueva si el LCD esta libre
            movlw   0x0f ;pon a 0 el nible alto de W
            andwf   PORTB,F ;borra el nible alto de portb sin tocar el nible bajo.
            movf    TEMPLCD,W ;carga el contenido de TEMPLCD en W
            andlw   0xf0 ;seleccionar el nible alto de W
            iorwf   PORTB,F ;manda nible alto de W a PORTB.
PULSO ;pulso de 1ms en terminal E de la LCD
            movlw   0x0f ;pon a 0 el nible alto de W
            andwf   PORTB,F ;borra el nible alto de portb sin tocar el nible bajo.
            swapf   TEMPLCD,W ;inbierte los nibles del registro TEMPLCD
            andlw   0xf0 ;seleccionar el alto bajo de W
            iorwf   PORTB,F ;manda nible alto de W a PORTB.
PULSO ;pulso de 1ms en terminal E de la LCD
return ;retorna


LCD_BUSY    call RETARDO ;retardo para evitar que la lectura del flag BUSY se quede bloqueado.
movf PORTA,W ;carga en W el contenido de PORTA
andlw 0x01 ;guarda el valor del estado del bit RS
movwf TEMP_RS ;salva el valor de RS en el registro temporal
COMANDOS ;selecciona el modo comandos
movlw    H'FF' ;
          movwf    TRISB        ;PORT B como entrada

READ          ;Pone el LCD en Modo RD "lectura"
ENABLE          ;Activa el LCD (lectura del nible alto)
L_BUSY      btfsc    PORTB,7      ;Chequea bit de Busy
          goto    L_BUSY ;espera a que la LCD este libre
      DISABLE        ;Desactiva LCD
ENABLE ;Activa el LCD (lectura del nible bajo)
call RETARDO ;retardo de 1ms
DISABLE ;Desactiva LCD

movlw 0X0F ;nible bajo como entradas
movwf TRISB
bsf INTCON2,RBPU ;deshabilita resistencias pull-up de PORTB
WRITE          ;Pone LCD en modo WR
movf TEMP_RS,W ;restaura el valor de SR
iorwf PORTA,f ;activa en PORTA el bit RS
          return ;retorna


;************************************************ RETARDO DE VELOCIDAD DE DESPLAZAMIENTO **********************************************************
pausa1 clrf AUX2
pausae3 clrf AUX1
pausae2 clrf AUX0
pausae incf AUX0,f
btfss AUX0,7 ;valor de temporizacion
goto pausae
incf AUX1,f
btfss AUX1,7 ;valor de temporizacion
goto pausae2
incf AUX2,f
btfss AUX2,3 ;velor de temporizacion
goto pausae3
return




;************************************************ RETARDO 1mS **********************************************************

RETARDO  movlw     .5;.67       ; 1 set numero de repeticion  (B)
        movwf     PDel0      ; 1 |
PLoop1  movlw     .5;.35       ; 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  return              ; 2+2 Fin.


;************************************************************MENSAGE DE BIENVENIDA******************************************************   
         
BIENVENIDA clrf CONT_CARACTER ;incrementa registro contador de caracteres
clrf    RESUL ;borra registro RESUL
movlw 0x00
movwf TBLPTRL ;direccion baja de principio de frase
movlw 0x02
movwf TBLPTRH ;direccion alta de principio de frase

movlw 0xfe
movwf TBLPTRL_TOP ;byte bajo de caracteres a enviar
movlw 0x7f
movwf TBLPTRH_TOP ;byte alto de caracteres a enviar

retorn      DATOS ;selecciona modo de envio de datos
call TABLA ;salta a tabla de caraceres
btfsc FLAGS,0 ;comprueva si se ha llegado al ultimo caracter a leer
return ;si ha llegado.fin del programa
incf RESUL,F ;incrementa resul
movf TABLAT,W ;mete valor leido del byte bajo de tabla en W
call    BYTE ;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

REP COMANDOS ;selecciona modo de envio de comandos
movlw b'00011100' ;comando de rotacion a izquierdas
call BYTE ;envia comando
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 REP
movlw .32 ;numero de bytes visibles de la LCD (LCD 16x2)
subwf TBLPTRL,F ;desplaza el indice para grabar los 16 ultimos caracteres del primer mensage de la ddr,en los 16 primeros caracteres del siguiente mensage
btfss STATUS,C ;comprueva si al restar ha habido acarreo
decf TBLPTRH,f ;si lo ha habido decrementa TBLPTRH (inprescindible para detectar fin de frase)
clrf CONT_CARACTER ;borra contador de caracteres
clrf    RESUL ;borra RESUL

COMANDOS ;selecciona el modo comando para la LCD
movlw 0X01 ;HOME. posicion 0 de la DD RAM.
          call    BYTE ;envia comando
goto retorn ;siguiente mensage

TABLA tblrd+* ;incrementa puntero de tabla antes de su lectura
tblrd+* ;incrementa puntero de tabla antes de su lectura
movf TBLPTRL,W ;carga en W el contenido de TBLPTRL
xorwf TBLPTRL_TOP,w ;compara el valor con el valor tope del byte bajo
btfss STATUS,Z ;si es diferente
return ;retorna
movf TBLPTRH,W ;carga en W el contenido de TBLPTRH
xorwf TBLPTRH_TOP,w ;compara el valor con el valor tope del byte alto
btfss STATUS,Z ;si es diferente
return ;retorna
bsf FLAGS,0 ;activa bit de fin de mensage
return ;retorna

org 0x200

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 0x2ff8

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 encajencaje, sino morrión simple; mas a esto suplió su indu"
dt "stria, porque de cartones hizo un modo de media celada, que encajada con el morrión, hacía una apariencia de celada entera. Es verdad que para probar si era fuerte"
dt ", y podía estar al riesgo de una cuchillada, sacó su espada, y le dió dos golpes, y con el primero y en un punto deshizo lo que había hecho en una semana: y no dej"
dt "ó de parecerle mal la facilidad con que la había hecho pedazos, y por asegurarse de este peligro, lo tornó a hacer de nuevo, poniéndole unas barras de hierro por d"
dt "e dentro de tal manera, que él quedó satisfecho de su fortaleza; y, sin querer hacer nueva experiencia de ella, la diputó y tuvo por celada finísima de encaje. Fue"
dt " luego a ver a su rocín, y aunque tenía más cuartos que un real, y más tachas que el caballo de Gonela, que tantum pellis, et ossa fuit, le pareció que ni el Bucéf"
dt "alo de Alejandro, ni Babieca el del Cid con él se igualaban. Cuatro días se le pasaron en imaginar qué nombre le podría: porque, según se decía él a sí mismo, no e"
dt "ra razón que caballo de caballero tan famoso, y tan bueno él por sí, estuviese sin nombre conocido; y así procuraba acomodársele, de manera que declarase quien hab"
dt "ía sido, antes que fuese de caballero andante, y lo que era entones: pues estaba muy puesto en razón, que mudando su señor estado, mudase él también el nombre; y l"
dt "e cobrase famoso y de estruendo, como convenía a la nueva orden y al nuevo ejercicio que ya profesaba: y así después de muchos nombres que formó, borró y quitó, añ"
dt "adió, deshizo y tornó a hacer en su memoria e imaginación, al fin le vino a llamar Rocinante, nombre a su parecer alto, sonoro y significativo de lo que había sido"
dt " cuando fue rocín, antes de lo que ahora era, que era antes y primero de todos los rocines del mundo. Puesto nombre y tan a su gusto a su caballo, quiso ponérsele "
dt "a sí mismo, y en este pensamiento, duró otros ocho días, y al cabo se vino a llamar don Quijote, de donde como queda dicho, tomaron ocasión los autores de esta tan"
dt " verdadera historia, que sin duda se debía llamar Quijada, y no Quesada como otros quisieron decir. Pero acordándose que el valeroso Amadís, no sólo se había conte"
dt "ntado con llamarse Amadís a secas, sino que añadió el nombre de su reino y patria, por hacerla famosa, y se llamó Amadís de Gaula, así quiso, como buen caballero, "
dt "añadir al suyo el nombre de la suya, y llamarse don Quijote de la Mancha, con que a su parecer declaraba muy al vivo su linaje y patria, y la honraba con tomar el "
dt "sobrenombre della. Limpias, pues, sus armas, hecho del morrión celada, puesto nombre a su rocín, y confirmándose a sí mismo, se dió a entender que no le faltaba ot"
dt "ra cosa, sino buscar una dama de quien enamorarse, porque el caballero andante sin amores, era árbol sin hojas y sin fruto, y cuerpo sin alma. Decíase él: si yo po"
dt "r malos de mis pecados, por por mi buena suerte, me encuentro por ahí con algún gigante, como de ordinario les acontece a los caballeros andantes, y le derribo de "
dt "un encuentro, o le parto por mitad del cuerpo, o finalmente, le venzo y le rindo, ¿no será bien tener a quién enviarle presentado, y que entre y se hinque de rodil"
dt "las ante mi dulce señora, y diga con voz humilde y rendida: yo señora, soy el gigante Caraculiambro, señor de la ínsula Malindrania, a quien venció en singular bat"
dt "alla el jamás como se debe alabado caballero D. Quijote de la Mancha, el cual me mandó que me presentase ante la vuestra merced, para que la vuestra grandeza dispo"
dt "nga de mí a su talante? ¡Oh, cómo se holgó nuestro buen caballero, cuando hubo hecho este discurso, y más cuando halló a quién dar nombre de su dama! Y fue, a lo q"
dt "ue se cree, que en un lugar cerca del suyo había una moza labradora de muy buen parecer, de quien él un tiempo anduvo enamorado, aunque según se entiende, ellajamá"
dt "s lo supo ni se dió cata de ello. Llamábase Aldonza Lorenzo, y a esta le pareció ser bien darle título de señora de sus pensamientos; y buscándole nombre que no de"
dt "sdijese mucho del suyo, y que tirase y se encaminase al de princesa y gran señora, vino a llamarla Dulcinea del Toboso, porque era natural del Toboso, nombre a su "
dt "parecer músico y peregrino y significativo, como todos los demás que a él y a sus cosas había puesto.Hechas, pues, estas prevenciones, no quiso aguardar más tiempo"
dt " a poner en efecto su pensamiento, apretándole a ello la falta que él pensaba que hacía en el mundo su tardanza, según eran los agravios que pensaba deshacer, tuer"
dt "tos que enderezar, sinrazones que enmendar, y abusos que mejorar, y deudas que satisfacer; y así, sin dar parte a persona alguna de su intención, y sin que nadie l"
dt "e viese, una mañana, antes del día (que era uno de los calurosos del mes de Julio), se armó de todas sus armas, subió sobre Rocinante, puesta su mal compuesta cela"
dt "da, embrazó su adarga, tomó su lanza, y por la puerta falsa de un corral, salió al campo con grandísimo contento y alborozo de ver con cuánta facilidad había dado "
dt "principio a su buen deseo. Mas apenas se vió en el campo, cuando le asaltó un pensamiento terrible, y tal, que por poco le hiciera dejar la comenzada empresa: y fu"
dt "e que le vino a la memoria que no era armado caballero, y que, conforme a la ley de caballería, ni podía ni debía tomar armas con ningún caballero; y puesto qeu lo"
dt " fuera, había de llevar armas blancas, como novel caballero, sin empresa en el escudo, hasta que por su esfuerzo la ganase.Estos pensamientos le hicieron titubear "
dt "en su propósito; mas pudiendo más su locura que otra razón alguna, propuso de hacerse armar caballero del primero que topase, a imitación de otros muchos que así l"
dt "o hicieron, según él había leído en los libros que tal le tenían. En lo de las armas blancas pensaba limpiarlas de manera, en teniendo lugar, que lo fuesen más que"
dt " un armiño: y con esto se quietó y prosiguió su camino, sin llevar otro que el que su caballo quería, creyendo que en aquello consistía la fuerza de las aventuras."
dt " Yendo, pues, caminando nuestro flamante aventurero, iba hablando consigo mismo, y diciendo: ¿Quién duda sino que en los venideros tiempos, ciando salga a luz la v"
dt "erdadera historia de mis famosos hechos, que el sabio que los escribiere, no ponga, cuando llegue a contar esta mi primera salida tan de mañana, de esta manera? Ap"
dt "enas había el rubicundo Apolo tendido por la faz de la ancha y espaciosa tierra las doradas hebras de sus hermosos cabellos, y apenas los pequeños y pintados pajar"
dt "illos con sus arpadas lenguas habían saludado con dulce y meliflua armonía la venida de la rosada aurora que dejando la blanda cama del celoso marido, por las puer"
dt "tas y balcones del manchego horizonte a los mortales se mostraba, cuando el famoso caballero D. Quijote de la Mancha, dejando las ociosas plumas, subió sobre su fa"
dt "moso caballo Rocinante, y comenzó a caminar por el antiguo y conocido campo de Montiel. (Y era la verdad que por él caminaba) y añadió diciendo: dichosa edad, y si"
dt "glodichoso aquel adonde saldrán a luz las famosas hazañas mías, dignas de entallarse en bronce, esculpirse en mármoles y esculpirse en mármoles y pintarse en tabla"
dt "s para memoria en lo futuro. ¡Oh tú, sabio encantador, quienquiera que seas, a quien ha de tocar el ser coronista de esta peregrina historia! Ruégote que no te olv"
dt "ides de mi buen Rocinante compañero eterno mío en todos mis caminos y carreras. Luego volvía diciendo, como si verdaderamente fuera enamorado: ¡Oh, princesa Dulcin"
dt "ea, señora de este cautivo corazón! Mucho agravio me habedes fecho en despedirme y reprocharme con el riguroso afincamiento de mandarme no parecer ante la vuestra "
dt "fermosura. Plégaos, señora, de membraros de este vuestro sujeto corazón, que tantas cuitas por vuestro amor padece. Con estos iba ensartando otros disparates, todo"
dt "s al modo de los que sus libros le habían enseñado, imitando en cuanto podía su lenguaje; y con esto caminaba tan despaico, y el sol entraba tan apriesa y con tant"
dt "o ardor, que fuera bastante a derretirle los sesos, si algunos tuviera. Casi todo aquel día caminó sin acontecerle cosa que de contar fuese, de lo cual se desesper"
dt "aba, poerque quisiera topar luego, con quien hacer experiencia del valor de su fuerte brazo.Autores hay que dicen que la primera aventura que le avino fue la de Pu"
dt "erto Lápice; otros dicen que la de los molinos de viento; pero lo que yo he podido averiguar en este caso, y lo que he hallado escrito en los anales de la Mancha, "
dt "es que él anduvo todo aquel día, y al anochecer, su rocín y él se hallaron cansados y muertos de hambre; y que mirando a todas partes, por ver si descubriría algún"
dt " castillo o alguna majada de pastores donde recogerse, y adonde pudiese remediar su mucha necesidad, vió no lejos del camino por donde iba una venta, que fucomo si"
dt " viera una estrella, que a los portales, si no a los alcázares de su redención, le encaminaba. Dióse priesa a caminar, y llegó a ella a tiempo que anochecía. Estab"
dt "an acaso a la puerta dos mujeres mozas, de estas que llaman del partido, las cuales iban a Sevilla con unos arrieros, que en la venta aquella noche acertaron a hac"
dt "er jornada; y como a nuestro aventurero todo cuanto pensaba, veía o imaginaba, le parecía ser hecho y pasar al modo de lo que había leído, luego que vió la venta s"
dt "e le representó que era un castillo con sus cuatro torres y chapiteles de luciente plata, sin faltarle su puente levadizo y honda cava, con todos aquellos adherent"
dt "es que semejantes castillos se pintan.Fuese llegando a la venta (que a él le parecía castillo), y a poco trecho de ella detuvo las riendas a Rocinante, esperando q"
dt "ue algún enano se pusiese entre las almenas a dar señal con alguna trompeta de que llegaba caballero al castillo; pero como vió que se tardaban, y que Rocinante se"
dt " daba priesa por llegar a la caballeriza, se llegó a la puerta de la venta, y vió a las dos distraídas mozas que allí estaban, que a él le parecieron dos hermosas "
dt "doncellas, o dos graciosas damas, que delante de la puerta del castillo se estaban solazando. En esto sucedió acaso que un porquero, que andaba recogiendo"


end

Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #69 en: 22 de Diciembre de 2013, 13:58:32 »
esta rutina es para generar el crc del polinomio 0x131 usado tambien para la generacion de crc del DS18B20.

para su funcionamiento solo hay que cargar la zona de memoria donde esta el primer byte de la trama a generar.en este caso(Scratchpad1)
y luego los bytes a gestionar.
posteriormente llamamos a la rutina GEN_CRC.



Código: [Seleccionar]
CBLOCK   0X22

Scratchpad1
Scratchpad2
Scratchpad3
Scratchpad4
Scratchpad5
Scratchpad6
Scratchpad7
Scratchpad8
Scratchpad9
CRC
CONT
CONT2
INDEX
TEMP_CRC
FLAGS_DS18B20
ZONA_MEM

ENDC


#define POLY 0X8C ;polinomio invertido 0x131
#define CRC_OK bsf FLAGS_DS18B20,0
#define CRC_NOK bcf FLAGS_DS18B20,0


PRINCIPAL call GEN_CRC
btfsc FLAGS_DS18B20,0 ;comprueba si la trama tiene un crc correcto
call siguente programa ;si el crc es correcto continua el programa
goto PRINCIPAL





movlw Scratchpad1
movwf ZONA_MEM
movlw 0x08 ;0x08 para leer el Scratchpad y 0x07 para leer la ROM "identidad"
call GEN_CRC

;**************************************************** GEN_CRC **************************************************************

GEN_CRC movwf CONT2 ;carga en CONT2 la cantidad de bytes a generar
CRC_NOK ;borra el flag de coincidencia de crc
movlb 0x00 ;seleccion de banco
movlw 0X00 ;valor de direccion del banco 0 de la flash
movwf FSR1H ;selecciona el banco 0 de la eeprom de programa.
movlw Scratchpad1 ;principio de la zona de datos donde se ubica la trama a convertir
movwf FSR1L ;introduce el valor en la direccion a leer
movff INDF1,TEMP_CRC ;lee el valor
clrf INDEX ;limpia variable INDEX

PROX movf INDF1,W ;carga valor de la trama
xorwf INDEX,W ;operacion xor de W con INDEX
      call CALC_CRC8 ;llamada a la rutina de calclo de CRC del byte leido
      movwf INDEX ;introduce el CRC generado en INDEX
      incf FSR1L,F ;siguiente direccion del byte a leer
      decfsz CONT2,F ;decrementa el contador de bytes analizados
      goto PROX ;siguente byte a leer
 
movf INDEX,W ;carga el crc calculado en W
xorwf Scratchpad9,W ;compara el crc recibido con el crc generado
btfsc STATUS,Z ;comprueba si son iguales
CRC_OK ;si son iguales activa flag
        return ;return
;*************************************************** CALC_CRC8 *************************************************************     
;Generacion del CRC

CALC_CRC8 movwf CRC ;carga en CRC el  byte a generar
      movlw .8 ;numero de bits a desplazar
      movwf CONT ;contador de bits
NEXT_CRC bcf STATUS,C ;limpia el carry
  rrcf CRC,F ;rota el registro hacia la derecha
  movlw POLY ;carga en w el polinomio 0x131 invertido
  btfsc STATUS,C ;comprueba el carry
  xorwf CRC,F ;si ha habido acarreo hacer xor entre el polinomio y el registro CRC
      decfsz CONT,F ;decrementa el contador de bits
      goto NEXT_CRC ;siguente bit
  movf CRC,W ;carga el CRC generado en el registro CRC
  return ;retorna
 

 


         
« Última modificación: 22 de Diciembre de 2013, 17:09:05 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #70 en: 22 de Diciembre de 2013, 17:27:03 »
y aqui pongo el calculo del crc con el mismo polinomio anterior pero con el sistema con tabla.

sistema sin tabla= 38bytes 717uS
sistema con tabla=288bytes 188uS

Código: [Seleccionar]
;****************************************** GEN_CRC_TBL **************************************************
;Calculo del crc por el sistema de tabla

GEN_CRC_TBL movwf CONT2 ;carga en CONT2 la cantidad de bytes a generar
CRC_NOK ;borra el flag de coincidencia de crc
movlb 0x00 ;seleccion de banco
movlw 0X00 ;valor de direccion del banco 0 de la flash
movwf FSR1H ;selecciona el banco 0 de la eeprom de programa.
movlw Scratchpad1 ;principio de la zona de datos donde se ubica la trama a convertir
movwf FSR1L ;introduce el valor en la direccion a leer
movff INDF1,TEMP_CRC ;lee el valor
clrf INDEX ;limpia variable INDEX

PROX2 movf INDF1,W ;carga valor de la trama
xorwf INDEX,W ;operacion xor de W con INDEX
       call CRC8 ;llamada a la rutina de calclo de CRC del byte leido
       movwf INDEX ;introduce el CRC generado en INDEX
       incf FSR1L,F ;siguiente direccion del byte a leer
       decfsz CONT2,F ;decrementa el contador de bytes analizados
       goto PROX2 ;siguente byte a leer
  
movf INDEX,W ;carga el crc calculado en W
xorwf Scratchpad9,W ;compara el crc recibido con el crc generado
btfsc STATUS,Z ;comprueba si son iguales
CRC_OK ;si son iguales activa flag
       return ;return




;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< CRC8 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

CRC8 movwf TBLPTRL ;
movlw 0X50
movwf TBLPTRH
                        bcf STATUS,C ;borra el carry
rlcf TBLPTRL,F ;multiplica por 2
bnc $+4 ;si ha habido acarreo,
incf TBLPTRH ;incrementa puntero alto de tabla

TABLA_CRC8 tblrd+* ;incrementa puntero de tabla despues de su lectura
tblrd+* ;incrementa puntero de tabla despues de su lectura
movf TABLAT,W
return


ORG 0X5002

dt .00, .94, .188, .226, .97, .63, .221, .131, .194, .156, .126, .32, .163, .253, .31, .65
dt .157, .195, .33, .127, .252, .162, .64, .30, .95, .1, .227, .189, .62, .96, .130, .220
dt .35, .125, .159, .193, .66, .28, .254, .160, .225, .191, .93, .3, .128, .222, .60, .98
  dt .190, .224, .2, .92, .223, .129, .99, .61, .124, .34, .192, .158, .29, .67, .161, .255
dt .70, .24, .250, .164, .39, .121, .155, .197, .132, .218, .56, .102, .229, .187, .89,.7
dt .219, .133, .103, .57, .186, .228, .6, .88, .25, .71, .165, .251, .120, .38, .196, .154
dt  .101, .59, .217, .135, .4, .90, .184, .230, .167, .249, .27, .69, .198, .152, .122, .36
   dt .248, .166, .68, .26, .153, .199, .37, .123, .58, .100, .134, .216, .91, .5, .231, .185
   dt .140, .210, .48, .110, .237, .179, .81, .15, .78, .16, .242, .172, .47, .113, .147, .205
   dt .17, .79, .173, .243, .112, .46, .204, .146, .211, .141, .111, .49, .178, .236, .14, .80
   dt .175, .241, .19, .77, .206, .144, .114, .44, .109, .51, .209, .143, .12, .82, .176, .238
   dt .50, .108, .142, .208, .83, .13, .239, .177, .240, .174, .76, .18, .145, .207, .45, .115
   dt .202, .148, .118, .40, .171, .245, .23, .73, .8, .86, .180, .234, .105, .55, .213, .139
   dt .87, .9, .235, .181, .54, .104, .138, .212, .149, .203, .41, .119, .244, .170, .72, .22
   dt .233, .183, .85, .11, .136, .214, .52, .106, .43, .117, .151, .201, .74, .20, .246, .168
   dt .116, .42, .200, .150, .21, .75, .169, .247, .182, .232, .10, .84, .215, .137, .107, .53

« Última modificación: 23 de Diciembre de 2013, 18:11:42 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: pequeños proyectos
« Respuesta #71 en: 23 de Diciembre de 2013, 07:28:33 »
Mi mas sincera enhorabuena grounman  :-/ :-/ ((:-)) ((:-))

Y digo a los señores moderadores ¿No seria bueno ponerle chincheta a este hilo?. Hay programas muy interesantes que se pueden usar a modo de libreria y seria buen sitio para mandar a ususarios nuevos que vienen preguntando.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #72 en: 23 de Diciembre de 2013, 16:23:51 »
gracias tapi8.este hilo lo cree para acceder rapidamente a las rutinas que mas uso.y si que es verdad que tambien he dirigido a novatos al hilo.
seguire incorporando rutinas.siempre me acuerdo de este hilo.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #73 en: 12 de Enero de 2014, 15:50:03 »
rutina para el borrado de toda la ram de un 18F2550


Código: [Seleccionar]
;******************************************************** CLEAR_ALL **************************************************************
;borra toda la memoria

CLEAR_ALL movlw 0x0f ;valor limite de borrado FSR0H
lfsr FSR0,700h ;direcciona la ram
clr2 clrf INDF0 ;borra direccion direccionada
incfsz FSR0L ;siguiente direccion a borrar
goto clr2 ;salta a borrado de direccion
decf FSR0H,f ;decrementa direccionamiento alto
cpfseq FSR0H ;comprueba si se ha llegado al final del direccionamiento
goto clr2 ;si no ha llegado,continua borrando
return ;retorna si se a acabado el borrado

Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #74 en: 16 de Enero de 2014, 18:14:54 »
esta rutina hace lo mismo que la que puse anteriormente para el calculo del CRC para los DS18B20 por el sistema de la tabla.
solo que tenemos un define para indicar donde ubicaremos la tabla.asi facilitamos el uso como libreria.

esto es para un 18F2550


Código: [Seleccionar]
#define TABLA_CRCs 0x5000 ;direccion donde meter la tabla.




;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< CRC8 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

CRC8 movwf TBLPTRL ;carga indexado de la tabla
movlw HIGH TABLA_CRCs ;direccion alta de tabla
movwf TBLPTRH ;cargalo en registro
clrf WREG ;dato 0x00
xorwf TBLPTRL,w ;comprueba si el dato indexado es igual a 0x00
btfsc STATUS,Z ;si es asi,
goto TABLA_CRC8 ;salta a tabla para leer el primer valor "0"
bcf STATUS,C ;borra el carry
rlcf TBLPTRL,F ;multiplica por 2
bnc TABLA_CRC8 ;salta a tabla si el valor indexado esta en los primeros 256bytes.en caso contrario,
incf TBLPTRH ,f ;incrementa puntero alto de tabla
goto TABLA_CRC8 ;y salta a tabla en resto de bytes.

TABLA_CRC8 tblrd*+ ;incrementa puntero de tabla antes de su lectura
movf TABLAT,W ;carga el valor leido de la tabla en W
return ;retorna


;la tabla tiene 256 valores.pero en este pic ocupa 512bytes.ya que cada direccion ocupa 2bytes.y solo uno de ellos es valido.
ORG TABLA_CRCs

dt .00, .94, .188, .226, .97, .63, .221, .131, .194, .156, .126, .32, .163, .253, .31, .65
dt .157, .195, .33, .127, .252, .162, .64, .30, .95, .1, .227, .189, .62, .96, .130, .220
dt .35, .125, .159, .193, .66, .28, .254, .160, .225, .191, .93, .3, .128, .222, .60, .98
  dt .190, .224, .2, .92, .223, .129, .99, .61, .124, .34, .192, .158, .29, .67, .161, .255
dt .70, .24, .250, .164, .39, .121, .155, .197, .132, .218, .56, .102, .229, .187, .89,.7
dt .219, .133, .103, .57, .186, .228, .6, .88, .25, .71, .165, .251, .120, .38, .196, .154
dt  .101, .59, .217, .135, .4, .90, .184, .230, .167, .249, .27, .69, .198, .152, .122, .36
  dt .248, .166, .68, .26, .153, .199, .37, .123, .58, .100, .134, .216, .91, .5, .231, .185
  dt .140, .210, .48, .110, .237, .179, .81, .15, .78, .16, .242, .172, .47, .113, .147, .205
  dt .17, .79, .173, .243, .112, .46, .204, .146, .211, .141, .111, .49, .178, .236, .14, .80
  dt .175, .241, .19, .77, .206, .144, .114, .44, .109, .51, .209, .143, .12, .82, .176, .238
  dt .50, .108, .142, .208, .83, .13, .239, .177, .240, .174, .76, .18, .145, .207, .45, .115
  dt .202, .148, .118, .40, .171, .245, .23, .73, .8, .86, .180, .234, .105, .55, .213, .139
  dt .87, .9, .235, .181, .54, .104, .138, .212, .149, .203, .41, .119, .244, .170, .72, .22
  dt .233, .183, .85, .11, .136, .214, .52, .106, .43, .117, .151, .201, .74, .20, .246, .168
  dt .116, .42, .200, .150, .21, .75, .169, .247, .182, .232, .10, .84, .215, .137, .107, .53


Montando mi primera impresora 3D (Raprep Prusa i3)