Salida sin errores en PIC10F

1

Estoy aprendiendo a programar un PIC10F220. Estoy usando un programador PICkit 3 y ejecutando experimentos físicos, así como también ejecutando el simulador en MPLABX.

Una cosa que quiero hacer es establecer el nivel adecuado para un cierre de salida de puerto antes de que el triple estado (TRIS) cambie al modo de salida. Este diagrama sugiere que debería ser posible, y que las rutas de entrada y salida son separables:

Heescritoestetrozodemontaje:

; !GPWU=0: enable wakeup on pin change ; !GPPU=0: enable weak pullup on GP0,1,3 ; T0CS=0: timer 0 internally clocked ; T0SE=0: ignored ; PSA=0: prescaler assigned to timer 0 ; PS=111: 1:256 prescaler movlw b'111' option ; ANS1=0: GP1 digital ; ANS0=1: GP0 analog in ; CHS=00: channel GP0/AN0 ; GO=0: not converting yet ; ADON=1: ADC is enabled movlw b'01000001' movwf ADCON0 ; We can write to the GP2 latch even if it's still in input mode; ; this ensures no glitch between clearing TRIS and sending the GP2 output. ; (but this doesn't work in the simulator) btfsc GPIO, GP1 ; Check GP1 status (negative logic) goto gp1_off gp1_on: ; if it's clear, port 1 is on bsf GPIO, GP2 ; turn GP2 on goto gp2_done gp1_off: ; if it's set, port 1 is off bcf GPIO, GP2 ; turn GP2 off gp2_done: movlw b'1011' ; only GP2 output, others input tris GPIO

Como en los comentarios, en la vida real esto funciona, pero en el simulador de MPLABX los intentos de modificación a GP2 no tienen efecto. ¿Por qué sería esto? ¿Han fallado en modelar el latch de escritura como funcional incluso cuando el bit TRIS correspondiente todavía está alto (entrada)?

Esto parece pertinente:

  

PUERTOS DE E / S BIDIRECCIONALES

     

Algunas instrucciones operan internamente según lo leído seguido   por operaciones de escritura. Las instrucciones BCF y BSF, para   Por ejemplo, lea todo el puerto en la CPU, ejecute el   Operación de bit y reescribir el resultado. La precaución debe ser   utilizado cuando estas instrucciones se aplican a un puerto   donde se usan uno o más pines como entradas / salidas. por   ejemplo, una operación BSF en el bit 2 de GPIO causará   los ocho bits de GPIO que se leerán en la CPU, el bit 2 a   establecer y el valor GPIO que se escribirá en la salida   pestillos Si se utiliza otro bit de GPIO como bidireccional.   Pin de E / S (por ejemplo, bit 0) y se define como una entrada en este   tiempo, la señal de entrada presente en el pin mismo sería   Lea en la CPU y vuelva a escribir en el cierre de datos de este   Pin particular, sobrescribiendo el contenido anterior. Tan largo   como el pin permanece en el modo de entrada, no se produce ningún problema.   Sin embargo, si el bit 0 se cambia al modo de salida más adelante,   el contenido del cierre de datos ahora puede ser desconocido.

    
pregunta Reinderien

1 respuesta

2

La Figura 5-1 es un poco engañosa. De hecho, ninguno de los circuitos de pines de E / S del PIC10F220 se ve exactamente así. Aquí está el circuito para el pin 2: -

Tenga en cuenta que el controlador de salida de GP2 está deshabilitado cuando T0CS es alto. T0CS es el bit 5 del registro de OPCIÓN, ¿y adivina qué? Sí, es alto en el encendido!

Para habilitar la salida digital en el pin 2, debe borrar el bit T0CS en el registro de opción, como este: -

movlw b'11011111' ; T0CS low, other option bits high
option

Si desea utilizar GP0 o GP1 como salidas, tiene un problema similar. Estos pines se comparten con las entradas analógicas AN0 y AN1, que se habilitan en el encendido. Para habilitar sus salidas digitales, debe borrar los bits ANS1 y ANS0 en ADCON0 .

EDITAR:

Su código actualizado se simuló correctamente para mí en MPLab 8.92 pero no en MPLabX 3.65, lo que sugiere un error en el simulador de MPLabX.

    
respondido por el Bruce Abbott

Lea otras preguntas en las etiquetas