TODOPIC
Simuladores, editores de PCB, etc => Simuladores de circuitos => Proteus ISIS => Mensaje iniciado por: kamisama en 29 de Mayo de 2010, 18:16:06
-
Hola a todos.
Estoy haciendo pruebas con el ISIS y el PIC 16F877A, puntualmente tengo un circuito que incluye un memoria I2C (ya depurado y corregido el funcionamiento), un GLCD (tambien ya chequeado, aunque ISIS a veces no reinicia bien la seleccion de CHIPS y funciona medio mal con el tiempo aunque en el circuito anda OK) transmision RS2323 que funciona bien... y estaba en la lectura de los conversores.
PORTB = GLCD
PORTD= GLCD control
PORTC=Memoria i2c, Rs232 y otros
PORTA=GLCD cs1 y cs2 y lectura de 3 sensores.
Empezando naturalmente quiza fue un error utilizar parte del PORTA (bits 0 y 1) para CS1 y CS2, dado que es imposible
que no sean entradas analogicas modificando el registro ADCON1. Pero obviemos este paso.
No pude usar nunca ADIN porque en la vida real, por lo expuesto anteriormente no andaba el GLCD y manejar TRISA no servia de nada en Proton.
Use ASM en el codigo, dado que el MCU es muy bueno siempre en lo que son dispositivos de HARD y realmente hasta es
mas sencillo usarlo en ASM que en BASIC. En la vida funciono de MIL maravillas.
AHora, como tengo que seguir depurando, volvi a usar ISIS pero se queda COLGADO cuando hace ADIN o en el otro codigo al hacer lo mismo en ASM (mi version no me permite depurar ASM, pero de todas formas no hay mucho que depurar son pocas lineas). El codigo anda bien, en el circuito real.
Aqui esta el codigo que uso en ASM, dado que no especifico la utilizacion de ADIN SI puedo cambiar el registro TRISA
ASM
bsf STATUS,RP0 ;bank 1
bcf STATUS,RP1
clrf ADCON1 ;
bcf STATUS,RP0 ;bank 0
movfw bADCreg ;este es un registro de Proton donde cargo el canal PORTx a convertir
movwf ADCON0
bsf ADCON0,2 ;Start A/D conversion
btfsc ADCON0,GO ;Wait for conversion to complete
GoTo $-1
bsf STATUS,RP0
movlw B'00000110' ;Desactivo el periferico para evitar problemas
movwf ADCON1
bcf STATUS,RP0
ENDASM
wADC.HighByte=ADRESH 'Se probo la asignacion via ASM pero no funciono
wADC.LowByte= ADRESL 'Utilice Righ justified en ADCON1, asi que Lowbyte Ok.
TRISA=%00111000 'Cuando no se usa ADIN se pueden alterar los reg. TRISA
si usase ADIN 4, pasa lo mismo ISIS se tilda y empiezan a llegar warnings de que comenzo la conversion pero no funciona ni una sola linea de codigo mas.
Bueno, si alguien encontro la respuesta anteriormente, se agradecen los comentarios... insisto en que ISIS es una de las mejores cosas que uno puede tener en el cajon, pero a veces se retoba un poco. Gracias a todos.
-
El Isis da warning de que comenzó la conversión antes de que termine otra. Esto se debe a dos causas:
Una es que entre una conversión y otra debes esperar un tiempo, no se que tiempo asigna el Isis por defecto. Pero como te quedas esperando, con el bit Go/DONE ,a que termine la conversión ese no es el problema.
La otra causa es el tiempo que debes esperar desde el momento que seleccionas el canal ADC a convertir, hasta que comienzas la conversión del ADC
Prueba hacer una delay inmediatamente luego de seleccionar el canal a convertir y luego si le mandas a convertir.
-
Bueno, aproveche que en la PC tenia un Proteus VSM viejo (el que uso es el 7.5 normalmente) y encontre el problema era que el MCU estaba mal seteado.
(Sobre la rutina ADC)Supuestamente, la rutina no es accesada ni habilitada hasta que se hacen todas las tareas y despues de 1500mseg. Esta en una especie de macro y el salto por encima esta arriba justo, asi que no puede ser accedida por el PC
Pero ahora salio otro problema mas tonto y catastrofico
Al apagar o prender un solo LED. se ENOJA EL ISIS y me corta toda simulacion. Ya deshabilite la linea de codigo, y el resto funciona, pero esto es mas loco que lo anterior. NO puedo hacer un LOW porte.2 o high porte.2 que antes si podia.
Sale esta leyenda:
INTERNAL EXCEPTION ACCESS VIOLATION IN MODULE "PIC16.DLL"
-
Bueno, intente, intente e intente incluso buscar en Anteojos... pero nada...
Gracias al amigo que tiro ideas...
Bueno, a los bifes, logre que funcione el ISIS pero como siempre remilgoso necesita ASM para funcionar... puede ser el Proton el problema... no tengo un debugger suficiente... pero al hecho concreto.
Antes de cada cambio de pin, hay que hacer TRISE=0, no se puede usar OUPUT porte.x y ni hablar de LOW o HIGH, siempre
tildan a ISIS.
Acá va un ejemplo de como me quedo. Por si a alguien mas le sirve... Exitos, hasta la victoria
DelayMS 1000 'DelayMS 500 : 'DelayMS 500
TRISE=0 '************* Misteriosamane necesario
@bcf LED3g ;Low LED3g
Print At 7,15, "Sleep " '
HSerOut ["Conejo[X=",Dec XAxis," Y=",Dec YAxis,"]", BIN TRISA,"-",BIN PORTA, 0X0D,0X0A] '
DelayMS 100 '@sleep USART no compatible con Sleep...
TRISE=0 '************* Misteriosamane necesario
@bsf LED3g ;High LED3g
GoSub PrintData '
If PushBT2=1 Then '
wVar=wVar + I2C_WREG 'No funciona la multiplicacion en WORDS
HBusIn I2C_CTRL, wVar,[Str RCstring]
Print At 0,0, Inverse 1, Rep 32\24
Print At 0,0, Inverse 0, HEX wVar/16,":", Str RCstring
EndIf
bADCreg=%11100001 'Control de canal, seleccion de puerto ADC
GoSub ADC99 'Aqui apunta a la rutina en ASM posteada antes
XAxis = wADC.HighByte 'Como es left justified, con el Byte Alto, sobra precision.
GoTo Pcheck