Curso tutorial del PIC16F877

hola teopter: podes usar e l pic16f877, este tine el conversor A/D y tenes una bocha de patas libres, para usar comoi entrada o salidas. :)
 
Bueno, sobre como escribir un mensaje en un LCD depende del programa que estes usando para hacer tu código, te recomiendo el PIC BASIC, aqui te pongo un pequeño ejemplo para un pic 876a, no te hagas mucho lio con el tipo de pic, ya que en si el programa es el mismo.

Código:
'*****************************************************************
@ DEVICE PIC16F876A,WDT_OFF,PWRT_OFF,BOD_OFF,CPD_OFF,PROTECT_OFF
define osc 20 'Esto es para usar un oscilador de cristal de 20 mhz

'los siguientes "define" son para definir las patitas del LCD que utilizaras
DEFINE LCD_DREG PORTC 'el lcd se colocará en el puerto c del pic
DEFINE LCD_DBIT 0	'Datos sera con las patitas: C0-C3
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 4	'Bit de registro C4
DEFINE LCD_EREG PORTC
DEFINE LCD_EBIT 5	'Bit de enable C5

ADCON1 = 6 'Puerto A como E/S digital

'escribe en el LCD el texto "Insertar LLave"
LCDOUT $FE,1,"Inserta llave"
'*****************************************************************

Eso seria todo, a continuación te pondre los códigos específicos para manipular el LCD con el PICBasic

$FE, 1 --> limpia el visor del LCD
$FE, 2 --> Vuelve al inicio(comienzo de la primera linea)
$FE, $0c --> apaga el cursor
$FE, $0e --> subryado del cursor activo
$FE, $0f --> parpadeo del cursor activo
$FE, $10 --> mover el cursor una posición a la izquierda
$FE, $14 --> mover el cursor una posición a la derecha
$FE, $80 --> mover el cursor al comienzo de la primera linea
$FE, $c0 --> mover el cursor al comienzo de la segunda linea
$FE, $94 --> mover el cursor al comienzo de la tercera linea
$FE, $d4 --> mover el cursor al comienzo de la cuarta linea

siempre debes anteponer el texto "lcdout" y luego el comando

ahora por ejemplo si deseas escribir el valor de una variable sería como sigue.
LCDOUT $FE,$80,"temperatura = ", dec temp

el prefijo dec indica que la variable que se imprimirá se escribirá como valor entero (1byte, 0-255); ten en cuenta que deberias haber declarado antes la variable temp de la siguiente manera:

temp var byte '0-255 valores posibles


espero te sirva ....
 

Adjuntos

  • lcd_929.jpg
    lcd_929.jpg
    34.3 KB · Visitas: 139
HOLA compañeros despues de un largo tiempo de ausencia he regresado ahora si que el trabajp no me ha dejado pero aqui seguimos, quiero empezar estas lineas con un muy profundo agradecimiento a todos ustedes que han valorado el tutorial,los programas he información que subi y por lo cual hoy me doy cuenta que ha servido para alimentar el espiritu de conocimiento de aquellos que van empezando en cuyos zapatos alguna vez yo estuve.

¡¡¡¡¡¡¡Recordatorio!.......A los chavos nuevos por favor chequen bien este POST desde el principio ya que encontraran información para poder empezar desde cero con EL PIC16F877 y ASM ademas de unos cuantos en C.


he leido algunos comentarios y comenzare a responder algunos muy especificos:

1) hola Armentatron cheque tu programa del mensaje y la interrupcion que dices que no te sale, bueno me di a la tarea de compilarlo en MPLAB y me arrojo algunos errores, para corregirlos solo es cuestion de organizar como vas a estructurar tus etiquetas, instrucciones y registros, sobre la interrupcion el problema es que cuando se usa la instruccion
CALL entonces siempre tienes que regresar de la subrutina que llamaste con un return ya que por el contrario el programa se te cicla y por causa posiblemente la interrupcion nunca se ejecuta, lo de las etiquetas, instrucciones y registros te lo explico en el documento que adjunto.

