TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Kuroned en 20 de Septiembre de 2021, 16:27:40
-
Hola a todos, llevo un tiempo pequeño con los pic en especial el 12f675, el caso es que estoy tratando de entender como usar la interrupcion por contador de eventos del timer0 del pic12f675, pero no logro hacer que funcione de la manera que deseo.
Device = 12F675
Reminders off
Config MCLRE_OFF, WDT_OFF, INTRC_OSC_NOCLKOUT
Reminders On
Xtal 4
Declare RsOut_Mode True
Declare RsOut_Pin GPIO.4
Declare Serial_Baud 9600
CMCON= %00000111
TRISIO= %00000100
ANSEL= %00011000
ADCON0=%10000011
OPTION_REG = %11101111
INTCON = %10100000
Dim Aux As Float
TMR0 = 252
GPIO.0 = 0
RsOut 0
Inicio:
DelayMS 100
If INTCON = %10100100 Then
TMR0 = 246
EndIf
If GPIO.2 = 1 Then
DelayMS 100
GPIO.0 = 1
RsOut "contador",Dec TMR0,13
Else
GPIO.0 = 0
EndIf
GoTo Inicio
End
En mi vago entendimiento, había entendido que al momento en que se desbordara el timer0 cambiaria el bit 2 del intcon pero la secuencia del if no funciona y simplemente hace como que no existe, entonces no se si comprendí bien el funcionamiento de la interrupción por desbordamiento, leo el material de los datasheet, pero quedo igual, no se si me pueden dar algún ejemplo sobre como funciona, busco por la web y los ejemplo que veo son con mplabs o C, pero no pillo en proton, de antemano agradecería mucho la ayuda.
PD: es lo de menos ya que quizás sea fallo mío, pero al enviar la información del rsout por pantalla virtual en proteus esta me imprime valores extraños, sin embargo cuando la señal que envió es constante esta escribe bien, puede ser fallo del delay que le doy?
dejo adjunta una imagen de como se ve el circuito y lo que me muestra en pantalla en caso de que ayude.
-
Que tal Kuroned,
Bienvenido al foro y al mundo de los microcontroladores PIC.
Primero que nada veo que no tienes claro el funcionamiento de las interrupciones. Para explicarlo te daré una ilustración.
Imagina que te encuentras realizando una tarea, digamos que estás leyendo un libro y de repente tu hijo más pequeño pega un grito de auxilio, dejas de hacer eso que estabas haciendo y te levantas inmediatamente para atender a tu hijo. Eso es una interrupción y de igual manera sucede con un microcontrolador.
En el caso de este microcontrolador lo que hace precisamente es salir de lo que principalmente está realizando para atender la interrupción que puede tener fuentes diferentes: interrupción externa, interrupción pro desborde de timer 0, etc. Para ello el microcontrolador tiene un vector de interrupción que no es más que un salto a la dirección 0004H de la memoria de programa. Entonces ahí es que preguntas qué periférico fue el que generó la interrupción y pasa a realizar la tarea correspondiente.
Dependiendo el compilador que uses el procedimiento para configurar la interrupción te lo dirá su respectivo manual.
Para el caso de protón compiler se usa la directiva: On Interrupt GoTo My_Software_Int
Aquí un ejemplo tomado del manual de proton:
Device = 16F877
Declare Xtal = 4
Symbol LED = PORTD.0
OPTION_REG = %00000111
INTCON = %00100000
'
' Enable software interrupts, and point to interrupt handler
'
On Interrupt GoTo My_Software_Int
Stop
Disable ' Disable interrupts in the handler
My_Software_Int:
Toggle LED ' Toggle an LED when interrupted
Resume ' Return to main program
Enable ' Enable interrupts after the handler
Como te podrás dar cuenta el funcionamiento es sencillo, cada vez que hay una interrupción externa el led cambiará de estado.
Espero esto te sirva para lo que estás deseando hacer.
elreypic.
P.S Puedes descargar el manual de protón del siguiente link: https://www.vk5dj.com/1%20-%20Proton%20Compiler%20Manual.pdf
-
Que tal Kuroned,
Bienvenido al foro y al mundo de los microcontroladores PIC.
Primero que nada veo que no tienes claro el funcionamiento de las interrupciones. Para explicarlo te daré una ilustración.
Imagina que te encuentras realizando una tarea, digamos que estás leyendo un libro y de repente tu hijo más pequeño pega un grito de auxilio, dejas de hacer eso que estabas haciendo y te levantas inmediatamente para atender a tu hijo. Eso es una interrupción y de igual manera sucede con un microcontrolador.
En el caso de este microcontrolador lo que hace precisamente es salir de lo que principalmente está realizando para atender la interrupción que puede tener fuentes diferentes: interrupción externa, interrupción pro desborde de timer 0, etc. Para ello el microcontrolador tiene un vector de interrupción que no es más que un salto a la dirección 0004H de la memoria de programa. Entonces ahí es que preguntas qué periférico fue el que generó la interrupción y pasa a realizar la tarea correspondiente.
Dependiendo el compilador que uses el procedimiento para configurar la interrupción te lo dirá su respectivo manual.
Para el caso de protón compiler se usa la directiva: On Interrupt GoTo My_Software_Int
Aquí un ejemplo tomado del manual de proton:
Device = 16F877
Declare Xtal = 4
Symbol LED = PORTD.0
OPTION_REG = %00000111
INTCON = %00100000
'
' Enable software interrupts, and point to interrupt handler
'
On Interrupt GoTo My_Software_Int
Stop
Disable ' Disable interrupts in the handler
My_Software_Int:
Toggle LED ' Toggle an LED when interrupted
Resume ' Return to main program
Enable ' Enable interrupts after the handler
Como te podrás dar cuenta el funcionamiento es sencillo, cada vez que hay una interrupción externa el led cambiará de estado.
Espero esto te sirva para lo que estás deseando hacer.
elreypic.
P.S Puedes descargar el manual de protón del siguiente link: https://www.vk5dj.com/1%20-%20Proton%20Compiler%20Manual.pdf
FUNCIONOOOO muchas graciassss, no lograba entender como funcionaba, el ejemplo del padre con el niño fue la mejor forma muchas gracias por la ayuda, el TMR0 llega a 256 y se reinicia y continua donde lo deje, ahora solo me queda buscar como arreglar lo de la salida en la pantalla virtual que aparecen símbolos raros (¬Ë‹W‘½Éÿ) algo así , pero el código general funciona, muchas gracias.
Device = 12F675
Reminders off
Config MCLRE_OFF, WDT_OFF, INTRC_OSC_NOCLKOUT
Reminders On
Xtal 4
Declare RsOut_Mode True
Declare RsOut_Pin GPIO.4
Declare Serial_Baud 9600
CMCON= %00000111
TRISIO= %00000100
ANSEL= %00011000
ADCON0=%10000011
OPTION_REG = %11101111
INTCON = %10100000
Dim Aux As Float
TMR0 = 246
GPIO.0 = 1
RsOut 0
Main:
If GPIO.2 = 1 Then
DelayMS 100
GPIO.0 = 1
DelayMS 100
RsOut "contador", Dec TMR0 - 246, 13
Else
GPIO.0 = 0
EndIf
On Interrupt GoTo Inicio
GoTo Main
Stop
Disable
Inicio:
TMR0 = 246
DelayMS 100
RsOut "TMR0 reiniciado",Dec TMR0,13
INTCON = %10100000
Resume
Enable
End
-
...... ahora solo me queda buscar como arreglar lo de la salida en la pantalla virtual que aparecen símbolos raros (¬Ë‹W‘½Éÿ) algo así ...
Cambiá ANSEL= %00011000 por ANSEL= 0
-
...... ahora solo me queda buscar como arreglar lo de la salida en la pantalla virtual que aparecen símbolos raros (¬Ë‹W‘½Éÿ) algo así ...
Cambiá ANSEL= %00011000 por ANSEL= 0
Gracias por responder y ayudar, recién leí el mensaje, me tomo unos 20 min buscando y leyendo asjdjasd