Ahí te va la explicación...
En RB0 puedes conectar un botón. Existe una interrupción externa en esa terminal.
El PIC se va a interrumpir cuando...
- RB0 pase de 0 a 1, flanco izquierdo _|
o
- RB0 pase de 1 a 0, flanco derecho |_
es decir, no importa que esté haciendo el PIC, cuando haya cambio de 0 a 1 o viceversa, va a saltar a una subrutina de interrupción y hacer otra cosa.
Para configurarla necesitas primero decir que flanco va a interrumpir al PIC en RB0, ¿subida o bajada?:
EXT_INT_EDGE(L_to_H); //interrumpe cuando pasa de 0 a 1 SUBIDA
o
EXT_INT_EDGE(H_to_L); //interrumpe cuando pasa de 1 a 0 BAJADA
luego habilitas la int ext y luego la global, en ese orden
enable_interrupts(INT_EXT);
enable_interrupts(global);
ya en #INT_EXT metes el código que deba suceder en el evento de una interrupción.
Cuando quieres detectar la presión de RB0 pon L to H y cuando sea liberación pon H to L.
Ahora sobre el timer... nunca vas a lograr que te cuente 30s de un sólo jalón... necesitas hacer conteos de 5ms (por ejemplo) y contar cuantas veces ya pasaron 5ms, de esa forma llegarás a 30s.
Cada que el PIC se te interrumpa porque ya pasaron 5ms, incrementa un contador. Cuando tu contador llegué a 6000 (6000x5ms=30s) sabrás que ya pasaron 30s.
Es un programa un poco complejo pero no imposible. Te explico lo básico únicamente. Te recomiendo visites el link de Ejemplitos para PIC16F84a, está interesante y puedes empezar desde cero.
Ahora el capacitor... así les decimos por acá. También conocidos como condensadores
La conexión del capacitor de 1uF debe ser así