Go Down

Topic: Tutorial para Interrupciones (Read 4463 times) previous topic - next topic

ionhs

Aug 06, 2011, 12:22 pm Last Edit: Aug 25, 2011, 01:15 pm by ionhs Reason: 1
He estado creando un tutorial para que cualquiera pueda entender rápidamente una interrupción (Hay que estar registrado para ver los documentos). He intentado darle el formato de los ejercicios de arduino que hay en la web, no he conseguido darle el mismo formato pero creo que se parece. El material que subo en realidad son trozos cogidos de diferentes sitios y modificados para que casen. Las fotos si que son mías y el video acabo de crearlo, no está tan completo como el de ingles pero por lo menos se entiende fácil  :smiley-yell:. Haber que os parece, si veis que algo esté mal o como mejorarlo  y lo que salga si sirve para aprender se puede poner en la web porque en este hilo se perderá rápido.



Como ha recordado Sergegsx hay un video muy bueno (en ingles  :smiley-roll-sweat:) en el que explica el tema de las interrupciones. Si no sabes de que habla y no tienes mucho nivel de ingles no es fácil de entender, pero el video es muy bueno. Tal vez se enrolle demasiado con el tema de rebotes, pero merece la pena.

http://www.youtube.com/watch?v=1nO2SSExEnQ


Por cierto no he traducido yo las funciones de las interrupciones, están en la web ya hechas y me ha ayudado mucho para comprender estas pero creo que hay un fallo en una frase (digo creo porque mi ingles es limitado). En attachInterrupt en el punto de nota dice en ingles:
You should declare as volatile any variables that you modify within the attached function

y esta traducido como:
No deberías declarar como volátil cualquier variable que modifiques dentro de la función.

Me da que el "No" está mal, haber si alguien lo puede confirmar y alguien que tenga permisos cambiarlo. Que mi ingle es malo y igual me he colado yo  :smiley-roll-blue:.

flico

Ionhs, buen trabajo si señor.

Saludos.
Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

SrDonGato

Ya que sacas el tema ... :)

No me quda claro algo que estudié en los PICs, cual de las entradas de interrupcion tiene prioridad ? cual es la jerarquia ?

y otra es que si se desactiva la interrupcion automáticamente hasta que encuentre  el return  o debemos desactivar las interrupciones cuando entramos en la funcion de interrpcion, es deir, si no se desactiva y se lllama 3 veces a la interrupcion mientras no haya acabado la funcion de interrupcion , se hace 1 sola vez o 3 veces ?


un saludo ¡

ionhs

Si en el 8051 había 5 tipos de interrupciones (2 timers, 2 externas y una serie) y podías programas 2 interrupciones en cada programa. Estas 2 tenían 2 prioridades (high y low). En Arduino no he encontrado nada sobre esto. Lo único que he encontrado es que para hacer las interrupciones externas usa las interrupciones de timer (o algo asi) por lo que por eso no se pude usar cuando hay interrupciones activadas la función delay().

Lo que no he probado es que pasa si esta la interrupción externa 0 activada y ejecutando la función y se activa la interrupción externa 1. No he encontrado nada sobre el asunto, si alguien tiene más datos los añadimos a la teoría. Para eso está

zacarino

Podrias poner el enlace?
No lo encuentro

ionhs

#5
Aug 06, 2011, 02:18 pm Last Edit: Aug 06, 2011, 03:05 pm by ionhs Reason: 1

Podrias poner el enlace?
No lo encuentro


Si estas logeado lo tienes que ver en el primer post en la parte de abajo los 3 documentos para que los bajes. Salu2

Por las pruebas que he hecho ante una activación a la vez de int0 y int1 tiene prioridad int0.
Al acabar de ejecutarse la función de int0 responde a int1.

si se activa primero int1 y luego int0 hasta que no acaba int1 no podra ejecutarse int0

Resumiendo int1 y int0 tienen la misma prioridad y en caso de solicitud de activación simultanea primero se ejecuta int0. Pero bueno esto lo he sacado haciendo unas pruebas simples, si alguno conoce con más detalle...

Igor R

#6
Aug 06, 2011, 03:44 pm Last Edit: Aug 06, 2011, 04:00 pm by Igor R Reason: 1
En los atmel de 8 bits, las prioridades de las interrupciones son fijas y de acuerdo a su posición en el vector de interrupciones del micro. Cuanto más baja en la posición, mayor es la prioridad.
Por lo que de más alta a más baja van: reset, int0,int1,pcint0, etc.  