2) compañero Teopter09 para el diseño del control de temperatura podrias usar el ya famoso sensor de presicion LM35 que te entregara un voltaje equivalente a la temperatura aplicada sobre el integrado y ese voltaje lo puedes meter al ADC del pic16f877.

3) amigo argentino Msanduay creo que el PIC16F877 es mas que suficiente para el proposito de tu proyecto del motor con los sensores y el adc ya que este cuenta con los puertos A,B,C,D y E para su manipulacion, o en otro caso tambien podrias usar el 16F882 ya que cuenta tambien ADC y 3 puertos de 8 bits.

4) colega Crisaquilar bajate el MPlab un compañero de este foro en las paginas anteriores puso un Link para descargar la version 8.1 creo y ademas lee el principio de este tema para que veas el tutorial que publique y los ejemplos y diferente información que se ha subido como la información de Sangreaztk, Alejandro sherar, fidodido18 entre otros mas que han aportado excelente información.
 
¡Y tambien aprovecho para hacer un agradecimiento a todos aquellos que han subido información y que no importa que tan grande o pequeña sea lo importante es la intecion de compartir el conocimiento e invito a los demas a hacer lo mismo no importa si son nuevos en el tema si encuentran algo que ustedes crean conveniente compartir adelante!....


Tambien he visto que muchos tienen la inquietud de programar en C, por mi parte apenas unos meses empeze a programar en C con el PCWHD compiler y creanme se me ha facilitado, pero creo que una de las causas es que ya sabia enzamblador asi que les doy un tip en este foro hay un tema donde un chavo publico un tutorial aqui dejo el link y ademas adjunto el manual que yo he visto que se usa mas en el hambito de la programacion en C...... aqui dejo el Link

https://www.forosdeelectronica.com/f24/curso-programacion-c-microcontroladores-pic-10796/
 
Bueno colegas aqui les dejo la segunda parte del primer tutorial que publique espero les sirva
en el documento digo que es la ultima parte porque me gustaria hacer algo de lenguaje en C pero
a ver que pasa de todos modos si tienen alguna duda contactenme, se aceptan comentarios, aclaraciones
y ya saben hay que seguir practicando.

Saludos a Todos!

el otra vez puse una pagina de donde podian bajar el C, y otros programas pero creo que la escribi mal
esta es www.4shared.com
 

Adjuntos

  • microcontroladores_el_pic16f877a_el_tutorial_2_175.rar
    444.2 KB · Visitas: 364
Aqui les dejo el manual del Winpic800 esta modificado es que lo hice a partir de uno que baje de la pagina del autor
y estava muy pesado para subir asi que lo resumi espero les sirva.




POn uN poco de TI y Moveras al MUNDO dame un PIC y lo hare Electronico.
snakewather.
 

Adjuntos

  • manual_winpic800_198.rar
    736.4 KB · Visitas: 155
Que gusto verte de nuevo aqui snakewather, ya te compraste tu adaptador wireless USB?, ya tengo el CD que me pediste, pero no he tenido chance de llevartelo.

Respecto a lo que comentas tienes razon, pues el comenzar con ensamblador te facilita cuaquier otro lenguaje, ya que cual quiera es bueno, pero les recomiendo que si van a usar Basic o C, se apliquen mas por el C, y no olviden seguir practicando el ensamblador, la verdad hay que reconocer la dedicacion de snakewather la publicar este manual, y a tods que han hecho sus aportaciones.


Felicidades!
 
A continuacion adjunto un ejemplo mmuy basio pero secillo del manejo del lcd en el pic16F877A, este programa es muy util porque lo pueden usar para enviar mensajes muy facil en sus proyectos,

Tal ves se les haga raro la parte siguiente:
Código:
TEXTO      addwf	PCL
dt "dOlPhIn",0x00

Pero esta parte es lo mismo que trabajar con tablas con la instruccion RETLW, es decir esto sustituye a lo siguiente:

Código:
TEXTO    addwf	PCL,F
              retlw          "d"
              retlw          "O"
              retlw          "l"
              retlw          "P"
              retlw          "h"
              retlw          "I"
              retlw          "n"
              retlw          0x00

el 0x00 lo utilizo para indicarle a la subrutina que llama a la tabla "TEXTO" el final del mensaje, y que no se quede ciclado.
Si se dan cuenta es mas facil agregar dentro de las comillas el texto a enviar, por ejemplo si queremos enviar el siguiente texto "Prueba del LCD", solo ponemos los siguiente dt "Prueba del LCD", 0x00,

Les recomiendo que cheken el manual del lcd,hay muchos en la red, de esta manera podran escribir mas facil en el display, en el codigo hay una rutina llamada "INSTRU" esta sirve para enviar instrucciones como para iniciar el LCD, configurarlo a 8 bits de datos, etc, Tambien la pueden utilizar para brincar a una posicion determinada en el display, o brincar al segundo reglon etc.
 
Código:
LIST P=PIC16F877A 
INCLUDE "P16F877A.INC"


cblock	0x20
PDel0
PDel1
TABLA
REGISTRO
endc

__CONFIG    0x3F3A

#define	LCD_EN PORTC,0				;Definciones de I/O
#define	LCD_RS PORTC,1



org     0x00
goto    INICIO
org     0x05

TEXTO		addwf	PCL,F
			dt "Hola",0x00			;Mensaje a enviar la parte de ",0x00" marca el final del mensaje asi es mas facil de neviar los msgs





INICIO	bsf		STATUS,RP0			;Declaracion de entradas y salidas
		movlw	b'00000000'			
		movwf	PORTB
		movlw	b'11111100'
		movwf	PORTC
		bcf		STATUS,RP0
		clrf	TABLA


call		LCD_INI					;Retardo para inicializar el LCD
	    	movlw	0x38			;Configuracion del LCD a datos de 8 bits, .
			call	INSTRU			;llamada a la instruccion (checar la hoja de datos del LCD para mejor entendimiento)
			movlw	0x0C			
			call	INSTRU
			movlw	0x06
			call	INSTRU
			movlw	0x02
			call	INSTRU
			bsf		LCD_RS
			bsf		LCD_EN
	
LCD			bcf		STATUS,Z
			movfw	TABLA
			incf    TABLA,F
			call	TEXTO 
			movwf	REGISTRO
			movf	REGISTRO,F
			btfsc	STATUS,Z
FIN			goto	FIN
			call 	DATO
			goto    LCD



INSTRU		bcf		LCD_RS			;Subrutina de instrucciones
			goto	ENVIO

DATO		bsf		LCD_RS			;Subrutina de envio de datos
			movfw	REGISTRO
ENVIO		bsf		LCD_EN	;E=1
			nop
			movwf	PORTB
			call	DOSMS
			bcf		LCD_EN ;E=0
			nop
			return

;..............................................................................................................................
													RETARDOS
;..............................................................................................................................	

DOSMS   	movlw   .250     
        	movwf   PDel0    
PLoop01 	clrwdt           
PDelL11 	goto 	PDelL21  
PDelL21 	goto 	PDelL31  
PDelL31  
        	decfsz  PDel0, 1  
        	goto    PLoop01   
PDelL41 	goto 	PDelL51   
PDelL51 	clrwdt            
        	return            
                 
		

LCD_INI   	movlw     .255     
        	movwf     PDel0     
PLoop1  	movlw     .253     
        	movwf     PDel1     
PLoop2  	clrwdt              
        	clrwdt              
        	decfsz    PDel1, 1  
        	goto      PLoop2    
        	decfsz    PDel0,  1 
        	goto      PLoop1    
PDelL1  	goto 	  PDelL2        
PDelL2  
        	return        

			end
 
Estoy tratando de pasar un programa en esembler a hex, pero no se que significan todo estos errores.
Necesito que alguien me aclare el significado de estos errores.
Estoy usando mplab.
Gracias.
Estos son algunos de los mensajes de error

Error[115] C:\DMX_MPLAB.ASM 244 : Duplicate label ("PS1" or redefining symbol that cannot be redefined)
Warning[207] C:\DMX_MPLAB.ASM 245 : Found label after column 1. (PS0)
Error[113] C:\DMX_MPLAB.ASM 245 : Symbol not previously defined (OPTION_REG.0)
Error[113] C:\DMX_MPLAB.ASM 247 : Symbol not previously defined (PIE1.7)
Error[115] C:\DMX_MPLAB.ASM 247 : Duplicate label ("PSPIE" or redefining symbol that cannot be redefined)
Error[113] C:\DMX_MPLAB.ASM 248 : Symbol not previously defined (PIE1.6)
Error[115] C:\DMX_MPLAB.ASM 248 : Duplicate label ("ADIE" or redefining symbol that cannot be redefined)
Error[113] C:\DMX_MPLAB.ASM 249 : Symbol not previously defined (PIE1.5)
Error[115] C:\DMX_MPLAB.ASM 249 : Duplicate label ("RCIE" or redefining symbol that cannot be redefined)
Error[113] C:\DMX_MPLAB.ASM 250 : Symbol not previously defined (PIE1.4)
Error[115] C:\DMX_MPLAB.ASM 250 : Duplicate label ("TXIE" or redefining symbol that cannot be redefined)
Warning[207] C:\DMX_MPLAB.ASM 251 : Found label after column 1. (SSPIE)
Error[113] C:\DMX_MPLAB.ASM 251 : Symbol not previously defined (PIE1.3)
Error[115] C:\DMX_MPLAB.ASM 251 : Duplicate label ("SSPIE" or redefining symbol that cannot be redefined)
Error[108] C:\DMX_MPLAB.ASM 252 : Illegal character (,)
Error[115] C:\DMX_MPLAB.ASM 252 : Duplicate label ("CCP1IE" or redefining symbol that cannot be redefined)
Error[113] C:\DMX_MPLAB.ASM 253 : Symbol not previously defined (PIE1.1)
Error[115] C:\DMX_MPLAB.ASM 253 : Duplicate label ("TMR2IE" or redefining symbol that cannot be redefined)
Error[113] C:\DMX_MPLAB.ASM 254 : Symbol not previously defined (PIE1.0)
Error[113] C:\DMX_MPLAB.ASM 256 : Symbol not previously defined (PCON.1)
Error[115] C:\DMX_MPLAB.ASM 256 : Duplicate label ("NOT_POR" or redefining symbol that cannot be redefined)
Error[113] C:\DMX_MPLAB.ASM 257 : Symbol not previously defined (PCON.0)
Error[113] C:\DMX_MPLAB.ASM 258 : Symbol not previously defined (PCON.0)
Error[113] C:\DMX_MPLAB.ASM 260 : Symbol not previously defined (TXSTA.7)
Error[115] C:\DMX_MPLAB.ASM 260 : Duplicate label ("CSRC" or redefining symbol that cannot be redefined)
Error[113] C:\DMX_MPLAB.ASM 261 : Symbol not previously defined (TXSTA.6)
Error[115] C:\DMX_MPLAB.ASM 261 : Duplicate label ("TX9" or redefining symbol that cannot be redefined)
Error[113] C:\DMX_MPLAB.ASM 262 : Symbol not previously defined (TXSTA.6)
Error[115] C:\DMX_MPLAB.ASM 262 : Duplicate label ("NOT_TX8" or redefining symbol that cannot be redefined)
Error[113] C:\DMX_MPLAB.ASM 263 : Symbol not previously defined (TXSTA.6)
Error[115] C:\DMX_MPLAB.ASM 263 : Duplicate label ("TX8_9" or redefining symbol that cannot be redefined)
Error[113] C:\DMX_MPLAB.ASM 264 : Symbol not previously defined (TXSTA.5)
Error[115] C:\DMX_MPLAB.ASM 264 : Duplicate label ("TXEN" or redefining symbol that cannot be redefined)
Error[113] C:\DMX_MPLAB.ASM 265 : Symbol not previously defined (TXSTA.4)
Error[115] C:\DMX_MPLAB.ASM 265 : Duplicate label ("SYNC" or redefining symbol that cannot be redefined)
Error[113] C:\DMX_MPLAB.ASM 266 : Symbol not previously defined (TXSTA.2)
Error[115] C:\DMX_MPLAB.ASM 266 : Duplicate label ("BRGH" or redefining symbol that cannot be redefined)
Error[113] C:\DMX_MPLAB.ASM 268 : Symbol not previously defined (TXSTA.0)
Error[113] C:\DMX_MPLAB.ASM 269 : Symbol not previously defined (TXSTA.0)
Error[113] C:\DMX_MPLAB.ASM 271 : Symbol not previously defined (ADCON1.7)
Error[115] C:\DMX_MPLAB.ASM 271 : Duplicate label ("ADFM" or redefining symbol that cannot be redefined)
Error[115] C:\DMX_MPLAB.ASM 272 : Duplicate label ("PCFG3" or redefining symbol that cannot be redefined)
Error[115] C:\DMX_MPLAB.ASM 273 : Duplicate label ("PCFG2" or redefining symbol that cannot be redefined)
Error[108] C:\DMX_MPLAB.ASM 274 : Illegal character (,)
Error[113] C:\DMX_MPLAB.ASM 275 : Symbol not previously defined (ADCON1.0)
Error[113] C:\DMX_MPLAB.ASM 306 : Symbol not previously defined (PORTA.1)
Error[113] C:\DMX_MPLAB.ASM 307 : Symbol not previously defined (PORTA.2)
Error[113] C:\DMX_MPLAB.ASM 308 : Symbol not previously defined (PORTA.3)
Error[113] C:\DMX_MPLAB.ASM 309 : Symbol not previously defined (PORTA.3)
Error[113] C:\DMX_MPLAB.ASM 310 : Symbol not previously defined (PORTA.4)
Error[113] C:\DMX_MPLAB.ASM 311 : Symbol not previously defined (PORTA.5)
Error[113] C:\DMX_MPLAB.ASM 314 : Symbol not previously defined (PORTB.0)
Error[113] C:\DMX_MPLAB.ASM 315 : Symbol not previously defined (PORTB.1)
Error[113] C:\DMX_MPLAB.ASM 319 : Symbol not previously defined (PORTB.3)
Error[113] C:\DMX_MPLAB.ASM 320 : Symbol not previously defined (PORTB.1)
Error[113] C:\DMX_MPLAB.ASM 326 : Symbol not previously defined (PORTB.7)
Error[113] C:\DMX_MPLAB.ASM 329 : Symbol not previously defined (PORTC.0)
Error[113] C:\DMX_MPLAB.ASM 330 : Symbol not previously defined (PORTC.1)
Error[113] C:\DMX_MPLAB.ASM 331 : Symbol not previously defined (PORTC.2)
Error[113] C:\DMX_MPLAB.ASM 332 : Symbol not previously defined (PORTC.3)
Error[113] C:\DMX_MPLAB.ASM 333 : Symbol not previously defined (PORTC.4)
Error[113] C:\DMX_MPLAB.ASM 343 : Symbol not previously defined (PORTD.4)
Error[113] C:\DMX_MPLAB.ASM 344 : Symbol not previously defined (PORTD.5)
Error[113] C:\DMX_MPLAB.ASM 345 : Symbol not previously defined (PORTD.6)
Error[113] C:\DMX_MPLAB.ASM 346 : Symbol not previously defined (PORTD.7)
Error[113] C:\DMX_MPLAB.ASM 349 : Symbol not previously defined (PORTE.0)
Error[113] C:\DMX_MPLAB.ASM 350 : Symbol not previously defined (PORTE.1)
Error[113] C:\DMX_MPLAB.ASM 397 : Symbol not previously defined (Flags.6)
Error[113] C:\DMX_MPLAB.ASM 398 : Symbol not previously defined (Flags.7)
Error[115] C:\DMX_MPLAB.ASM 410 : Duplicate label ("EEIF" or redefining symbol that cannot be redefined)
 
