Aqui os dejo el código.....
de lo que hasta ahora es mi programa de pruebas....
Es la versión genérica. porque cada dia, le cambio algo, y todo empieza a fallar de nuevo....

tal y como está, no funciona la transmisión ni la recepción por la uart....
en el hiperterminal, aparecen la letras desordenadas, y sin ningún tipo de coherencia....
como muy bien dice mglsoft, un Scrambler pero con mi desgracia, de no saber como decodificarlo...



Bueno, espero que veais algo erroneo que sea grave....

Y a los que aprendeis como yo... Espero os sirva a iniciación al tormento de los problemas y las buenas soluciones...
@ DEVICE HS_OSC
"Definición oscilador
DEFINE OSC 20
" Definición parametros serie UART
DEFINE HSER_RCSTA 90H
DEFINE HSER_TXSTA 20H
DEFINE HSER_BAUD 9600
"Definición de interrupciones
"TMR0=6
OPTION_REG=%00000100 " prescaler 1:32
INTCON = %11110000 " Enable interrupt on general,PORTB.0, timer0
"INTCON.7 = 1 "enciendo interrupciones generales - GIE
"INTCON.6 = 1 "enciendo interrupciones perifericas - PEIE
"INTCON.5 = 1 "enciendo interrupciones de TMR0 overflow - T0IE
"INTCON.4 = 1 "enciendo interrupcion RB0/INT - INTE
"INTCON.3 = 1 "RB port Change Interrupt enable bit - RBIE
"INTCON.2 = 1 "FLAG TMT0 Interrupt - T0IF
"INTCON.1 = 1 "FLAG RB0/INT external interrupt - INTF
"INTCON.0 = 1 "FLAG RB Port change interrupt - RBIF
"definición del handler de interrupción
Define INTHAND _myint
"Definición de variables de sistema para gestión de interrupciones en ASM
wsave var BYTE bank0 SYSTEM
ssave var BYTE BANK0 SYSTEM
psave var BYTE BANK0 SYSTEM
fsave var byte BANK0 SYSTEM
ticks var byte bank0 system
Convert var byte bank0 system
segundos var byte bank0 system
minutos var byte bank0 system
"Variables de programa
Flag_RB0 var bit
Flag_RB47 var bit
flag_timer var bit
flag_Uart var bit
bufferuart var byte
cont var word
trisa = %111111 " Porta todo entradas
trisb = %00000001 " Portb0 entrada demás salidas
trisc = %10111111 " Portc.7 salida TX demas entradas
goto inicio
myint:
asm
intt
bcf INTCON,GIE
;
GuardarRegistros
movwf wsave ;Salva W
swapf STATUS,W ;Invierte STATUS --> W
CLRF STATUS ; sets to BANK0
movwf ssave ;Salva STATUS
MOVF PCLATH,W
MOVWF psave ; save pclath
CLRF PCLATH
MOVF FSR,W
MOVWF fsave ; save fsr reg
;
BTFSC PIR1,RCIF ;hay enterrupción rx en la uart???
bsf _Flag_uart
btfsc INTCON,INTF ;? Hubo interrupcion en RB0 ?
goto In ;Si
btfsc INTCON,T0IF ;? Hubo sobrefujo en TMR0 ?
goto T0 ;Si
btfss INTCON,RBIF ;? Hubo algun cambio de RB4-RB7 ?
goto RestaurarRegistros ;No
;
Rb47 bcf INTCON,RBIE ;Pone a cero para poder salir de la ISR
bsf _Flag_RB47 ;Poner aqui el codigo de atención de la interrupción por cambios en RB4~RB7
goto RestaurarRegistros
;
T0 bcf INTCON,T0IF ;Pone a cero para poder salir de la ISR
decfsz ticks,f
goto RestaurarRegistros
movlw 122 ; Paso un segundo - actualiza tiempo
movwf ticks
movlw 6
movwf tmr0
clrf Convert ; Convert = 0
incf segundos,f
movf segundos,w
sublw 60
btfss STATUS,Z ; 60 segundos ?
goto RestaurarRegistros ; no
clrf segundos ; si
incf minutos,f
bsf _flag_timer
goto RestaurarRegistros
;
In bcf INTCON,INTF ;Pone a cero para poder salir de la ISR
btfss _Flag_RB0
goto in1
bcf _Flag_RB0
goto RestaurarRegistros
in1 bsf _Flag_RB0
goto RestaurarRegistros
RestaurarRegistros
; Retorna habilitando todas las interrupciones
; Restore PCLATH, STATUS and W registers
MOVF fsave,W ; get saved fsr reg
MOVWF FSR ; restore
MOVF psave,W ; get saved pclath
MOVWF PCLATH ; restore
SWAPF ssave,W ; get saved status in w
MOVWF STATUS ; restore status ( and bank )
SWAPF Wsave,F ; reload into self to set status bits
SWAPF Wsave,W ; and restore
bcf INTCON , T0IF ; Resetea bandera de interrupcion por Timer0
bsf INTCON , GIE ; Activa interrupciones generales
retfie
EndAsm
ActivaInterr:
ticks=122 " aqui, realmente, no se como calcular los ticks para 20Mhz
segundos=0
minutos=0
Flag_RB0 = 0
low portb
Return
Check_portc0:
If portc.0 = 1 then
HSEROUT ["Port.C0 Activado...",13]
endif
return
Blink:
"la idea, es usar el timer para hacer que un led parpadee a determinada frecuencia,
"pero de momento como el timer no funciona, lo he hecho asi...

if portb.6 = 0 then
if cont = 0 then
high portb.6
pause 300
else
cont = cont - 1
endif
else
low portb.6
pause 300
cont = 9000
endif
return
inicio: "***********************************************
HIGH portb.7
high portb.1
HSEROuT ["PROGRAMA DE TESTEO DE INTERRUPCION Y GESTIÓN DE UART V.1.0 FALLANDO A TOPE...",10,13]
pause 30
call activainterr
inr:
LOW PORTB
" si ha pasado algo por la uart RX, encendemos testigo portb.5
if flag_uart = 1 then
high portb.5
pause 3000
low portb.5
flag_uart = 0
endif
call blink " hacemos que parpadee portb.6
call Check_portc0 "leemos estado portc0
"espero entrada de comando actuador, que encenderá testigos 2,3,4
hserin 3000,reloj,[wait("ENCIENDE"

,bufferuart] " aqui introduzco por hiperterminal
if bufferuart = "1" then high portb.2 " un valor entre 1 y 3
if bufferuart = "2" then high portb.3
if bufferuart = "3" then high portb.4
reloj:
if flag_timer = 1 then
high portb.1
hserout["minutos desde arranque del programa - ", dec (minutos),10,13]
flag_timer = 0
low portb
endif
goto inr