TODOPIC

Simuladores, editores de PCB, etc => Simuladores de circuitos => Proteus ISIS => Mensaje iniciado por: kamisama en 29 de Mayo de 2010, 18:16:06

Título: Problema ISIS 16F877A Conversion Analogico Digital
Publicado 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.


Título: Re: Problema ISIS 16F877A Conversion Analogico Digital
Publicado por: pablomanieri en 29 de Mayo de 2010, 18:37:59
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.
Título: Un problema resuelto y salta otro
Publicado por: kamisama en 29 de Mayo de 2010, 20:40:03
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"
Título: UNA SOLUCION [encontrada] Pero trucha
Publicado por: kamisama en 29 de Mayo de 2010, 21:36:17
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