Debes utilizar comas en vez de puntos, por ejemplo PORTE,1 en vez de PORTE.1 y verifica que estes cargando y seleccionado el pic correcto, incluye el asm. Utiliza el buscador para ver ejemplos de programacion
 
Gracias por responder.
Mira he reemplazo el punto por la coma como me decis ahi y me sale lo siguiente:
por ejemplo de esta linea PS1 EQU OPTION_REG,1
me sale el siguiente error:
Error[108] C:\DMX_MPLAB.ASM 244 : Illegal character (,)
Error[115] C:\DMX_MPLAB.ASM 244 : Duplicate label ("PS1" or redefining symbol that cannot be redefined)
Tomo tu consejo de buscar ejemplos.

Seria interesante ya que estamos estudiando los compiladores que alguien traduzca los significados de los errores.

Gracias.
 
Hola a ver si alguien me puede hechar una mano

tengo que realizar una programa que tenga estos 2 registros y las salidas esten en el puerto c se debe realizar una operacion de divicion , pero llego a un punto que no se que hacer , se que para este pic debo hacer restas (la division no la permite) pero no se como seguir la secuencia es decir si divido 8 entre 4 , ps primero 8-4 , y luego 4-4 y cuando sea 0 que me muestre el resultado en el puerto c con unos leds conectados (ademas de eso ahi una condicion de un led ra0 que esta a continuacion)

