hola amigos buenas noches vengo por aca buscando una ayuda con este codigo, es variador de velocidad activado por interrupcion en el puerto B0 y por TMR0, resulta que cuando quiero visualizar en un display LCD, el programa se desconfigura, he tratado de usar la instruccion SEROUT para visualizarlo en otro pic pero tambien pasa lo mismo.
He intentado varias cosas pero no me da .
De ante mano muchas por tan excelente foro me a ayudado bastanto a enterder el lenguaje Basic.
Aqui el codigo y adjunto la simulacion en proteus 8.
PD: Disculpa subi los archivos que no eran, el codigo sirve para los dos, lo unico es modificar el codigo para que funcione.
en archivo final con LCD y RS232 esta el codigo del otro pic que recibe los datos.
.
He intentado varias cosas pero no me da .
De ante mano muchas por tan excelente foro me a ayudado bastanto a enterder el lenguaje Basic.
Aqui el codigo y adjunto la simulacion en proteus 8.
Código:
CLEAR ;Limpio la memoria RAM
INCLUDE "MODEDEFS.BAS"
DEFINE CHAR_PACING 1000
'************************** CONFIGURACION DE FUSES *****************************
_INTRC_OSC_NOCLKOUT ' Reloj interno solo.-
_WDT_OFF ' Watchdog Timer desconectado.-
_PWRT_ON ' Power-On Timer conectado.-
_BOD_OFF ' Brown-Out Detect conectado.-
_MCLR_OFF ' Master Clear Externo desconectado.-
_LVP_OFF ' Low-Voltage Programming desconectado.-
_CPD_OFF ' Data Memory Code Protect desconectado.-
_PROTECT_OFF ' Program Code Protection desconectado.-
'******************** DEFINICION DE REGISTROS Y PUERTOS ************************
CMCON = 7
TRISA = %0111
TRISB = %00000000
PORTB = %11111100
'PORTB = %001000
'****************** DEFINICION DE LA PANTALLA LCD ******************************
DEFINE LCD_BIT 4
DEFINE LCD_LINES 2
DEFINE LCD_DREG PORTB ; configuro la pantalla LCD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
'******************** ASIGNACION DE VARIABLES **********************************
DISMINUIR VAR PORTA.0
START_STOP VAR PORTA.1
AUMENTAR VAR PORTA.2
;LEDR VAR PORTB.3
LEDV VAR PORTA.3
ON_OFF VAR BIT
POWER VAR WORD
VISUALIZAR VAR BYTE
'******************** ASIGNACION DE ALIAS AL REGISTRO INCONT *******************
SYMBOL GIE = INTCON.7 ;Habilitador de interrupciones, 1 habilita - 0 desabilita
SYMBOL TOIE = INTCON.5 ;Habilita la interrupcion por TMR0, 1 habilita - 0 desabilita
SYMBOL INTE = INTCON.4 ;Habilita la interrupcion por RB0, 1 habilita - 0 desabilita
SYMBOL TOIF = INTCON.2 ;Bandedera de interrupcion por desborde del TMR0, 1 TMR0 pasa de 255 a 0
SYMBOL INTF = INTCON.1 ;Bandera de interrupcion por RB0, 1 cuando ocurre interrupcion por RB0
'******************** ASIGNACION DE ALIAS AL REGISTRO OPTION *******************
'symbol RBPU = OPTION_REG.7 ;Activacion de las resistencias PullUp 1 ON - 0 OFF
'SYMBOL INTEDG = OPTION_REG.6 ;Flanco activo de la int. externa 1 ASCENDENTE - 0 DESCENDENTE
'SYMBOL TOCS = OPTION_REG.5 ;Senal de reloj 1 POR RA4 - 0 RELOJ INTERNO
''SYMBOL TOSE = OPTION_REG.4 ;Incremento de TMR0 por RA4
'SYMBOL PSA = OPTION_REG.3 ;Divisor de frecuencia 1 WTD - 0 TMR0
'SYMBOL PS2 = OPTION_REG.2 ;1 1 1 1 0 0 0 0
'SYMBOL PS1 = OPTION_REG.1 ;1 = 256 1 = 128 0 = 64 0 = 32 1 = 16 1 = 8 0 = 4 0 = 2
'SYMBOL PS0 = OPTION_REG.0 ;1 0 1 0 1 0 1 0
ON INTERRUPT GOTO IRS ;Habilito la interrupcion
'INTCON = %10010000 ;Habilito las interrupciones por RB.0 y por el Timer0
'OPTION_REG=%00000101 ;configuro el registro OPTION_REG
HIGH LEDV ;
PAUSE 2000 ;Prender y apagra el led durante 2 segundos
LOW LEDV ;
POWER= 216 ;Inicio la variable power con 255
TMR0=126 ;Inicio el TMR0 con 126
'************************* INICIO DEL PROGRAMA *********************************
INICIO:
' SEROUT PORTB.2,T2400,[POWER,13,10]
' LCDOUT $FE, 1, "ESTADO:"
' LCDOUT $FE, $C0, dec power,"-", dec TMR0
'pause 500
IF START_STOP=0 THEN PRENDER_APAGAR
IF DISMINUIR=0 THEN BAJAR
IF AUMENTAR=0 THEN SUBIR
GOTO INICIO
'************************** PRESION DE TECLAS **********************************
PRENDER_APAGAR:
IF START_STOP=0 THEN ;Si start-stop es = 0
while START_STOP=0
wend
pause 50 ;pause 50 ms
toggle ON_OFF ;Colocar en estado contrario la bandera on_off
;(si esta en 1 pase a 0 o viceverza)
ENDIF
IF ON_OFF=1 THEN ;Si on_off esta en 1
HIGH LEDV ;Prender led verde
OPTION_REG=%11000101 ;RBPU=1- INTEDG=1- T0CS=0- T0SE=0- PSA=0- PS=64
' RBPU= 1 : INTEDG= 1 : TOCS= 0 : PSA= 0 : PS2= 1 : PS1=0 : PS0= 1
GIE= 1 : INTE= 1 :
TRISB.0=1 ;Activar la interrupcion por RB0
else
ON_OFF=0
' IF power <= 255 THEN
' POWER = 255
' ENDIF
POWER = 216
TRISB.0=0
LOW portb.1
LOW LEDV
OPTION_REG=%10000000
INTCON=%10010000
ENDIF
GOTO INICIO
BAJAR:
IF DISMINUIR=0 THEN
while DISMINUIR=0
wend
POWER=POWER+10
IF POWER>=255 THEN
POWER = 255
ENDIF
ENDIF
GOTO INICIO
SUBIR:
IF AUMENTAR=0 THEN
while AUMENTAR=0
wend
POWER=POWER-10
IF POWER<=127 THEN
POWER=127
ENDIF
ENDIF
GOTO INICIO
''***************************** INTERRUPCION ************************************
disable
IRS:
if INTF = 1 then ;Pregunto si bandera de interrupcion por RB0 esta en 1 entonces
toie = 1 ;Habilita la interrupcion por TMR0 habilita la interrupción por B.0
TMR0=126-power ;Variar el valor del TMR0
LOW portb.1 ;Apago portb.1
intf = 0 ;Bandera de interrupcion por RB0, 0 para inicializar la interrupcion por RB0
ENDIF
IF TOIF = 1 THEN ;habilito la bandedera de interrupcion por desborde del TMR0
HIGH PORTB.1 ;Prendo el puerto portb.1
TOIF = 0 ;Bandedera de interrupcion por desborde del TMR0, 0 para inicializar
ENDIF
RESUME 'PRENDER_APAGAR ;Volver a donde ocurrio la interrupcion
ENABLE ;Habilito la interrupcion
END ;Fin del programa
PD: Disculpa subi los archivos que no eran, el codigo sirve para los dos, lo unico es modificar el codigo para que funcione.
en archivo final con LCD y RS232 esta el codigo del otro pic que recibe los datos.
.
Adjuntos
Última edición: