TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: flecha en 11 de Abril de 2007, 22:01:47
-
hola de nuevo si yo FLECHA con mis preguntas raras.
la de hoy y con urgencia es la sigte :
ya que tengo que terminar el proyecto del otro dia necesito me aclaren como hacer esto.
les recuerdo de que se trata mi proyecto, es sencillamente controlar una o dos salidas (a esta conectare un bombillo por elemplo) del pic 16f873 pero el control de encendido y apagado de la carga se debe hacer desde un PC(osea que debo usar el usart del pic ), el problema en resumidas cuentas es que tengo el codigo de una revista que encontre por alli en donde dice hace esa tarea pero no se como diseñarle la interfaz para que el PC me reciba los datos del PIC y este a su vez tambien envie a la PC el estado de las salidas el codigo es el siguiente:
NOTA
si alguien me puede colaborar le agrdeceria, aqui pongo el asm del pic 16f873 que encontre en la revista y tambien lo adjunto para que lo vean mas ordenado, yo entiendo hasta lo de la comunicacion serial pero me pierdo en como se envia y reciben los datos del PIC GRACIAS
03h ;registro de estados
INTCON equ 0bh ;registro INTCON
PIE1 equ 8ch ;registro de interrupcion perifericos
PIR1 equ 0ch ;Bandera de interrupcion
RCSTA equ 18h ;registro de Estado de Rx
TXSTA equ 98h ;registro de estado de Tx
SPBRG equ 99h ;registro generador de baud rate
TX equ 19h
RX equ 1Ah
OPCION equ 81h
PORTA equ 05h ;direccion en RAM
PORTB equ 06h ;direccion 06 de la RAM
PORTC equ 07h
loops equ 0dh ;utilizado en retardos
loops2 equ 0eh ;utilizado en retardos
TRISA equ 85h ;configuracion del puerto A
TRISB equ 86h ;configuracion puerto B
TRISC equ 87h ;configuracion puerto C
RX1 equ 20h ;registro para los datos Rx
RX2 equ 21h
RX11 equ 22h
RX22 equ 23h
CONTARX equ 24h ;contador de bytes recibidos
RXMEM equ 25h ;Guarda el ultimo Rx leido
z equ 02h ;bandera de 0 del registro de estados
c equ 00h ;bandera de carry del registro de estados
w equ 00h ;el resultado se guarda en w
r equ 01h ;el resultado se guarda enen registro
reset org 00h ;reset en la direccion 00
goto inicio ;se salta al inicio del programa
;---------------------interrupciones-----------------------
interrupcion
org 4 ;rutina de interrupcion
btfss PIR1,5 ;verifica si hay int de USART
goto saleint
movf RX,w ;lee el registro serial
movwf RXMEM ;lo guarda en memoria
incf CONTARX,r ;contador de bytes recibidos
movf CONTARX,w ;carga el contador de bytes
xorlw 01h ;compara
btfsc STATUS,z ;si es cero(diferente)salta
goto primerbyte ;si es igual......
movf CONTARX,w ;carga el contador de bytes
xorlw 02h ;compara
btfsc STATUS,z ;si es cero(diferente)salta
goto segbyte ;si es igual......
movf CONTARX,w ;carga el contador de bytes
xorlw 03h ;compara
btfsc STATUS,z ;si es cero(diferente)salta
goto tercerbyte ;si es igual
goto cuartobyte
primerbyte
movf RXMEM,w ;lee dato serial memorizado
movwf RX1 ;lo guarda en el registro del dato1
goto saleint
segbyte
movf RXMEM,w ;lee dato serial memorizado
movwf RX2 ;lo guarda en el registro del dato2
goto saleint
tercerbyte
movf RXMEM,w ;lee dato serial memorizado
movwf RX11 ;lo guarda en el registro del dato3
goto saleint
cuartobyte
movf RXMEM,w ;lee dato serial memorizado
movwf RX22 ;lo guarda en el registro del dato4
clrf CONTARX ;pone en ceros el contador de bytes
movf RX1,w ;lee dato serial memorizado
xorwf RX11,w ;compara el 1er y 3er byte
btfss STATUS,z ;si la bandera es uno (iguales)
salta
goto enviar
movf RX1,w ;tomar el 1er byte recibido
movwf PORTA ;LO TRANSFIERE AL PUERTO A
movf RX2,W
xorwf RX22,w ;compara el 2do y 4to byte
btfss STATUS,z ;si la bandera es uno(1) (iguales)
salta
goto saleint
movf RX2,w ;toma el 3er byte recibido
movwf PORTC ;lo transfiere al puerto c
enviar
movf RX1,w
movwf TX ;envia el 1er byte hacia el Pc
call retardo
comf PORTB,w
movwf TX ;envia el puertoB hacia el Pc
call retardo
movf RX2,w
movwf TX ;envia el 3er byte hacia el Pc
saleint
retfie ;regresa de la interrupcion
;---------------PROGRAMA PRINCIPAL-----------------------
inicio bsf STATUS,5 ;banco 2
movlw B'00000000' ;
movwf TRISA ;puerto A como salidas
movlw B'11110111' ;
movwf TRISB ;puerto B como entradas
movlw B'10000000' ;
movwf TRISC ;puerto C como salidas
movlw 020h ;en el registro PEI1 solo se
movwf PIE1 ;SE PROGRAMA bit para interrupcion serial
movlw B'00100100' ;en el registro de estado de Tx se
movwf TXSTA ;programan TXENAB Y BRGH
movlw D'25' ;en el registro de baud rate se
movwf SPBRG ;para 9600 bps (clock=4MHZ)
bcf STATUS,5 ;BANCO 1
movlw 0c0h ;en el registro INTCON solo se
movwf INTCON ;bit PEIE y se habilita GIE
movlw B'10010000' ;en el registro de estado de RX
movwf RCSTA ;se programa bit SPENAB Y CRENAB
movlw 00h
movwf CONTARX ;se pone en ceros el cont de bytes
leer
nop
nop
goto leer ;
;-------------------------------------------------------------------------
retardo ;subrutina de retardo de 50 milisegundos
movlw D'10' ;el registro loops contiene el numero
movwf loops ;de milisegundos del retardo
top2 movlw D'110' ;
movwf loops2 ;
top nop
nop
nop
nop
clrwdt
nop
decfsz loops2 ;pregunta si termino 1 ms
goto top
decfsz loops ;pregunta si termina el retardo
goto top2
retlw 0
end
;===================================================================================
;fusibles de programacion
; osc XT
; watchdog off
; code protect off
; power-up-timer ON
; micro. PIC16F873
;===================================================================================
-
Amigo, te pido 2 cosas
1) Sube el código enmarcado con [ code ] y [ / code ] (sin espacios) .
2) Dinos exactamente qué parte del código es la que no entendes.
Te explico porqué. Si no entiendes este software, muy difícil te será hacer la interfaz también de pc y que además esta interfaz interactúe con el pic.
Tal vez te convenga usar C u otro lenguaje que te facilite las cosas.
-
hola,este programa que te pongo aqui abjo es un proyecto que estoy desarroyando,que todabia no esta acabado,pero te puede serbir para que comprendas el funcionamiento de la transmision por usart.ademas si programas un pic con el te va a funcionar automaticamente.
porque lo estoy probando ahora mismo.
yo estaba estancado como tu y es que cometi un error al soldar la patilla de salida del max232.y me estaba volviendo loco.asi que me hice un circuito que mandase por el RC6"tx" los numeros del 1 al 0 ,y este conectarselo al interface hecha con el max232 hacia el pc.y eureca al instante tenia visualizandose los numeros en el hiperterminal.
luego conecte este circuito al pictrainer con el programa que te he puesto,y me salieron los datos 1 al 0 por el puerto b.
ten en cuenta que este asm solo es para recivir ,si lo termino pronto y lo quieres lo pones en este mismo canal.
;****************************************** http://www.x-robotics.com *******
; PROGRAMA : rs232.asm
; Funcion : comunicador pc-pic
; Serial port config: 9600 baudios,8 bits,paridad = none
;
; Revision : 1.0 7/2/2002 Programa para : PIC16F876
; CPU Clock : 4 MHz Reloj instruccion : 1 MHz = 1 us
; WDT : Deshabilitado Tipo de reloj : XT
; Code Prot : OFF
;****************************************** http://www.x-robotics.com *******
LIST P=16F876 ;Se indica el modo de procesador
RADIX HEX ;Sistema de numeracion hexadecimal
INCLUDE <P16f876.inc> ;se incluye la definicion de los
;registros internos
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF &_WRT_ENABLE_OFF
ERRORLEVEL -302
CounterA EQU 20h
CounterB EQU 21h
CounterC EQU 22h
KEY_1 EQU 23h
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
ORG 0x00 ;Inicio en el Vector de Reset
goto INICIO ;Va a la primera instruccion del
;<<<<<<------------------- VECTOR DE INTERRUPCION -------------------->>>>>>>
ORG 0x04 ;Vector de interrupcion
goto INTER
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO ;goto INICIO
BANK1
clrf TRISB ;Puerta B como salida
movlw b'10111111' ;RC7/Rx entrada,
movwf TRISC ;RC6/Tx salida.
movlw 0x00
movwf TRISA
movlw .25 ;9600 baudios
movwf SPBRG
movlw b'00100100' ;Configuracion USART modo alta velocidad 9600 baud
movwf TXSTA ;y activacion de transmision
bsf PIE1,RCIE ;Habilitacion interrupcion RX
;bsf PIE1,TXIE
BANK0 ;Cambio al banco 0 -------------
movlw b'10010000' ;Configuracion de la usart
movwf RCSTA ;para recepcion continua y habilitacion de la usart
movlw b'11000000' ;Habilitacion para las
movwf INTCON ;interrupciones generales
clrf PORTA
BUCLE goto BUCLE ;espera aqui hasta que salte la int.
call RETARDO
bsf PORTA,0
call RETARDO
bcf PORTA,0
call COMANDO
incf KEY_1,F
movwf TXREG ; del codigo ascii
xorlw .13
btfsc STATUS,Z
goto INICIO
BANK1 ;Cambio al banco 1 -------------
COMP_TX btfss TXSTA,TRMT ;comprueba si acabo de Tx.
goto COMP_TX
BANK0 ;Cambio al banco 0 -------------
goto BUCLE
;<<<<<<----------------------- OTRAS RUTINAS ------------------------->>>>>>>
;PIC Time Delay = 1,0000020 s with Osc = 4 MHz
RETARDO
movlw D'6'
movwf CounterC
movlw D'24'
movwf CounterB
movlw D'168'
movwf CounterA
loop decfsz CounterA,1
goto loop
decfsz CounterB,1
goto loop
decfsz CounterC,1
goto loop
return
INTER BANK0
btfss PIR1,RCIF
retfie
goto LEEDATO
LEEDATO movf RCREG,W ;Lectura dato recibido
movwf PORTB ;Visualiza dato recibido
call RETARDO
VOLVER retfie ;retorna de la interrupcion.
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>
COMANDO
KEY_TABLA movf KEY_1,W
addwf PCL,F
retlw "1"
retlw "2"
retlw "3"
retlw "4"
retlw "5"
retlw "6"
retlw "7"
retlw "8"
retlw "9"
retlw "0"
return
END
-
ah hola maunix,el programa que he pueto arriva me funciona bien,pero solo si pulso las teclas del ordenado con el hiperterminal,no muy deprisa.
si lo hago rapido el pic se bloquea y tengo que reiniciarlo para que me lea las teclas que pulso.
esto puede se algun tipo de error que tenga que subsanar con los bit FERR y OERR.y como se subsanaria?
gracias.
-
si lo hago rapido el pic se bloquea y tengo que reiniciarlo para que me lea las teclas que pulso.
esto puede se algun tipo de error que tenga que subsanar con los bit FERR y OERR.y como se subsanaria?
Un OERR se subsanda borrando y encendiendo el bit RCSTA,CREN
El FERR, leyendo el byte y nada más.
Saludos