0 0 0 0 RB3 RB2 RB1 RB0 DIVIDENDO
0 0 0 0 RB7 RB6 RB5 RB4 DIVISOR

se debe realizar diviciones según los registros, el puerto de salida va a ser el portc , ademas si la division da como resultado un resultado valido ra0 con un led prende si el resultado es invalido apaga (si da numero -1 al realizar las restas)

Código:
                LIST                        
        DIVIDENDO EQU  20H        definicion de los bits                
        DIVISOR EQU 21H        
        RESP EQU 22H        

        BSF STATUS,RP0        pasamos al banco 1
        MOVLW 0FFH        ponemos a b como entradas
        MOVWF TRISB        
        CLRF TRISC        clareamos c  para ponerlo de salida
        BCF STATUS,RP0        pasamos al banco 0

LEA        MOVF PORTB,0        mueve port b   a w
        MOVWF DIVIDENDO        mueve w a dividendo
        MOVWF DIVISOR        mueve w a divisor
        SWAPF DIVISOR,1         intercambio de nibble queda en el divisor
        BCF DIVIDENDO,04        clarear dividendo
        BCF DIVIDENDO,05        clarear dividendo
        BCF DIVIDENDO,06        clarear dividendo
        BCF DIVIDENDO,07        clarear dividendo
        BCF DIVISOR,04        clarear divisor
        BCF DIVISOR,05        clarear divisor
        BCF DIVISOR,06        clarear divisor
        BCF DIVISOR,07        clarear divisor
        CLRF RESP

GRACIAS Y ESPERO ME PUEDAS COLABORAR O SI SABES EN DONDE PUEDO ENCONTRAR ALGO DE INFO YA QUE LO QUE HE ENCONTRADO NO ES MUY CLARO .

pdta; perdonaran pero hasta ahora estoy empezando con los pics
 
Última edición por un moderador:
Tambien puedes ver la nota de aplicacion 544 de Microchip, encontrar la rutina de division, copiarla y pegarla... primeramente necesito que me confirmes si la division que quieres hacer es de 8 bits sin signo.....
 
Hola

Como dice el título lo que quiero hacer es que 8 pulsadores se comporten como interruptores con un pic 16f84 .... un flip-flop

Recien estoy empezando a meterme en el mundo de los microcontroladores y me gustaría que me pasen algún programa que funcione y que haga dicha funcion, si está comentado mejor .... leí varios manuales, inclusive los de los microcontroladores de motorola, en la facultad vi algo de microcontroladores, pero no me quedo para nada claro y mi intención es aprender un poco más para implementar este tipo de circuitos.

Desde ya muchas gracias !
 
hola a todos
quería felicitarlos por el tema, yo comenze hace una semana a programar con el PIC16f877 es mi primer experiencia con PICs y me parece un buen microcontrolador con un buen numero de puertos y lo hacen ideal para el manejo de varios componentes: LCDs, leds, puertos: todo en conjunto.
aun no he conseguido el PIC fisicamente, sin embargo ya he concluido varios proyectos en el MPLAB y funcionan perfectamente, la depuraciones y simulaciones se pueden hacer con el PICSimulator IDE muy buena opción o el Proteus ...

quisiera saber como puedo conseguir dicho PIC y si se puede desde Argentina a través de Microchip y detalles

Gracias
 
Atrás
Arriba