[Resuelto] Entrada digital de PIC16F690 falla en gpsim
Página 1 de 1.
[Resuelto] Entrada digital de PIC16F690 falla en gpsim
Hola. He estado probado el nuevo gpsim Release 0.26.1 y me topé con algunos problemas cuando intenté simular el siguiente programa:
osctune.asm
En resumen, este programa debe:
El objetivo de esto es calibrar finamente el oscilador interno del PIC16F690 por medio de las entradas PORTC0 - PORTC4.
La hoja de datos del PIC16F690 [1] (documento 41262E.pdf [2] de microchip), establece en la sección "3.5.2.1. OSCTUNE Register", que el registro OSCTUNE sirve para incrementar en pequeños pasos esta frecuencia de oscilación, aunque no establece la magnitud de estos pasos.
Esto puede servir para eliminar el margen de error de las transferencias de datos asíncronas de EUSART que se muestra en la tabla 12-5 de la sección "12.3 EUSART Baud Rate Generator (BRG)" ya que con OSCTUNE podríamos calibrar FOSC a un valor cercano a 3.6864 MHz, lo cual, segun esta tabla, reduciría el porcentaje de error a 0.00%
El procedimiento que utilicé para la simulación fue el siguiente:
1. Ensamblar con gpasm 0.13.7 beta
$ gpasm -pp16f690 osctune.asm
2. Escribir el archivo de estímulos sti.stc:
sti.stc
Como se observa, el objetivo es establecer PORTC en 00001111 conectando PORTC0 - PORTC3 a un estímulo que está mandando un 1 constantemente llamado "bo" y conectado al nodo "one", y conectando PORTC4 - PORTC7 a otro estímulo que está enviando un 0 constantemente llamado "bz" y conectado al nodo "zero".
3. Para la simulación, ejecuté el siguiente comando:
$ gpsim -pp16f690 -s osctune.asm -c sti.stc
Para visualizar mejor, abro las ventanas "Breadboard", "Ram" y "Source". Todo parece funcionar con normalidad al principio.
El problema ocurre cuando llega a la instrucción "movwf TRISC", porque se supone que en ese momento el registro 0007 (ver la figura 2-8 en la sección "2.2.2. Special Function Registers" de [2]), correspondiente al PORTC, debería mostrar 0F (o sea, 00001111), sin embargo, permanece en 00: parece que los estímulos que colocamos por medio del archivo sti.stc no tienen ningun efecto. Lo intento nuevamente, pero esta vez solamente con:
$ gpsim -pp16f690 -s osctune.asm
...para intentar cambiar los estados de PORTC0 - PORTC3 haciendo doble click en los pines por medio del Breadboard: en el breadboard, los pins sí cambian de verde a rojo, pero de nuevo en el registro 0007 no se muestra ningun cambio. Curiosamente, los únicos pins que logran modificar el registro 0007 al cabiar sus estados son PORTC4 y PORTC5 (ademas de CLKOUT para el 0005, y PORTB6 y PORTB7 para el 0006, en otras pruebas que hice).
¿Creen que podrían ayudarme con este problema?
Por cierto: sé que gpsim está diseñado para operar a frecuencias preestablecidas por el programa, así que no espero que la modificación del registro OSCTUNE me muestre una variación medible de la frecuencia FOSC, solamente quisiera ver si mi algoritmo funciona para transmitir los primeros 5 bits de PORTC a OSCTUNE, ¡pero ni eso puedo hacer!
En fin, espero que al menos el programa y las referencias de la hoja de datos los hayan entretenido ó les hayan servido de algo.
Saludos.
Oscar
Edit:
Ayer reporté esto como un bug en el sistema de rastreo de bugs de gpsim [3] y me acaban de dar respuesta. Al principio de osctune.asm, debe uno agregar:
...para deshabilitar las entradas análogas del PIC16F690 segun la sección "4.2.1. ANSEL AND ANSELH REGISTERS".
[1] http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en023112
[2] http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf
[3] https://sourceforge.net/tracker/?func=detail&aid=3492929&group_id=2341&atid=102341
osctune.asm
- Código:
include "p16f690.inc"
org 0
banksel ADCON0
clrf ADCON0
banksel ADCON1
clrf ADCON1
banksel TRISA
clrf TRISA
clrf TRISB
movlw 0xFF
movwf TRISC
tune:
banksel PORTC
btfsc PORTC,0
goto a0
banksel OSCTUNE
bcf OSCTUNE,0
a0:
banksel PORTC
btfss PORTC,0
goto b0
banksel OSCTUNE
bsf OSCTUNE,0
b0:
banksel PORTC
btfsc PORTC,1
goto a1
banksel OSCTUNE
bcf OSCTUNE,1
a1:
banksel PORTC
btfss PORTC,1
goto b1
banksel OSCTUNE
bsf OSCTUNE,1
b1:
banksel PORTC
btfsc PORTC,2
goto a2
banksel OSCTUNE
bcf OSCTUNE,2
a2:
banksel PORTC
btfss PORTC,2
goto b2
banksel OSCTUNE
bsf OSCTUNE,2
b2:
banksel PORTC
btfsc PORTC,3
goto a3
banksel OSCTUNE
bcf OSCTUNE,3
a3:
banksel PORTC
btfss PORTC,3
goto b3
banksel OSCTUNE
bsf OSCTUNE,3
b3:
banksel PORTC
btfsc PORTC,4
goto a4
banksel OSCTUNE
bcf OSCTUNE,4
a4:
banksel PORTC
btfss PORTC,4
goto b4
banksel OSCTUNE
bsf OSCTUNE,4
b4:
goto tune
end
En resumen, este programa debe:
- Llenar de 0's los registros ADCON0 y ADCON1 para asegurarnos de que las entradas análogas estén desactivadas.
- Establecer PORTA y PORTB como salidas llenando de 0's TRISA y TRISB
- Establecer PORTC como entradas llenendo de 1's TRISC
- Para cada uno de los 5 puetros PORTC0 - PORTC4, debe escribir un 1 en el bit correspondiente del registro OSCTUNE si el bit correspondiente del PORTC es 1, y un 0 en el bit de OSCTUNE si el bit correspondiente en PORC es 0.
b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | |
PORTC | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 |
OSCTUNE | - | - | - | 1 | 0 | 0 | 1 | 1 |
La hoja de datos del PIC16F690 [1] (documento 41262E.pdf [2] de microchip), establece en la sección "3.5.2.1. OSCTUNE Register", que el registro OSCTUNE sirve para incrementar en pequeños pasos esta frecuencia de oscilación, aunque no establece la magnitud de estos pasos.
Esto puede servir para eliminar el margen de error de las transferencias de datos asíncronas de EUSART que se muestra en la tabla 12-5 de la sección "12.3 EUSART Baud Rate Generator (BRG)" ya que con OSCTUNE podríamos calibrar FOSC a un valor cercano a 3.6864 MHz, lo cual, segun esta tabla, reduciría el porcentaje de error a 0.00%
El procedimiento que utilicé para la simulación fue el siguiente:
1. Ensamblar con gpasm 0.13.7 beta
$ gpasm -pp16f690 osctune.asm
2. Escribir el archivo de estímulos sti.stc:
sti.stc
- Código:
stimulus asy
initial_state 1
{ 1,1 }
name bo
end
stimulus asy
initial_state 0
{ 1,0 }
name bz
end
node one
node zero
attach one bo portc0 portc1 portc2 portc3
attach zero bz portc4 portc5 portc6 portc7
Como se observa, el objetivo es establecer PORTC en 00001111 conectando PORTC0 - PORTC3 a un estímulo que está mandando un 1 constantemente llamado "bo" y conectado al nodo "one", y conectando PORTC4 - PORTC7 a otro estímulo que está enviando un 0 constantemente llamado "bz" y conectado al nodo "zero".
3. Para la simulación, ejecuté el siguiente comando:
$ gpsim -pp16f690 -s osctune.asm -c sti.stc
Para visualizar mejor, abro las ventanas "Breadboard", "Ram" y "Source". Todo parece funcionar con normalidad al principio.
El problema ocurre cuando llega a la instrucción "movwf TRISC", porque se supone que en ese momento el registro 0007 (ver la figura 2-8 en la sección "2.2.2. Special Function Registers" de [2]), correspondiente al PORTC, debería mostrar 0F (o sea, 00001111), sin embargo, permanece en 00: parece que los estímulos que colocamos por medio del archivo sti.stc no tienen ningun efecto. Lo intento nuevamente, pero esta vez solamente con:
$ gpsim -pp16f690 -s osctune.asm
...para intentar cambiar los estados de PORTC0 - PORTC3 haciendo doble click en los pines por medio del Breadboard: en el breadboard, los pins sí cambian de verde a rojo, pero de nuevo en el registro 0007 no se muestra ningun cambio. Curiosamente, los únicos pins que logran modificar el registro 0007 al cabiar sus estados son PORTC4 y PORTC5 (ademas de CLKOUT para el 0005, y PORTB6 y PORTB7 para el 0006, en otras pruebas que hice).
¿Creen que podrían ayudarme con este problema?
Por cierto: sé que gpsim está diseñado para operar a frecuencias preestablecidas por el programa, así que no espero que la modificación del registro OSCTUNE me muestre una variación medible de la frecuencia FOSC, solamente quisiera ver si mi algoritmo funciona para transmitir los primeros 5 bits de PORTC a OSCTUNE, ¡pero ni eso puedo hacer!
En fin, espero que al menos el programa y las referencias de la hoja de datos los hayan entretenido ó les hayan servido de algo.
Saludos.
Oscar
Edit:
Ayer reporté esto como un bug en el sistema de rastreo de bugs de gpsim [3] y me acaban de dar respuesta. Al principio de osctune.asm, debe uno agregar:
- Código:
banksel ANSEL
clrf ANSEL
banksel ANSELH
clrf ANSELH
...para deshabilitar las entradas análogas del PIC16F690 segun la sección "4.2.1. ANSEL AND ANSELH REGISTERS".
[1] http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en023112
[2] http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf
[3] https://sourceforge.net/tracker/?func=detail&aid=3492929&group_id=2341&atid=102341
vomv1988- Nuevo Usuario
- Mensajes : 8
Fecha de inscripción : 24/02/2012
Temas similares
» [Resuelto] portc6 y portc7 no responden en gpsim para pic16f690
» Fuente de alimentación digital 0-25V con SDCC y PIC16F877A.
» Interfaz de E/S de USB a TTL con PL-2303HX & PIC16F690
» Ejemplo de Control de Un Servo Motor PIC16F690
» [Resuelto]Programador PICKIT2
» Fuente de alimentación digital 0-25V con SDCC y PIC16F877A.
» Interfaz de E/S de USB a TTL con PL-2303HX & PIC16F690
» Ejemplo de Control de Un Servo Motor PIC16F690
» [Resuelto]Programador PICKIT2
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.