TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: 25javier en 07 de Mayo de 2005, 07:46:00
-
Hola listeros,estoy usando pic basic plus hace varios meses y me ha resultado mas que amigable,me he encontrado con problemas del compilador en manejo de vectores , con manejo de perifericos(lcd,memorias..etc) pero lo he podido solucionar haciendo algun artilugio, pero esta vez ya no se como luchar con el proton,resuelta que tengo hecho un programa de 6k en un 16f877
el programa usa interrupciones del puerto usart , tambien usa el wdt,en principio andubo todo sin mayores problemas pero pareceria que cuando uno supera una longitud de codigo el proton empieza a hacer cualquier cosa,tengo una subrutina que prende un led y hace sonar un buzzer,estando el programa andando sin problemas ,cuando intento hacer una pequeña modificacion en el progama por ejemplo agregar alguna linea de logica (if then,que no se ejecuta en el funcionamento normal), o cambiar algun tiempo en alguna subrutina el programa me manda mal los datos(usart) o se empieza a desbordar el wdt sin razon(se supone que el proton pone los Clrwdt) ,tambien se me ha hido a subrutinas donde no tendria que ir,cuando el programa anda no lo puedo tocar porque cualquier minimo cambio hace que haga cualquier cosa,alguien ha tenido esa experiencia??alguna manera de solucionar?sino tendre que abandonar proton porque me esta sacando canas verdes...
saludos
Javier
-
Que onda 25kjavier,
Habria que revizar el codigo, para ver cual puede ser el problema, y asi sera mas facil que te podamos ayudar 
SAlu2
-
que haces lager!!como andas!!!como veras estoy en crisis con el proton...la verdad que no me gustaria dejarlo porque con programas chicos no tube grandes incovenientes,pero ahora me esta volviendo loco,te cuento del programa....lee tarjetas de proximidad(esta parte esta hecha en assembler),da de alta y baja a tarjeta,etc,etc,uso bootloader,wdt,interrup por usart,aca te tiro todo el programa,estan testeadas todas las rutinas en forma independiente y andan sin problema, ahora todo el programa anda sin problemas pero no puedo tocar una linea que empieza a hacer cualquier cosa...
te cuento algunos detalles de problemas que tube:
1)no puedo hacer B[f]=B[ind] ^ B[e] ,no anda, tengo que meter una varialbe auxiliar
D= B[ind] ^ B[e]
B[f]=D
2)
desde el Lazo principal MAIN llamo a una subrutina en assembler usando call (call comienzo),dentro de esa rutina en assembler tengo que agregar una linea en basic
(if int=1 then analizar)para que me salte a la interrupcion(porque tengo un lazo cerrado ahi) y se vaya a la rutina analizar para ver que tiene que hacer,como logica estaria mal porque nunca encuentra el return del original call (subrutina comienzo),si hay interrupcion se va a la rutina analizar hace lo que tiene que hacer y vuelve a Main,de esta forma es de la unica que andubo,cuando trate de poner (if int=1 then return)y afuera del assembler if int=1 then analizar ,andubo pero pero al agregar otras subrutinas se empezo a desbordar el wdt y se me reseteaba el micro a cada rato),volvi a la version original y asi esta andando..que loco...
3)Cuando envio datos a veces tengo que agregar un delay entre envios de Bytes si no no anda y en otra parte del programa si lo dejo sin delays anda y con delays no anda...mas loco todavia...
en una parte del programa tengo:
for i=1 to 3
B1="N"
gosub putchar
next i
en otra parte tengo:
B1=B
gosub putchar
delayms 3
next i
3)le agrege una delay en la subrutina beep,pese a que el programa no va ahi a menos que encuentre una tarjeta se empieza a salta el wdt y a resetear el micro..
bueno.. a ver que te parece...ahi va todo el programete...saludossssssssssssss
javier
DEVICE = 16F877
XTAL = 20 "frecuencia cristal
remarks on
CONFIG BODEN_OFF,CP_OFF,PWRTE_On,WDT_On,LVP_Off,hs_OSC "EN FPP ES 3FB5 CON WDT , 3FB1 SIN WDT
DECLARE BOOTLOADER =On
DECLARE WATCHDOG = on
HSERIAL_CLEAR = ON
"SIMBOLOS VARIABLES
symbol rele portd.2
symbol buzz portc.5
symbol lamp1 porte.1
symbol ledlect portd.4
symbol activ portb.6
symbol puert portd.3
"DECLARACION VARIABLES
dim DATO0 as byte
dim DATO1 AS BYTE
dim DATO2 AS BYTE
dim DATO11 AS BYTE
dim DATO22 AS BYTE
DIM SECURE AS BIT
dim DATO3 AS BYTE
dim DATO4 AS BYTE
dim DATO5 AS BYTE
dim DATO6 AS BYTE
dim DATO7 AS BYTE
dim arg1 as byte
dim code_ok AS BYTE
dim cont as byte
dim bitcont as byte
dim idttarj as byte
dim var1 as word
dim ID_CARD as word
dim D as byte
dim i as byte
dim B [100]as byte
dim B2 as byte
DIM B3[6]AS BYTE
dim BORR[90] AS BYTE
DIM C AS BYTE
dim busy as bit
dim comando as bit
dim i1 as word
dim abier as bit
dim mal as bit "verificación pc encendida
dim discont as bit"verificación discontinuidad de envios
dim bien as bit"verificación contestación de envios
dim falla as bit "falla cont
dim marcadas as byte "indice de gente que ha entrado
dim llamada as bit
dim indice1 as byte
dim indice2 as byte
dim i2 as byte
dim I_laz as byte
dim int as bit
dim marca as byte
dim b1 as byte
dim ind as byte
dim a as byte
dim e as byte
dim f as byte
DIM NUMB_BORR AS BYTE
DIM INDICE AS BYTE
DIM TEMP AS BYTE
ADCON1 = 7 "todo digital
SPBRG = 129 " Set baud rate to 9600
TXSTA = %00100100 "brg high speed=1
"TXSTA = %00100000 "brg low speed=0
rcsta= %11011000 "SOLO 9 bits solo va a interrupcion
INTCON = %01000000
PIE1.5=1 "interrupcion al recibir-
OPTION_REG.3=1 "tiner asignado al wdt
OPTION_REG.0=1
OPTION_REG.1=1
OPTION_REG.2=1
"CONFIGURACION ENTRADAS Y SALIDAS
trisa=0
trisb=%00010001
trisc=%10000000
trisd=%11000000
trise=0 "led placa principal trise.1
"TRISD.6=1 "datos lector
"TRISD.7=1 "clock lector
"trisd.2=0 "rele
"trise=0 "led placa principal trise.1"
"TRISC.5=0 "BUZZER
"trisd.4=0 "led lector
"trisd.3=0"apertura puerta continua
"trisb.6=0 "activacion salida datos(DE sn75als180)
ON INTERRUPT GOTO My_Int
"INCIALIZACION DE VARIABLES
rele=0
buzz=0
code_ok=0
dato0=0
dato1=0
dato2=0
dato3=0
dato4=0
dato5=0
dato6=0
dato7=0
comando=0
int=0
ind=0
I_laz=0
llamada=0
marcadas=0
ledlect=0
activ=0 "CAMBIAR A =0!!!!!!!!!!
puert=0
abier=0
INDICE=0
TEMP=0
lamp1=1
delayms 500
lamp1=0
i1=0
i=0
activ=0
dato22=0
dato11=0
int=0
SECURE=1
Edata 0
NUMB_BORR=EREAD 0
for i=1 to NUMB_BORR
BORR=EREAD i
delayms 10
"Hserout[dec BORR,13]
next i
MAIN:
dato0=0
dato1=0
dato2=0
dato3=0
dato4=0
dato5=0
dato6=0
dato7=0
call comienzo
if CODE_OK.0=1 then
if dato6=63 and dato5=156 and dato4=213 and dato0=0 then
IF SECURE=1 THEN
dato22=dato2
dato11=dato1
SECURE=0
ELSE
SECURE=1
IF dato22=dato2 AND dato11=dato1 THEN
goto check
ENDIF
ENDIF
endif
endif
goto MAIN
nada:
if NUMB_BORR=0 then salteto
FOR I=1 TO NUMB_BORR
IF BORR=ID_CARD THEN MAIN
NEXT I
salteto:
gosub beep
goto MAIN
beep:
e=ind+1
f=ind+2
B[ind ]= ID_CARD & %0000000011111111 "byte bajo
B[e]=(ID_CARD & %1111111100000000) >>8 "byte alto
D= B[ind] ^ B[e]
B[f]=D
marcadas= marcadas + 1
ind=ind+3
ledlect=1
IF marcadas=35 then marcadas=0:ind=0
buzz=1
for i=1 to 80
delayms 1
next i
buzz=0
for i=1 to 150
delayms 1
next i
if abier=1 then salto
ledlect=0
salto:for i=1 to 200
delayms 1
next i
rele=1
for i=1 to 150
delayms 1
next i
rele=0
return
asm
comienzo
Clrwdt
CLRF CODE_OK
MOVLW 64
MOVWF BITCONT
NUEVO_BIT
BCF STATUS,RP0
BCF STATUS,RP1
AHI Clrwdt
ENDASM
if int=1 then analizar
ASM
btfsc PORTD,7 ;salta si es cero
goto AHI
AHI1 Clrwdt
ENDASM
if int=1 then analizar
ASM
btfss PORTD,7 ;salta si es uno , transicion!!!
goto AHI1
BCF STATUS,RP0
BCF STATUS,RP1
Clrwdt
movlw 25
movwf arg1
call delay
BTFSC PORTD,6 ;SALTA SI EL BIT 1 ES 0
BCF STATUS,C
BTFSS PORTD,6 ;SALTA SI EL BIT 1 ES 1
BSF STATUS,C
Clrwdt
movlw 80
movwf arg1
call delay
call DESPLAZAR
DECFSZ BITCONT
GOTO NUEVO_BIT
CALL HEADER
Clrwdt
return
DESPLAZAR
;---DESPLAZAMIENTO DE TODOS LOS DATOS INCLUIDOS LOS CARRIES---
Clrwdt
RLF DATO0,F ;HACE SHIFT 1 BIT A LA IZQUIERDA
RLF DATO1,F ;HACE SHIFT 1 BIT A LA IZQUIERDA
RLF DATO2,F ;HACE SHIFT 1 BIT A LA IZQUIERDA
RLF DATO3,F ;HACE SHIFT 1 BIT A LA IZQUIERDA
RLF DATO4,F ;HACE SHIFT 1 BIT A LA IZQUIERDA
RLF DATO5,F ;HACE SHIFT 1 BIT A LA IZQUIERDA
RLF DATO6,F ;HACE SHIFT 1 BIT A LA IZQUIERDA
RLF DATO7,F ;HACE SHIFT 1 BIT A LA IZQUIERDA
Clrwdt
RETURN
;*****************************************************************
; ENCUENTRA EL HEADER DE LA TARJETA
;*****************************************************************
HEADER
CLRF CONT
;---DESPLAZAMIENTO DE TODOS LOS DATOS INCLUIDOS LOS CARRIES---
ROTAR_HEADER
Clrwdt
BTFSS DATO0,0
BCF STATUS,C
BTFSC DATO0,0
BSF STATUS,C
RRF DATO7,F ;HACE SHIFT 1 BIT A LA DERECHA
RRF DATO6,F ;HACE SHIFT 1 BIT A LA DERECHA
RRF DATO5,F ;HACE SHIFT 1 BIT A LA DERECHA
RRF DATO4,F ;HACE SHIFT 1 BIT A LA DERECHA
Clrwdt
RRF DATO3,F ;HACE SHIFT 1 BIT A LA DERECHA
RRF DATO2,F ;HACE SHIFT 1 BIT A LA DERECHA
RRF DATO1,F ;HACE SHIFT 1 BIT A LA DERECHA
RRF DATO0,F ;HACE SHIFT 1 BIT A LA DERECHA
Clrwdt
INCF CONT,F
MOVLW 128 ;AGRAEGADO
XORWF CONT,W ;AGRAEGADO
BTFSC STATUS,Z
GOTO MAL_HEADER
MOVlW 255
XORWF DATO7,W
BTFSS STATUS,Z ;SALTA SI _DATO7=11100110
GOTO ROTAR_HEADER
MOVlW 63 ;HEADER DE ATMEL HEADER1,W
XORWF DATO6,W
BTFSS STATUS,Z
GOTO ROTAR_HEADER
BSF CODE_OK,0 ;AGREGADOOOOOOO!!!!!!!!!!!!!
MAL_HEADER
Clrwdt
RETURN
delay
IR
Clrwdt
DECFSZ ARG1,F
goto IR
return
endasm
analizar:
int=0
if comando=1 then RECIBIR
IF llamada=1 THEN "LLAMADA A ENVIO DE DATOS
llamada=0
if marcadas = 0 then "NO TENGO NADA PARA MANDAR :MANDO "NNN"
PIE1.5=0
gosub activado
for i=1 to 3
B1="N"
gosub putchar
next i
delayms 20
gosub desactivado
PIE1.5=1
else
goto enviar "hay marcadas VOY A RUTINA ENVIO DE DATOS
endif
endif
GOTO main "VUELVO AL LAZO PRINCIPAL
RECIBIR: PIE1.5=0 "interrupcion al recibir-
comando=0
A=0
i1=0
i=0
charin2: i1=i1+1
if i1=65500 then i1=0:i=i+1
IF PIR1.5 = 0 Then
if i=10 then lamp1=1: delayms 500: lamp1=0:PIE1.5=1: goto main
goto charin2
else
B2=RCREG
B3[A]=B2
A=A+1
if A=4 then
goto seguir1
else
i1=0
i=0
goto charin2
endif
endif
seguir1: gosub activado
DELAYMS 2
D=B3[0]^B3[1]^B3[2]
IF D=B3[3] then
B1="B" "se recibio bien la info
gosub putchar
I_laz=0
delayms 10
gosub desactivado
gosub acciones
else
I_laz=I_laz + 1
if I_laz>5 then
I_laz=0
B1="F" "se recibio mal la info mas de 5 veces ,manda info de falla de la red
gosub putchar
for i=1 to 10
delayms 1
next i
gosub desactivado
else
B1="M"
gosub putchar
endif
ENDIF
delayms 100
PIE1.5=1
goto main
Enviar:
gosub activado
RCSTA = %10010000 "RECIBO 8 BITS PARA VER SI RECIBI BIEN LA TRANSMISION
for i2=1 to marcadas
indice2=(3 * i2) - 1
indice1=indice2-2
again:bien=0
mal=0
falla=0
if marca > 3 then "si mas de 4 veces recibo falla sigo con el otro dato
lamp1=0
mal=0
falla=0
bien=0
marca=0
goto seguir
endif
for i=indice1 to indice2
B1=B
gosub putchar
delayms 3
next i
for i1=0 to 1000
delayms 1
if bien=1 then seguir"buzz=1:delayms 5:buzz=0 : goto seguir
if mal=1 then
lamp1=1
delayms 100
lamp1=0
marca=marca+1 "marca:cantidad de veces que recibo falla
goto again
endif
next i1
seguir:
next i2
seguir2:
rcsta= %11011000 "VUELBO A RECIBIR 9 BITS
marca=0
marcadas=0
ind=0
gosub desactivado
goto main
PutChar: If PIR1.4 = 0 Then PutChar " Wait for transmit register empty
TXREG = B1 " Send character to transmit register
Return
desactivado: "alta impedancia,puedo recibir no puedo enviar
activ=0
return
activado:
activ=1
return
check:
if dato3=103 and dato2= 212 and dato1= 34 then ID_CARD=1: GOTO nada
if dato3=188 and dato2=130 and dato1=250 then ID_CARD=2: GOTO nada
if dato3=161 and dato2=230 and dato1=186 then ID_CARD=3: GOTO nada
if dato3=194 and dato2=175 and dato1=226 then ID_CARD=4:GOTO nada
if dato3=196 and dato2=59 and dato1=110 then ID_CARD=5:GOTO nada
if dato3=211 and dato2=169 and dato1=54 then ID_CARD=6:GOTO nada
if dato3=203 and dato2=66 and dato1=226 then ID_CARD=7:GOTO nada
if dato3=110 and dato2=152 and dato1=134 then ID_CARD=8:GOTO nada
if dato3=162 and dato2=152 and dato1=86 then ID_CARD=9:GOTO nada
if dato3=109 and dato2=104 and dato1=190 then ID_CARD=10:GOTO nada
if dato3=110 and dato2=14 and dato1=86 then ID_CARD=11:GOTO nada
if dato3=167 and dato2=111 and dato1=26 then ID_CARD=12:GOTO nada
if dato3=182 and dato2=253 and dato1=138 then ID_CARD=13:GOTO nada
if dato3=26 and dato2=202 and dato1=238 then ID_CARD=14:GOTO nada
if dato3=127 and dato2=169 and dato1=38 then ID_CARD=15:GOTO nada
if dato3=4 and dato2=170 and dato1=202 then ID_CARD=16:GOTO nada
if dato3=124 and dato2=105 and dato1=214 then ID_CARD=17:GOTO nada
if dato3=109 and dato2=159 and dato1=250 then ID_CARD=18:GOTO nada
if dato3=13 and dato2=114 and dato1=42 then ID_CARD=19:GOTO nada
if dato3=211 and dato2=214 and dato1=150 then ID_CARD=20:GOTO nada
if dato3=28 and dato2=155 and dato1=190 then ID_CARD=21:GOTO nada
if dato3=196 and dato2=131 and dato1=134 then ID_CARD=22:GOTO nada
if dato3=171 and dato2=119 and dato1=6 then ID_CARD=23:GOTO nada
if dato3=4 and dato2=171 and dato1=70 then ID_CARD=24:GOTO nada
if dato3=193 and dato2=159 and dato1=46 then ID_CARD=25:GOTO nada
if dato3=124 and dato2=18 and dato1=22 then ID_CARD=26:GOTO nada
if dato3=118 and dato2=64 and dato1=70 then ID_CARD=27:GOTO nada
if dato3=117 and dato2=215 and dato1=218 then ID_CARD=28:GOTO nada
if dato3=194 and dato2=212 and dato1=230 then ID_CARD=29:GOTO nada
if dato3=176 and dato2=20 and dato1=246 then ID_CARD=30:GOTO nada
if dato3=97 and dato2=61 and dato1=154 then ID_CARD=31:GOTO nada
if dato3=176 and dato2=182 and dato1=142 then ID_CARD=32:GOTO nada
if dato3=185 and dato2=174 and dato1=94 then ID_CARD=33:GOTO nada
if dato3=124 and dato2=224 and dato1=190 then ID_CARD=34:GOTO nada
if dato3=25 and dato2=111 and dato1=46 then ID_CARD=35:GOTO nada
if dato3=16 and dato2=61 and dato1=122 then ID_CARD=36:GOTO nada
if dato3=181 and dato2=36 and dato1=242 then ID_CARD=37:GOTO nada
if dato3=97 and dato2=112 and dato1=102 then ID_CARD=38:GOTO nada
if dato3=8 and dato2=203 and dato1=70 then ID_CARD=39:GOTO nada
if dato3=16 and dato2=205 and dato1=130 then ID_CARD=40:GOTO nada
if dato3=203 and dato2=132 and dato1=38 then ID_CARD=41:GOTO nada
if dato3=179 and dato2=62 and dato1=110 then ID_CARD=42:GOTO nada
if dato3=118 and dato2=11 and dato1=138 then ID_CARD=43:GOTO nada
if dato3=7 and dato2=183 and dato1=38 then ID_CARD=44:GOTO nada
if dato3=21 and dato2=106 and dato1=30 then ID_CARD=45:GOTO nada
if dato3=176 and dato2=182 and dato1=74 then ID_CARD=46:GOTO nada
if dato3=176 and dato2=112 and dato1=74 then ID_CARD=47:GOTO nada
if dato3=174 and dato2=108 and dato1=18 then ID_CARD=48:GOTO nada
if dato3=19 and dato2=15 and dato1=230 then ID_CARD=49:GOTO nada
if dato3=179 and dato2=182 and dato1=138 then ID_CARD=50:GOTO nada
if dato3=16 and dato2=118 and dato1=114 then ID_CARD=51:GOTO nada
if dato3=171 and dato2=18 and dato1=242 then ID_CARD=52:GOTO nada
if dato3=22 and dato2=16 and dato1=146 then ID_CARD=53:GOTO nada
if dato3=167 and dato2=208 and dato1=78 then ID_CARD=54:GOTO nada
if dato3=124 and dato2=157 and dato1=138 then ID_CARD=55:GOTO nada
if dato3=11 and dato2= 10 and dato1=254 then ID_CARD=56:GOTO nada
if dato3=213 and dato2=211 and dato1=118 then ID_CARD=57:GOTO nada
if dato3=97 and dato2=209 and dato1=194 then ID_CARD=58:GOTO nada
if dato3=112 and dato2=178 and dato1=38 then ID_CARD=59:GOTO nada
if dato3=31 and dato2=118 and dato1=170 then ID_CARD=60:GOTO nada
if dato3=124 and dato2=13 and dato1=106 then ID_CARD=61:GOTO nada
if dato3=13 and dato2=253 and dato1=114 then ID_CARD=62:GOTO nada
if dato3=97 and dato2=211 and dato1=146 then ID_CARD=63:GOTO nada
if dato3=117 and dato2=68 and dato1= 34 then ID_CARD=64:GOTO nada
if dato3=194 and dato2=202 and dato1=210 then ID_CARD=65:GOTO nada
if dato3=100 and dato2=231 and dato1=246 then ID_CARD=66:GOTO nada
if dato3=19 and dato2=21 and dato1=118 then ID_CARD=67:GOTO nada
if dato3=205 and dato2=23 and dato1=22 then ID_CARD=68:GOTO nada
if dato3=97 and dato2= 22 and dato1=78 then ID_CARD=69:GOTO nada
if dato3=173 and dato2=129 and dato1=194 then ID_CARD=70:GOTO nada
if dato3=103 and dato2=227 and dato1=86 then ID_CARD=71:GOTO nada
if dato3=115 and dato2=118 and dato1=182 then ID_CARD=72:GOTO nada
if dato3=176 and dato2=180 and dato1=26 then ID_CARD=73:GOTO nada
if dato3=14 and dato2= 228 and dato1=58 then ID_CARD=74:GOTO nada
if dato3=206 and dato2=228 and dato1=242 then ID_CARD=75:GOTO nada
if dato3=181 and dato2=104 and dato1=130 then ID_CARD=76:GOTO nada
if dato3=211 and dato2=178 and dato1= 238 then ID_CARD=77:GOTO nada
if dato3=174 and dato2=57 and dato1=234 then ID_CARD=78:GOTO nada
if dato3=118 and dato2=69 and dato1=170 then ID_CARD=79:GOTO nada
if dato3=176 and dato2=135 and dato1=14 then ID_CARD=80:GOTO nada
if dato3=188 and dato2=114 and dato1=2 then ID_CARD=81:GOTO nada
if dato3=179 and dato2=214 and dato1=86 then ID_CARD=82:GOTO nada
if dato3=98 and dato2=213 and dato1=98 then ID_CARD=83:GOTO nada
if dato3=179 and dato2=57 and dato1=210 then ID_CARD=84:GOTO nada
if dato3=124 and dato2=130 and dato1=246 then ID_CARD=85:GOTO nada
if dato3=193 and dato2=114 and dato1=62 then ID_CARD=86:GOTO nada
if dato3=11 and dato2=182 and dato1=118 then ID_CARD=87:GOTO nada
if dato3=115 and dato2=93 and dato1=98 then ID_CARD=88:GOTO nada
if dato3=173 and dato2=17 and dato1=230 then ID_CARD=89:GOTO nada
if dato3=196 and dato2=172 and dato1=50 then ID_CARD=90:GOTO nada
if dato3=173 and dato2=183 and dato1=254 then ID_CARD=91:GOTO nada
if dato3=26 and dato2=157 and dato1=70 then ID_CARD=92:GOTO nada
if dato3=100 and dato2=181 and dato1=118 then ID_CARD=93:GOTO nada
if dato3=19 and dato2=204 and dato1=10 then ID_CARD=94:GOTO nada
if dato3=214 and dato2=178 and dato1=230 then ID_CARD=95:GOTO nada
if dato3=8 and dato2=92 and dato1=26 then ID_CARD=96:GOTO nada
if dato3=104 and dato2=214 and dato1=170 then ID_CARD=97:GOTO nada
if dato3=168 and dato2=119 and dato1=198 then ID_CARD=98:GOTO nada
if dato3=211 and dato2=134 and dato1=130 then ID_CARD=99:GOTO nada
if dato3=191 and dato2=107 and dato1=74 then ID_CARD=100:GOTO nada
goto main
acciones:
If B3[0]=1 then "abre la puerta
abier=1
rele=1
delayms 150
rele=0
puert=1
ledlect=1
endif
if B3[0]=2 then "funcionamento normal
abier=0
puert=0
ledlect=0
endif
if B3[0]=3 then "BAJA TARJETA
NUMB_BORR=EREAD 0
NUMB_BORR=NUMB_BORR+1
EWRITE 0,[NUMB_BORR]
EWRITE NUMB_BORR,[B3[1]]
BORR[NUMB_BORR]=B3[1]
lamp1=1
DELAYMS 1000
lamp1=0
endif
"ALTA TARJETA
IF B3[0]=4 THEN
"BUSCO INDICE
FOR INDICE=1 TO NUMB_BORR
IF BORR[INDICE]=B3[1] THEN BORRO
NEXT INDICE
GOTO SALIR
BORRO:
IF INDICE=NUMB_BORR THEN SALTIN
FOR I1=INDICE TO NUMB_BORR-1
BORR[I1]=BORR[I1+1]
TEMP=EREAD I1+1
DELAYMS 10
EWRITE I1,[TEMP]
DELAYMS 5
NEXT I1
SALTIN:NUMB_BORR=NUMB_BORR-1
EWRITE 0,[NUMB_BORR]
Lamp1=1
DELAYMS 1000
lamp1=0
ENDIF
SALIR:
return
DISABLE " Disable interrupts in the handler
My_Int:
mal=0
bien=0
int=1
comando=0
llamada=0
lamp1=1
DELAYMS 5
lamp1=0
charin: If PIR1.5 = 0 Then charin "recibo contestacion=prendo lamp
B2=RCREG
IF B2="M" THEN "recibo contestación mala recepcion
mal=1
ENDIF
IF B2="B" THEN "recibo contestación ok recepción
bien=1
ENDIF
IF B2="E" THEN "recibo comandos(LO USO PARA stand by,CADA PIC TIENE SU LETRA)
lamp1=1
delayms 10
lamp1=0
comando=1
endif
IF B2="H" THEN "recibo llamada para enviar datos
lamp1=1
delayms 10
lamp1=0
llamada=1
endif
IF RCSTA.2=1 then B2=RCREG "falla=1: "verifico error de framing"stop bit =0!!salta!!
IF RCSTA.1=1 THEN RCSTA.4=0 : RCSTA.4=1 "borro overflow "verifico overflow
terminar:
RESUME " Return to main program
ENABLE " Enable interrupts after the handler
END
-
Que onda Javier, que gusto verte por aca de nuevo
:
Pues lo de los tiempos es mas que nada un pcoo de mala sintaxis, ademas de la estructura y seguimiento en modulos.
Por lo pronto no puedo revizar de forma CORRECTA tu programa, ya que caresco de la tarjeta de prueba que tu usas para ver los errores, solo podre tratar de ayudarte con la sintaxis:
1° En estos caos de tiempos.., es muy util que revises y OPTIMISES correctamente tu codigo:por ejemplo:
Tienes estos chekeos:
IF B2="H" THEN "recibo llamada para enviar datos
lamp1=1
delayms 10
lamp1=0
llamada=1
endif
Ya que no tienes restricciones en usar asm, bien podrias usar un btfs, para chekar el valor en la variable... ademas de usar MEJOR un bsf y un bcf para setear y limpiar las variables...
Un GRAN error es poner la rutina de interrupcion al FINAL de todo el programa.. como lo has hehco.. esta debe ir de preferencia al principio y ser brincada rumbo al MAIN del programa.... ADEMAs veo que estas usando interrupcion via SOftware... que son las mas lentas e inprecisas.... lo adecuado seria usar la interrupcion VIA hardware..(evisa el foro, Khasistos realizo un tem al respecto muy completo de interrupciones via hardware, y veras la diferencia tambien)..
Veo que tienes en los fuses un WDT_on.. y mas abajo lo VUELVES a setear de encendido.. yo creo que con el de fuses es suficiente.. y despues si quiers apagarlo, lo apagas, pero encenderlo 2 veces casi consecutivas??? el On interrupt DEBERIAs de setearlo mucho antes de empezar a inicializar los registros de los modulos de entrada y de salida..
Estas son solo unas observaciones, que podrian mejorar en mucho,poco o nada el desempeño de tu programa y creo que necsitas.
No recuerdo muy bien, pero creo que para setear pines(seria cosa de revizar el asm) seria mejor usar el SET y el CLEAR puerto.pin que usar una igualdad..... esta es otra optimizacion.. en fin, si necesitas mas precision, necesitas mejorar varias cosas, y de preferencia usar interrupciones via hardware, ya que son mucho ams rapidas.... solo recuerda leer el post que te comente para restaurar valores del systema...
Suerte!
Un gran abrazo pana
-
Gracias viejo!!,te cuento..el tema de la interrupcion por soft lo hice a proposito porque queria darle priridad a la rutina lectura de tarjetas,cuando termino de leer y hay algun llamado va a atender,en este caso queria que no "corra"a la interrupcion y decidi usar la interrupcion por software,que segun el manual se puede escribir sin problemas el handler en basic como en assembler,vos decis que igual me genera problemas escribirlo en basic?
la metida de pata es que (por bol..)me olvide de poner el vector de interrup al comiienzo,ya lo arregle...ahh..el tema de wdt activado dos veces es porque en la paranoia,empeze a no creerle al proton y empece a setear cosas en assembler por las dudas..
un gran abrazo!!!!
Javier
-
Arregle la posicion del vector ,pero fijate...esta estaba andando y para dejar todo correctamente coloque ON INTERRUPT GOTO My_Int al comienzo del programa y dejo de andar,lo tube que poner devuelta donde estaba,estas cosas son las que me vuelven crazy,me parece que cuando la longitud del programa es grande el proton empieza a generar problemas,nunca tube mayores problemas con programas mas cortos...no se..alguien tiene alguna experiencia similar?a mi me encanta este compilador pero ahroa empieso a desconfiar.... es usado a nivel profesional ..? como los copiladores de C ( CCS o High Tech)??
saludos
Javier
-
Que onda pana, me da gusto que estes intentando mejorar ciertos detalles, lo que es cierto es que en programas mas LARGOS... empiezan los problemas.... pero dejando fuera los bugs que todos los compiladores tienen, los problemas saltan a relucir por que el acomodo(sintaxis) empieza a jugar un papel importante en el codigo, en programas pequeños.. casi casi puedes acomodar las cosas a donde sea... pero en programas con diferentes modulos hay que tener bien clara la perspectiva de funcionalidad basada en una SINTAXIS correcta ,la cual SIEMPRE (no por que sea un codigo largo solamente) debe de existir... una forma CLARA de saber que esta paando en tu programa es VIENDO el asm generado pana.. esto despejara claramente tus dudas.....
Con respecto al problema del ON INTERRUPT GOTO My_Int , donde lo pusiste exactamente????? 
OJO pana, todo esto te lo digo , no por que este COMPLETAMENTE mal tu sintaxis, PARA NADA!!!!, al contrario has manejado varias parte del codigo de forma muy adecuada, todo esto lo digo por que la mayoria de los usuarios no se preocupa por esto, y al final, es decir. en estos casos de usos REALES enfocados a proyectos profesionales, es cuando vienen los problemas.
Sigue posteando que tiene que salir tu proyecto pana 
Un gran abrazo
-
Hace poco e tenido el mismo prpblema con un programa q supero los 6k de memoria justo con los lcd me muestra basura en algunos casos en donde no deberia , a que se debera este problema sera un bug general de el proton como se podra solucionar en caso se supere esta cantidad de codigo, hasta cambiando la posicion de las variables el codigo cambia algo interesante ; alguien tiene algun hechizo para no tener problemas con el proton a esta cantidad de codigo. 8)
-
Que tal amigos!
electronando
alguien tiene algun hechizo para no tener problemas con el proton a esta cantidad de codigo. Cool
Yo no he hecho programas tan largos pero podrias probar utilizando el optimizer que trae el proton o sino utilizar un pic con mayor capacidad de memoria, de todas formas seria bueno comprobar porque hace eso y asi poderselo comunicar al creador del proton :mrgreen:
Otro detalle a tomar en cuenta es las interrupciones con el proton, si utilizan una interrupcion por software del proton esta podria ser muy lenta, ya que, esta no se ejecuta hasta tanto no termine de ejecutarse la instruccion en curso :mrgreen:
Si utilizan interrupciones por hardware esta si se ejecutan de manera inmediata "PERO" existe un problema potencial que son las variables del sistema, utilizadas por el proton en la ejecucion de las instrucciones, cuando se salta a la rutina de interrupcion uno por lo general salva algunos registros como son el status, W, entre otros. No asi las variables del sistema lo que podria traer problemas en la ejecucion del programa si dicha variable esta siendo utilizadas en otras partes del programa :shock: :shock:
Esa es una de las cosas que siempre me a molestado de los compiladores basic :( .
Hasta ahora :mrgreen: , porque hay una version en el horno mejorada del proton :shock: :mrgreen: que permite salvar las variables del sistema al momento de entrar en la rutina de interrupcion y otras muchas cosas mas!!!:shock:
Entonces de momento si van a hacer una interrupcion por hardware la mejor manera de realizarla es en ASM, hasta que saquen la nueva version! :mrgreen:
Saludos,
-
tienes el fragmento de hacer la interrupcion salvando todo lo posible en asm para el proton ; me late q hay probelmas con eso de los bancos y esa nota , pero dime si haces la interrupcion por asm no seria lo mismo ; tendrias q conocer las variables del sistema tb . hay en el manula muchas variables del sistema lo q no se cual es cual o cual me maneja por ejemplo el tiempo , ciomento q en pic basic pro cuando usabas el pause en una interrupcion ya no se podia salir de ella a menos q salves esa variable q usaab para producir el pause , buscare algo parecido en el proton , espero encontrar algun remedio luego lo comunico aca . :mrgreen: