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: