Título: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: BADBYTE-K en 11 Octubre 2004, 02:58 am aqui iran unas cuantas practicas para que nos iniciemos en la programacion basica de microcontroladores (esta ocasion con el 16C84)
Sumando en ensamblador con microcontroladores programa 1 Citar ; Este programa suma el contenido de las posiciones 0x0c y 0x0d ; de memoria y almacena el resultado en la posicion 0e. LIST p= 16c84 ;Indica el modelo de PIC que se usa ;Es una directiva del ensamblador. ; -------------------------------------------------------------------------- ;Zona para etiquetas. OPERANDO1 EQU 0x0c ;Define la posici¢n del operando1 OPERANDO2 EQU 0x0d ;Define la posici¢n del operando2 RESULTADO EQU 0x0e ;Define la posici¢n del resultado ;--------------------------------------------------------------------------- ORG 0 ;Comando que indica al Ensamblador ;la direcci¢n de la memoria de programa ;donde situar la siguiente instrucci¢n ;--------------------------------------------------------------------------- movlw 05 ; 5 -> W (Primera instrucci¢n) movwf OPERANDO1 ; W -> OPERANDO1 movlw 02 ; 2 -> W movwf OPERANDO2 ; W -> OPERANDO2 movfw OPERANDO1 ; OPERANDO1 -> W addwf OPERANDO2,0 ; W + OPERANDO2 -> W movwf RESULTADO ; W -> RESULTADO END ; Directiva de fin de programa programa 2 Citar ; Optimizacion del primer programa que calcula la suma de 2 ;posiciones de memoria y deja el resultado en una tercera. ;Estas posiciones son 0x0c para operando1, 0x0d para operando2 y 0x0e para ;el resultado. ;La optimizaci¢n consiste en ahorrar una instrucci¢n al aprovechar el hecho ;de que la suma es una operaci¢n conmutativa.De esta manera tras cargar en W ;el operando 2 se puede realizar directamente la suma. LIST p= 16c84 ;Indica el modelo de PIC que se usa ;Es una directiva del ensamblador. ; -------------------------------------------------------------------------- ;Zona para etiquetas. OPERANDO1 EQU 0x0c ;Define la posici¢n del operando1 OPERANDO2 EQU 0x0d ;Define la posici¢n del operando2 RESULTADO EQU 0x0e ;Define la posici¢n del resultado ;--------------------------------------------------------------------------- ORG 0 ;Comando que indica al Ensamblador ;la direcci¢n de la memoria de programa ;donde situar la siguiente instrucci¢n ;--------------------------------------------------------------------------- movlw 05 ;5 --> W (primera instrucci¢n) movwf OPERANDO1 ;W --> Operando1 movlw 02 ;2 --> W movwf OPERANDO2 ;W --> Operando2 addwf OPERANDO1,0 ;W + operando1 --> W movwf RESULTADO ;W --> resultado END ;directiva de fin del programa programa 3 Citar ; Este programa suma el contenido de las posiciones 0c y 0d de memoria y ; almacena el resultado en la misma posici¢n 0d. LIST p= 16C84 ; Para PIC 16C84 ;-------------------------------------------------------------------------- OPERANDO1 EQU 0x0C ; Define la posici¢n del operando 1 OPERANDO2 EQU 0x0D ; Define la posici¢n del operando 2 ; y del resultado ;-------------------------------------------------------------------------- ORG 0 ; Direcci¢n de inicio del programa ;-------------------------------------------------------------------------- movlw 02 ; 2 -> W movwf OPERANDO2 ; W -> OPERANDO2 movlw 05 ; 5 -> W movwf OPERANDO1 ; W -> OPERANDO1 ( Operando1 est en W y en 0x0C) addwf OPERANDO2,1 ; OPERANDO2 + W -> Operando2 END ; Directiva de fin de programa sumando en C Citar /* Programa que suma el contenido de dos variables en memoria y almacena */ /* el resultado en una tercera variable de resultado. */ #include <16c84.h> void main( void ) { int operando1 = 5, operando2 = 2, resultado; resultado = operando1 + operando2; } espero les sirvan de mucho saludox [/color] Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: BADBYTE-K en 11 Octubre 2004, 03:25 am Empezando con leds e interruptores simples
programa en ensamblador Citar ;Programa que lee el numero binario introducido mediante 3 ;interruptores simples konectados al puerto A (pines RA0,RA1,RA2), luego suma 2 unidades ;a ese valor y visualiza el resultado mediante 4 diodos led conectados al ;puerto B (pines RB0, RB1,RB2,RB3). ;---------------------------------------------------------------------------- LIST P=16C84 ;Comando que indica el PIC usado RADIX HEX ;Los valores se representar n en hexadecimal ;---------------------------------------------------------------------------- PUERTAA EQU 0X05 ;La etiqueta "PUERTAA" queda identificada con ;la direcci¢n 0x05, que si corresponde con el ;banco 0 es el valor de PUERTAA y si es del ;banco 1 con el de TRISA. PUERTAB EQU 0X06 ;Equivalencia de la etiqueta PUERTAB ESTADO EQU 0X03 ;Estado corresponde con el valor 0x03. W EQU 0 ;Identifica W con el valor 0. ;---------------------------------------------------------------------------- ORG 0 ;Comando que indica al Ensamblador la ;direcci¢n de la memeoria donde se ;situar la instruci¢n siguiente ;---------------------------------------------------------------------------- bsf ESTADO,5 ;Pone a 1 el bit 5 de ESTADO para direccionar ;la p gina 1 de la memoria de datos. movlw 0xff ;W <-- FF(Hex) movwf PUERTAA ;W --> TRISA movlw 0x00 ;W <-- 0 movwf PUERTAB ;W --> TRISB (Las l¡neas de PB salidas) bcf ESTADO,5 ;Pone a 0 el bit 5 de ESTADO pasando a ;acceder al banco 0. inicio movf PUERTAA,W ;W <-- PUERTAA. Se introduce el valor binario ;de los interruptores. addlw 2 ;W <-- W + 2 movwf PUERTAB ;W --> PUERTAB. El valor de W sale por las ;l¡neas de PB a los led. goto inicio ;Salta a la instrucci¢n precedida por la ;etiqueta de inicio. END Programando en C Citar /* Programa que suma 2 unidades al valor que entra por la PuertaA */ /* mediante unos interuptores y visualiza el resultado mediante unos leds /* que se suponen conectados al puerto b igual que el anterior */ #INCLUDE <16C84.H> void main(void) { int valor; /* Valor temporal */ int * p_puertaa= 0x05; /* Puntero a PuertaA */ int * p_puertab= 0x06; /* Puntero a PuertaB */ SET_TRIS_A (0xff); /* 0xff --> TRISA */ SET_TRIS_B (0x00); /* 0x00 --> TRISB */ do { valor = * p_puertaa; /* PuertaA --> valor */ valor += 2; /* se incrementa valor en 2 */ *p_puertab = valor; /* valor --> puertaB */ } while (TRUE); /* Bucle infinito */ } [/color] Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: BADBYTE-K en 11 Octubre 2004, 05:01 am otro parecido
Citar ; Controla cinco interruptores conectados a RA0-RA4 y enciende una serie de ; leds en las puertas RB0-RB4 dependiendo de las entradas introducidas por la puerta A. ; Con un 0 en la puerta A se enciende el le correspondiente de la puerta B LIST p=16c84 ; Se usa el PIC16C84 RADIX hex ; Se emplea el sistema de numeraci¢n hexadecimal ; ZONA DE ETIQUETAS----------------------------------------------------------------------- W EQU 0 ; Cuando el destino es W, d = 0 F EQU 1 ; Cuando el destino es el registro f, d = 1 PUERTAA EQU 0x05 ; La Puerta A (datos) ocupa la direcci¢n 5 del ; banco 0 y el registro de configuraci¢n la ; direcci¢n 5 del banco 1 PUERTAB EQU 0x06 ; La misma etiqueta para el registro de datos y el ; de configuraci¢n de la Puerta B ESTADO EQU 0x03 ; El registro Estado ocupa direcci¢n 3 de los dos ; bancos ; COMIENZO DEL PROGRAMA ----------------------------------------------------------------- ORG 0 ; El programa comienza en la direcci¢n 0 (Vector Reset) goto inicio ; Se salta a la etiqueta “inicio” ORG 5 ; Se asigna la direcci¢n 5 a la siguiente instrucci¢n inicio bsf ESTADO,5 ; Pone a 1 el bit 5 de Estado. Acceso al banco 1. clrf PUERTAB ; Se configuran como salidas las l¡neas de la Puerta B movlw 0xff ; El registro W se carga con unos movwf PUERTAA ; Se configuran como entradas las l¡neas de la Puerta A bcf ESTADO,5 ; Pone a 0 el bit 5 de Estado. Acceso al banco 0. bucle movf PUERTAA,W ; Carga el registro de datos de Puerta A en W comf PUERTAA,W ; Complementa a 1 la entrada y la deposita en W movwf PUERTAB ; El contenido de W se deposita en el registro de datos de ; la Puerta B goto bucle ; Se crea un bucle cerrado e infinito END ; Fin del programa en C Citar /* Lee el valor de cinco interruptores en la puerta A y saca por */ /* la puerta B el valor inverso */ #include <16c84.h> #byte puertaa = 05 /* Posici¢n de la puerta A */ #byte puertab = 06 /* Posici¢n de la puerta B */ void main( void ) { int temp; set_tris_a( 0xFF ); /* Puerta A configurada para entrada */ set_tris_b( 0x00 ); /* Puerta B configurada para salida */ do { /* La variable temporal es necesaria porque */ temp = ~puertaa; /* la complementaci¢n se traduce en dos pasos: */ puertab = temp; /* a) Copia de puertaa en temp */ } /* b) Complementaci¢n de temp */ /* De no hacerlo as¡ los LED parpadear¡an */ while( TRUE ); /* Repetir ininterrumpidamente */ } saludox[/color] Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: Ertai en 10 Agosto 2005, 18:41 pm Cuando este en mi casa posteare codigos para el ADuC 182, se puede pedir por Internet, te lo montas tu, y luego lo programas.
Salu2. Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: {_The_Alwar_} en 28 Septiembre 2005, 21:32 pm hey genios de la electronica, tengo una duda, aunque viendo este tema creo resolverla,
¿estos programas luego los introduces en un chip o algo no?¿con esto, programas los chip para que trabajen solos no? ¿como los introduces los programas? me supongo que tendras algun aparatito conectado al pc y hay conectas los chips, jeje que programa utilizas para compilar todo eso? Se que hago muchas preguntas espero no molestar, pero me encanta la electronica, aunque se muy poco (soy joven para saber de esto) y tengo ganas de aprender, viendo esto, el ensamblador no parece dificil, solo que son sentencias muy simples xD Saludos!! Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: D1e6o! en 1 Octubre 2005, 00:20 am Sep... estamops hablando de un microcontrolador, el cual guarda el programa que le ingresemos en su memoria interna, y así puede funcionar independiente del pc. (en este caso el pic 16f84 (posee una memoria flash donde se guardan los programas y una eprom para datos...). Introducirlos en el integrado es fácil, basta con armar alguno de los circuitos sencillos que hay en distintas webs(generalmente se conectan por puerto paralelo, aunque hay variantes). Para compilar eso hay varios programas, el más básico, creado por el mismo fabricante del uC es Mplab (pag de inicio microchip.com) que lo descargás gratis, y sí.. la programación es bastante sencilla. Si necesitas algún circuito busca en internet. Hay muchos, así como tb ejemplos. Saludos. Si no fuí claro preguntá, es que estoy un poco apurado.
Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: {_The_Alwar_} en 1 Octubre 2005, 00:23 am gracias, ya lo entendi, era como me suponia aunque.. tengo ciertas dudas con los chips... pero weno como no son muy claras no se ni lo q tengo q preguntar
Saludos! Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: BADBYTE-K en 1 Octubre 2005, 02:44 am pregunta con confianza amigo, estamos para ayudarte
saludos Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: ijfa en 2 Diciembre 2005, 23:55 pm que wena toy arreglando un programa pa un teklado matricial y me sirve el que toma algo en el puerto A y kontrola el B....wenoweno...thx
Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: {05c4r} en 14 Diciembre 2005, 23:57 pm Viendo los programas que teneis colgados me parecen un poco como para iniciarse, aqui os pongo varios programas un poco mas avanzados, no se que os parecera, pero yo pongo mi granito
Programa que hace una escritura en una pantalla LCD ;********************************************************************** ; Liquid Chrystal Display ;********************************************************************** ;--------------------------------------------------------------------------------------------------------- ; CONFIGURACIÓN DEL PIC ;--------------------------------------------------------------------------------------------------------- LIST P=16F84 ;tipo de procesador INCLUDE "P16F84.INC" ;definición del registro de inicio ;--------------------------------------------------------------------------------------------------------- ; DEFINICIÓN DE VARIABLES ;--------------------------------------------------------------------------------------------------------- Lcd_var EQU 0X0C ;definición de variables de rutina ;de manejo del lcd CONT1 EQU 0X10 ;--------------------------------------------------------------------------------------------------------- ; PUESTA A CERO DEL PIC ;--------------------------------------------------------------------------------------------------------- ORG 0X00 ;vector de reset GOTO INICIO ;salta a inicio ORG 0X05 ;salva el vector de ;interrupcion INCLUDE "LCD_Cxx.INC" ;incluye rutinas de manejo lcd ;--------------------------------------------------------------------------------------------------------- ; RETARDO DE 500 MS ;--------------------------------------------------------------------------------------------------------- TEMP1 MOVLW .78 MOVWF CONT1 TEMP1B BCF INTCON,T0IF MOVLW .100 MOVWF TMR0 TEMP1C CLRWDT BTFSS INTCON,T0IF GOTO TEMP1C DECFSZ CONT1,F GOTO TEMP1B RETURN ;--------------------------------------------------------------------------------------------------------- ; CONFIGURACIÓN PUERTOS E INICIO DEL LCD ;--------------------------------------------------------------------------------------------------------- INICIO CLRF PORTB ;borra los latch de salida BSF STATUS,RP0 ;selecciono banco 1 CLRF TRISB ;configuro trisb como salida MOVLW B'00011000' MOVWF TRISA MOVLW B'10000111' ;multiplicador a 256 MOVWF OPTION_REG ;configuro OPTION_REG BCF STATUS,RP0 ;selecciona banco 0 CALL LCD_INI ;secuencia de inicio del lcd MOVLW B'00000001' ;borra LCD CALL LCD_REG MOVLW B'00001111' ;envía instrucción: lcd on, CALL LCD_REG ;cursor on y blink on ;--------------------------------------------------------------------------------------------------------- ; APARECE EL NOMBRE EN LA PRIMERA FILA ;--------------------------------------------------------------------------------------------------------- MOVLW ' ' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW 'O' CALL LCD_DATO MOVLW 'S' CALL LCD_DATO MOVLW 'C' CALL LCD_DATO MOVLW 'A' CALL LCD_DATO MOVLW 'R' CALL LCD_DATO CALL TEMP1 ;--------------------------------------------------------------------------------------------------------- ; APARECEN LOS APELLIDOS EN LA SEGUNDA FILA ;--------------------------------------------------------------------------------------------------------- MOVLW B'00000001' ;borra el LCD CALL LCD_REG MOVLW B'11000000' ;coloca el cursor en C0h CALL LCD_REG ;ya que '11000000' = C0h MOVLW 'A' CALL LCD_DATO MOVLW 'G' CALL LCD_DATO MOVLW 'U' CALL LCD_DATO MOVLW 'D' CALL LCD_DATO MOVLW 'O' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW 'B' CALL LCD_DATO MOVLW 'U' CALL LCD_DATO MOVLW 'S' CALL LCD_DATO MOVLW 'T' CALL LCD_DATO MOVLW 'A' CALL LCD_DATO MOVLW 'M' CALL LCD_DATO MOVLW 'A' CALL LCD_DATO MOVLW 'N' CALL LCD_DATO MOVLW 'T' CALL LCD_DATO MOVLW 'E' CALL LCD_DATO CALL TEMP1 ;--------------------------------------------------------------------------------------------------------- ; HAGO QUE SE REPITA LA SECUENCIA ;--------------------------------------------------------------------------------------------------------- ; GOTO INICIO ;--------------------------------------------------------------------------------------------------------- NOP NOP END Despalazamiento del texto en una pantalla de LCD ;********************************************************************** ; Liquid Chrystal Display ;********************************************************************** ;--------------------------------------------------------------------------------------------------------- ; CONFIGURACIÓN DEL PIC ;--------------------------------------------------------------------------------------------------------- LIST P=16F84 ;tipo de procesador INCLUDE "P16F84.INC" ;definición del registro de inicio ;--------------------------------------------------------------------------------------------------------- ; DEFINICIÓN DE VARIABLES ;--------------------------------------------------------------------------------------------------------- Lcd_var EQU 0X0C ;definición de variables de rutina ;de manejo del lcd CONT1 EQU 0X10 CONT2A EQU 0X11 CONT2B EQU 0X12 AUX1 EQU 0X13 ;--------------------------------------------------------------------------------------------------------- ; PUESTA A CERO DEL PIC ;--------------------------------------------------------------------------------------------------------- ORG 0X00 ;vector de reset GOTO INICIO ;salta a inicio ORG 0X05 ;salva el vector de ;interrupcion INCLUDE "LCD_Cxx.INC" ;incluye rutinas de manejo lcd ;--------------------------------------------------------------------------------------------------------- ; RETARDO DE 40 MS ;--------------------------------------------------------------------------------------------------------- TEMP1 MOVLW .6 MOVWF CONT1 TEMP1B BCF INTCON,T0IF MOVLW .100 MOVWF TMR0 TEMP1C CLRWDT BTFSS INTCON,T0IF GOTO TEMP1C DECFSZ CONT1,F GOTO TEMP1B RETURN ;--------------------------------------------------------------------------------------------------------- ; RETARDO DE 5 SG ;--------------------------------------------------------------------------------------------------------- TEMP2 MOVLW .75 MOVWF CONT2A MOVLW .75 MOVWF CONT2B TEMP2B BCF INTCON,T0IF MOVLW .100 MOVWF TMR0 TEMP2C CLRWDT BTFSS INTCON,T0IF GOTO TEMP2C DECFSZ CONT2A,F GOTO TEMP2B TEMP2D CLRWDT MOVLW .1 MOVWF CONT2A BTFSS INTCON,T0IF GOTO TEMP2D DECFSZ CONT2B,F GOTO TEMP2B RETURN ;--------------------------------------------------------------------------------------------------------- ; CONFIGURACIÓN PUERTOS E INICIO DEL LCD ;--------------------------------------------------------------------------------------------------------- INICIO CLRF PORTB ;borra los latch de salida BSF STATUS,RP0 ;selecciono banco 1 CLRF TRISB ;configuro trisb como salida MOVLW B'00011000' MOVWF TRISA MOVLW B'10000111' ;multiplicador a 256 MOVWF OPTION_REG ;configuro OPTION_REG BCF STATUS,RP0 ;selecciona banco 0 CALL LCD_INI ;secuencia de inicio del lcd MOVLW B'00000001' ;borra LCD CALL LCD_REG MOVLW B'00001111' ;envía instrucción: lcd on, CALL LCD_REG ;cursor on y blink on ;--------------------------------------------------------------------------------------------------------- ; TEXTO FIJO EN LA PRIMERA LINEA ;--------------------------------------------------------------------------------------------------------- FIJO MOVLW B'00000000' CALL LCD_REG MOVLW B'10000000' ;texto en la primera linea CALL LCD_REG MOVLW B'00000001' ;borra el display CALL LCD_REG MOVLW ' ' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW 'E' CALL LCD_DATO MOVLW 'L' CALL LCD_DATO MOVLW 'E' CALL LCD_DATO MOVLW 'C' CALL LCD_DATO MOVLW 'T' CALL LCD_DATO MOVLW 'R' CALL LCD_DATO MOVLW 'O' CALL LCD_DATO MOVLW 'N' CALL LCD_DATO MOVLW 'I' CALL LCD_DATO MOVLW 'C' CALL LCD_DATO MOVLW 'A' CALL LCD_DATO CALL TEMP2 MOVLW B'00000001' CALL LCD_REG MOVLW .32 MOVWF AUX1 ;--------------------------------------------------------------------------------------------------------- ; DESPLAZA TEXTO EN LA SEGUNDA FILA ;--------------------------------------------------------------------------------------------------------- MOVER MOVLW B'00011000' CALL LCD_REG ;se desplaza el display MOVLW B'11000000' CALL LCD_REG MOVLW ' ' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW 'L' CALL LCD_DATO MOVLW 'O' CALL LCD_DATO MOVLW 'G' CALL LCD_DATO MOVLW 'I' CALL LCD_DATO MOVLW 'C' CALL LCD_DATO MOVLW 'A' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW 'D' CALL LCD_DATO MOVLW 'I' CALL LCD_DATO MOVLW 'G' CALL LCD_DATO MOVLW 'T' CALL LCD_DATO MOVLW 'A' CALL LCD_DATO MOVLW 'L' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW 'Y' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW 'M' CALL LCD_DATO MOVLW 'I' CALL LCD_DATO MOVLW 'C' CALL LCD_DATO MOVLW 'R' CALL LCD_DATO MOVLW 'O' CALL LCD_DATO MOVLW 'P' CALL LCD_DATO MOVLW 'R' CALL LCD_DATO MOVLW 'O' CALL LCD_DATO MOVLW 'G' CALL LCD_DATO MOVLW 'R' CALL LCD_DATO MOVLW 'A' CALL LCD_DATO MOVLW 'M' CALL LCD_DATO MOVLW 'A' CALL LCD_DATO MOVLW 'B' CALL LCD_DATO MOVLW 'L' CALL LCD_DATO MOVLW 'E' CALL LCD_DATO CALL TEMP1 DECFSZ AUX1 CALL MOVER CALL FIJO ;--------------------------------------------------------------------------------------------------------- NOP NOP END Un programa que simula la peticion del turno de una carnicera en un supermecado y guarda el numero en la memoria del PIC de forma que si quitas la alimentacion y la vuelves a poner sigues teniendo el mismo numero. Tiene posibilidad de adelantar y retroceder el numero con interruptores y de ponerle a cero. ;********************************************************************** ; Liquid Chrystal Display ;********************************************************************** ;--------------------------------------------------------------------------------------------------------- ; CONFIGURACIÓN DEL PIC ;--------------------------------------------------------------------------------------------------------- LIST P=16F84 ;tipo de procesador INCLUDE "P16F84.INC" ;definición del registro de inicio ;--------------------------------------------------------------------------------------------------------- ; DEFINICIÓN DE VARIABLES ;--------------------------------------------------------------------------------------------------------- Lcd_var EQU 0X0C ;definición de variables de rutina ;de manejo del lcd CONT1 EQU 0X10 TURNO1 EQU 0X11 TURNO2 EQU 0X12 ;--------------------------------------------------------------------------------------------------------- ; PUESTA A CERO DEL PIC ;--------------------------------------------------------------------------------------------------------- ORG 0X00 ;vector de reset GOTO INICIO ;salta a inicio ORG 0X05 ;salva el vector de ;interrupcion INCLUDE "LCD_Cxx.INC" ;incluye rutinas de manejo lcd ;--------------------------------------------------------------------------------------------------------- ; RETARDO ;--------------------------------------------------------------------------------------------------------- TEMP1 MOVLW .10 MOVWF CONT1 TEMP1B BCF INTCON,T0IF MOVLW .10 MOVWF TMR0 TEMP1C CLRWDT BTFSS INTCON,T0IF GOTO TEMP1C DECFSZ CONT1,F GOTO TEMP1B RETURN ;--------------------------------------------------------------------------------------------------------- ; CONFIGURACIÓN PUERTOS E INICIO DEL LCD ;--------------------------------------------------------------------------------------------------------- INICIO CLRF PORTB ;borra los latch de salida BSF STATUS,RP0 ;selecciono banco 1 CLRF TRISB ;configuro trisb como salida MOVLW B'00011000' MOVWF TRISA MOVLW B'10000111' ;multiplicador MOVWF OPTION_REG ;configuro OPTION_REG BCF STATUS,RP0 ;selecciona banco 0 CALL LCD_INI ;secuencia de inicio del lcd MOVLW B'00000001' ;borra LCD CALL LCD_REG MOVLW B'00001111' ;envía instrucción: lcd on, CALL LCD_REG ;cursor on y blink on ;--------------------------------------------------------------------------------------------------------- ; LEE LOS DATOS AL INICIO ;--------------------------------------------------------------------------------------------------------- LECTURA1 BCF STATUS,RP0 MOVLW 0X21 MOVWF EEADR BSF STATUS,RP0 BSF EECON1,RD ESPERA1B BTFSC EECON1,RD GOTO ESPERA1B BCF STATUS,RP0 MOVF EEDATA,W MOVWF TURNO1 LECTURA2 BCF STATUS,RP0 MOVLW 0X22 MOVWF EEADR BSF STATUS,RP0 BSF EECON1,RD ESPERA2B BTFSC EECON1,RD GOTO ESPERA2B BCF STATUS,RP0 MOVF EEDATA,W MOVWF TURNO2 ;--------------------------------------------------------------------------------------------------------- ; MUESTRA DATOS EN LCD ;--------------------------------------------------------------------------------------------------------- BUCLE1 BTFSS PORTA,3 GOTO BUCLE2 MOVLW 0X30 MOVWF TURNO1 MOVLW 0X30 MOVWF TURNO2 BUCLE2 MOVLW B'00000001' CALL LCD_REG MOVLW 'S' CALL LCD_DATO MOVLW 'U' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW 'T' CALL LCD_DATO MOVLW 'U' CALL LCD_DATO MOVLW 'R' CALL LCD_DATO MOVLW 'N' CALL LCD_DATO MOVLW 'O' CALL LCD_DATO MOVLW ':' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVLW ' ' CALL LCD_DATO MOVF TURNO2,W CALL LCD_DATO MOVF TURNO1,W CALL LCD_DATO PASAR BTFSS PORTA,4 GOTO PASAR CALL TEMP1 INCF TURNO1,F CALL AUX ;--------------------------------------------------------------------------------------------------------- ; GUARDA LOS DATOS EN MEMORIA ;--------------------------------------------------------------------------------------------------------- ESCRITURA1 BCF STATUS,RP0 MOVLW 0X21 MOVWF EEADR MOVF TURNO1,W MOVWF EEDATA BSF STATUS,RP0 BSF EECON1,WREN MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR ESPERA1A BTFSS EECON1,EEIF GOTO ESPERA1A BCF EECON1,EEIF BCF STATUS,RP0 ESCRITURA2 BCF STATUS,RP0 MOVLW 0X22 MOVWF EEADR MOVF TURNO2,W MOVWF EEDATA BSF STATUS,RP0 BSF EECON1,WREN MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR ESPERA2A BTFSS EECON1,EEIF GOTO ESPERA2A BCF EECON1,EEIF BCF STATUS,RP0 GOTO BUCLE1 ;--------------------------------------------------------------------------------------------------------- ; FUNCION PARA PREPARAR DATOS DE SALIDA ;--------------------------------------------------------------------------------------------------------- AUX MOVF TURNO1,W SUBLW 0X39 BTFSC STATUS,C RETURN INCF TURNO2,F MOVLW 0X30 MOVWF TURNO1 MOVF TURNO2,W SUBLW 0X39 BTFSC STATUS,C RETURN MOVLW 0X30 MOVWF TURNO2 RETURN NOP NOP END Aqui un programa que me costo lo mio desarrollar. Se trata de un cronometro (seguramente no muy exacto debido a tiempos de propagacion y tal) qu muestra en el LCD minutos, segundos y centesimas, con un interruptor le pones en marcha o le paras y con otro interruptor le haces avanzar o retroceder. ;********************************************************************** ; Liquid Chrystal Display ;********************************************************************** ;--------------------------------------------------------------------------------------------------------- ; CONFIGURACIÓN DEL PIC ;--------------------------------------------------------------------------------------------------------- LIST P=16F84 ;tipo de procesador INCLUDE "P16F84.INC" ;definición del registro de inicio ;--------------------------------------------------------------------------------------------------------- ; DEFINICIÓN DE VARIABLES ;--------------------------------------------------------------------------------------------------------- Lcd_var EQU 0X0C ;definición de variables de rutina ;de manejo del lcd CONT1 EQU 0X10 CENT1 EQU 0X11 CENT2 EQU 0X12 SEG1 EQU 0X15 SEG2 EQU 0X16 MIN1 EQU 0X13 MIN2 EQU 0X14 ;--------------------------------------------------------------------------------------------------------- ; PUESTA A CERO DEL PIC ;--------------------------------------------------------------------------------------------------------- ORG 0X00 ;vector de reset GOTO INICIO ;salta a inicio ORG 0X05 ;salva el vector de ;interrupcion INCLUDE "LCD_Cxx.INC" ;incluye rutinas de manejo lcd ;--------------------------------------------------------------------------------------------------------- ; RETARDO ;--------------------------------------------------------------------------------------------------------- TEMP1 MOVLW .1 MOVWF CONT1 TEMP1B BCF INTCON,T0IF MOVLW .1 MOVWF TMR0 TEMP1C CLRWDT BTFSS INTCON,T0IF GOTO TEMP1C DECFSZ CONT1,F GOTO TEMP1B RETURN ;--------------------------------------------------------------------------------------------------------- ; CONFIGURACIÓN PUERTOS E INICIO DEL LCD ;--------------------------------------------------------------------------------------------------------- INICIO CLRF PORTB ;borra los latch de salida BSF STATUS,RP0 ;selecciono banco 1 CLRF TRISB ;configuro trisb como salida MOVLW B'00011000' MOVWF TRISA MOVLW B'10000000' ;multiplicador MOVWF OPTION_REG ;configuro OPTION_REG BCF STATUS,RP0 ;selecciona banco 0 CALL LCD_INI ;secuencia de inicio del lcd MOVLW B'00000001' ;borra LCD CALL LCD_REG MOVLW B'00001111' ;envía instrucción: lcd on, CALL LCD_REG ;cursor on y blink on ;--------------------------------------------------------------------------------------------------------- ; LEE LOS DATOS AL INICIO ;--------------------------------------------------------------------------------------------------------- LECTURA1 BCF STATUS,RP0 MOVLW 0X21 MOVWF EEADR BSF STATUS,RP0 BSF EECON1,RD ESPERA1B BTFSC EECON1,RD GOTO ESPERA1B BCF STATUS,RP0 MOVF EEDATA,W MOVWF CENT1 LECTURA2 BCF STATUS,RP0 MOVLW 0X22 MOVWF EEADR BSF STATUS,RP0 BSF EECON1,RD ESPERA2B BTFSC EECON1,RD GOTO ESPERA2B BCF STATUS,RP0 MOVF EEDATA,W MOVWF CENT2 LECTURA3 BCF STATUS,RP0 MOVLW 0X23 MOVWF EEADR BSF STATUS,RP0 BSF EECON1,RD ESPERA3B BTFSC EECON1,RD GOTO ESPERA3B BCF STATUS,RP0 MOVF EEDATA,W MOVWF SEG1 LECTURA4 BCF STATUS,RP0 MOVLW 0X24 MOVWF EEADR BSF STATUS,RP0 BSF EECON1,RD ESPERA4B BTFSC EECON1,RD GOTO ESPERA4B BCF STATUS,RP0 MOVF EEDATA,W MOVWF SEG2 LECTURA5 BCF STATUS,RP0 MOVLW 0X25 MOVWF EEADR BSF STATUS,RP0 BSF EECON1,RD ESPERA5B BTFSC EECON1,RD GOTO ESPERA5B BCF STATUS,RP0 MOVF EEDATA,W MOVWF MIN1 LECTURA6 BCF STATUS,RP0 MOVLW 0X26 MOVWF EEADR BSF STATUS,RP0 BSF EECON1,RD ESPERA6B BTFSC EECON1,RD GOTO ESPERA6B BCF STATUS,RP0 MOVF EEDATA,W MOVWF MIN2 ;--------------------------------------------------------------------------------------------------------- ; MUESTRA DATOS EN LCD ;--------------------------------------------------------------------------------------------------------- MOSTRAR MOVLW B'00000001' CALL LCD_REG MOVF MIN2,W CALL LCD_DATO MOVF MIN1,W CALL LCD_DATO MOVLW ':' CALL LCD_DATO MOVF SEG2,W CALL LCD_DATO MOVF SEG1,W CALL LCD_DATO MOVLW ':' CALL LCD_DATO MOVF CENT2,W CALL LCD_DATO MOVF CENT1,W CALL LCD_DATO ADELANTE BTFSC PORTA,4 GOTO SIGUIENTE CALL CERO GOTO ADELANTE CERO BTFSS PORTA,3 RETURN MOVLW 0X30 MOVWF CENT1 MOVLW 0X30 MOVWF CENT2 MOVLW 0X30 MOVWF SEG1 MOVLW 0X30 MOVWF SEG2 MOVLW 0X30 MOVWF MIN1 MOVLW 0X30 MOVWF MIN2 MOVLW B'00000001' CALL LCD_REG MOVF MIN2,W CALL LCD_DATO MOVF MIN1,W CALL LCD_DATO MOVLW ':' CALL LCD_DATO MOVF SEG2,W CALL LCD_DATO MOVF SEG1,W CALL LCD_DATO MOVLW ':' CALL LCD_DATO MOVF CENT2,W CALL LCD_DATO MOVF CENT1,W CALL LCD_DATO RETURN SIGUIENTE CALL TEMP1 INCF CENT1,F CALL AUX CALL ESCRITURA1 GOTO MOSTRAR ;--------------------------------------------------------------------------------------------------------- ; FUNCION PARA PREPARAR DATOS DE SALIDA ;--------------------------------------------------------------------------------------------------------- AUX MOVF CENT1,W SUBLW 0X39 BTFSC STATUS,C RETURN INCF CENT2,F MOVLW 0X30 MOVWF CENT1 MOVF CENT2,W SUBLW 0X39 BTFSC STATUS,C RETURN INCF SEG1,F MOVLW 0X30 MOVWF CENT2 MOVF SEG1,W SUBLW 0X39 BTFSC STATUS,C RETURN INCF SEG2,F MOVLW 0X30 MOVWF SEG1 MOVF SEG2,W SUBLW 0X35 BTFSC STATUS,C RETURN INCF MIN1,F MOVLW 0X30 MOVWF SEG2 MOVF MIN1,W SUBLW 0X39 BTFSC STATUS,C RETURN INCF MIN2,F MOVLW 0X30 MOVWF MIN1 MOVF MIN2,W SUBLW 0X39 BTFSC STATUS,C RETURN MOVLW 0X30 MOVWF MIN2 RETURN ;--------------------------------------------------------------------------------------------------------- ; GUARDA LOS DATOS EN MEMORIA ;--------------------------------------------------------------------------------------------------------- ESCRITURA1 BCF STATUS,RP0 MOVLW 0X21 MOVWF EEADR MOVF CENT1,W MOVWF EEDATA BSF STATUS,RP0 BSF EECON1,WREN MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR ESPERA1A BTFSS EECON1,EEIF GOTO ESPERA1A BCF EECON1,EEIF BCF STATUS,RP0 ESCRITURA2 BCF STATUS,RP0 MOVLW 0X22 MOVWF EEADR MOVF CENT2,W MOVWF EEDATA BSF STATUS,RP0 BSF EECON1,WREN MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR ESPERA2A BTFSS EECON1,EEIF GOTO ESPERA2A BCF EECON1,EEIF BCF STATUS,RP0 ESCRITURA3 BCF STATUS,RP0 MOVLW 0X23 MOVWF EEADR MOVF SEG1,W MOVWF EEDATA BSF STATUS,RP0 BSF EECON1,WREN MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR ESPERA3A BTFSS EECON1,EEIF GOTO ESPERA3A BCF EECON1,EEIF BCF STATUS,RP0 ESCRITURA4 BCF STATUS,RP0 MOVLW 0X24 MOVWF EEADR MOVF SEG2,W MOVWF EEDATA BSF STATUS,RP0 BSF EECON1,WREN MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR ESPERA4A BTFSS EECON1,EEIF GOTO ESPERA4A BCF EECON1,EEIF BCF STATUS,RP0 ESCRITURA5 BCF STATUS,RP0 MOVLW 0X25 MOVWF EEADR MOVF MIN1,W MOVWF EEDATA BSF STATUS,RP0 BSF EECON1,WREN MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR ESPERA5A BTFSS EECON1,EEIF GOTO ESPERA5A BCF EECON1,EEIF BCF STATUS,RP0 ESCRITURA6 BCF STATUS,RP0 MOVLW 0X26 MOVWF EEADR MOVF MIN2,W MOVWF EEDATA BSF STATUS,RP0 BSF EECON1,WREN MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR ESPERA6A BTFSS EECON1,EEIF GOTO ESPERA6A BCF EECON1,EEIF BCF STATUS,RP0 RETURN ;--------------------------------------------------------------------------- NOP NOP END Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: {05c4r} en 14 Diciembre 2005, 23:59 pm Se me olvido comentar que los 4 programas anteriores estan preparados y probrados con el 16F84A
Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: {_The_Alwar_} en 15 Diciembre 2005, 00:04 am gracias por tu aportacion, pero en esos fuentes hablas de que se puede controlar cosas con interrputores, pero como los juntas con el procesador? y todo eso? esk yo soy nuevo y de esto no entiendo na pero me gustaria saber...
Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: {05c4r} en 15 Diciembre 2005, 00:08 am yo en clase uso unas placas que el insti compro a Microsistem Ingering (o algo asi, creo que son de bilbao) que viene todo preparado: alimentas con 12 Vcc y tiene interiormente los circuitos para sacar 5V y 3.3V, la placa consta de 5 interruptores (NO antirrebote), un display de 7seg, un LCD y 2 zocalos, uno para 16F84 y otro para 16F873 y tmb tiene una barra de 10 leds luminosos
la placa creo que cuesta unos 70 euros mas gastos de envios este año en segundo estamos desarrollando una placa de la virgen santisima madre de dios que si dentro de 3 meses he conseguido echar a andar os 'prestare' gustosamente su layout por si alguien se la quiere construir Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: {_The_Alwar_} en 15 Diciembre 2005, 00:35 am en q curso estas? porq yo en 4º de la eso nunca e vsito cosas de esas en el isntituto... pues si te viene con todo la plakita y puedes programarla incluso a lo mejor te merece la pena comprarte una, asi haces cositas y asi si alguna vez necesitas hacer algun aparato de domotica digo yo q podras utilizarlo.
Saludos! Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: {05c4r} en 15 Diciembre 2005, 00:52 am Estoy haciendo segundo de un ciclo de grado superior de desarrollo de productos electronicos
cuando yo estudie bup y cou no es que no supiera lo que era un PIC, es que no sabia ni lo que era un circuito serie ni nada parecido Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: {_The_Alwar_} en 15 Diciembre 2005, 18:06 pm ah bueno... entonces te llevo ventaja.. como hablaste del instituto... jeje
Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: Findu en 30 Diciembre 2005, 00:07 am hola soy findu, y necesito ayuda, debo encontrar algun proyecto que logre vincular la PC a través de sus puertos Paralelo o Serial a un hardware externo.
No tiene que ser un proyecto muy complejo. Tengo los controladores: 16F84 se borra eléctricamente 16F71 con conversor A/D interno y ventana de borrado ultravioleta. Muchas gracias Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: compalter2000 en 12 Febrero 2006, 02:00 am Vaya, cuantas cosas y yo sin saber nada de esto, alguien tendra algun material para iniciarme en la electronica, gracias se los agradecer mucho.
Saludos a todos Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: nil_appserver en 18 Febrero 2006, 23:41 pm mira muchas de las instrucciones que se encuentra ai
son eroneas por las diferentes formas el ensambler Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: BADBYTE-K en 17 Marzo 2006, 05:42 am mira muchas de las instrucciones que se encuentra ai son eroneas por las diferentes formas el ensambler Nos gustaria que nos mostraras donde tu ves los errores, para asi tener la oportunidad de analizarlos y repararlos en caso de existir saludos Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: Casidiablo en 28 Marzo 2006, 20:52 pm NO son erroneas... lo que pasa es que el Assembler cambia un poco su estructura de acuerdo al dispositivo bajo el cual se va a programar... por ej. es muy distinto programar Microcontroladores PIC16X84 (como en este caso) o programar Microprocesadores Intel. Saludos!!! Título: Re: Mini-Practicas de programación ensamblador y en C para microcontroladores Publicado por: Meta en 19 Agosto 2008, 03:39 am Muy interesante la comparaticas entre el ASM y el C. Buen trabajo.
¿Puedes hacer este ejemplo? Con el PIC 16F84A o similar que un pulsador (no interruptor) puedas encender o apagar un Led. Con un interruptor es muy sencillo pero... ...¿en pulsador? La cosa cambia. ¿Alguien se anima? |