Copio del datasheet:
1   RESET
2   EXT_INT0
3   EXT_INT1
4   PCINT0
5   PCINT1
6   PCINT2
7   WDT
8   TIM2_COMPA
9   TIM2_COMPB
10   TIM2_OVF
11   TIM1_CAPT
12   TIM1_COMPA
13   TIM1_COMPB
14   TIM1_OVF
15   TIM0_COMPA
16   TIM0_COMPB
17   TIM0_OVF
18   SPI_STC
19   USART_RXC
20   USART_UDRE
21   USART_TXC
22   ADC
23   EE_RDY
24   ANA_COMP
25   TWI
26   SPM_RDY

The lowest addresses in the program memory space are by default defined as the Reset and Interrupt Vectors. The complete list of  vectors is shown in "Interrupts" on page 57. The list also determines the priority levels of the different interrupts. The lower the address the higher is the priority level. RESET has the highest priority, and next is INT0 - the External Interrupt Request 0.

Hay que perderle el miedo a los datasheet!!!    :D


Saludos   ;)


Igor R.

ionhs

Lo que pasa es que para trabajar con todo ese montón de interrupciones hay que trabajar con registros. Yo lo he solido hacer con el 8051 y es muy duro, hay que controlar mucho para que funcione y eso que tenía unas pocas interrupciones. En asambler he trabajado con registros pero en C no lo he hecho nunca y no tengo muy claro como se haría.

El tutorial no tenía intención de que fuera para despejar todas las posibilidades que tiene arduino con las interrupciones, sobre todo porque yo no las controlo. Con el tutorial lo que quería era que alguien que no supiera nada de las interrupciones las pudiera empezar a manejar, si se consigue, misión cumplida y si no es porque hay que depurarlo


Sergegsx

muchas gracias ionhs !!!

recuerdo que antes de encontrar un tutorial en youtube de interrupciones no terminaba de pillarlo, tus archivos estan genial, ahora los leere con mas calma pero igual es buena idea crear un PDF con los 3.

Igor R

#10
Aug 06, 2011, 07:13 pm Last Edit: Aug 06, 2011, 07:29 pm by Igor R Reason: 1
ionhs,
Era para la pregunta que había salido en el post acerca de las prioridades y jerarquía. En ningún momento decía por ponerlo en tu tutorial o explicar todas... ni mucho menos!! Para profundizar, ya están los datasheet.
Por cierto, está muy bien. Habría que subirlo en el playground en español, para que no se pierda con el tiempo.


;)

SrDonGato

Gracias por las explicaciones ¡ :)

No he llegado a programar nada aun con interrupciones, solo en PIC y en 8051 en ensamblador.

Un saludo ¡


ionhs


muchas gracias ionhs !!!

recuerdo que antes de encontrar un tutorial en youtube de interrupciones no terminaba de pillarlo, tus archivos estan genial, ahora los leere con mas calma pero igual es buena idea crear un PDF con los 3.



como no cuesta mucho ya está todo junto en PDF

ionhs,
Era para la pregunta que había salido en el post acerca de las prioridades y jerarquía. En ningún momento decía por ponerlo en tu tutorial o explicar todas... ni mucho menos!! Para profundizar, ya están los datasheet.
Por cierto, está muy bien. Habría que subirlo en el playground en español, para que no se pierda con el tiempo.


;)


No pasa nada, no te había entendido. Los documentos los he escrito pensando en mis alumnos, los he publicado para que el que quiera pueda hacer lo que quiera con ellos. En el playground no me aclaro mucho y no tengo muy claro donde se puede poner, si alguien lo tiene más claro que yo por supuesto que lo puede subir. Salu2

Sergegsx

exacto ionhs ese era el video del que hablaba. la verdad es que todos los videos de ese chico son muuuuy buenos, explica de forma super clara y sencilla, yo he aprendido muchisimo simplemente viendo sus videos.

genial que hayas incluido el enlace en el primer post.

ionhs

Esos videos son muy buenos, encima están muy bien montados y editados, tengo todos descargados  :smiley-mr-green:

Ya esta puesto el link al foro en el Playground, ahora que lo conozco   :*

Go Up