ich würde gerne die attiny interrupt funktion nutzen, aber ich blicke da leider nicht ganz durch........
schon auf einigen seiten gegucket und im datenblatt.....
ich würde gerne ein funksender für ein bewegungsmelder und oder rauchmelder bauen....
der soll alle paar std den batteriestand übersenden, das geht schon mal.....
ansonsten soll er schlafen........
kommt jetzt ein high-signal vom zb bewegungsmelder, soll er aufwachen und senden.....
ist er grade mit dem senden das batteriestandes beschäftigt soll er abbrechen und ebenfalls den alarm senden......
das meisten hab ich schon, aber ich komme mit der interupt sache nicht weiter........
ist das ok so ? denke mal nicht (; :
(ist nur der sketch um den umgang mit dem interrupt zu lernen)
die led geht an, wenn ich an den phys. pin 12 5v anlege.......
aber die blinkt nicht auf......bzw geht nicht wieder aus.......
und damit das funktioniert muss ich an pin 12 ein pullup widerstand anbringen
Ich würde das Blinken in loop() machen, nicht im Interrupt Handler. Insbesondere wegen delay(), das funktioniert im Interrupt Handler ziemlich sicher nicht.
(das oben ist nur ein beispiel für mich, um das zu lernen).
der eigentliche sketch ist ja ein funksender.....
geht virtual wire denn im interrupt-handler ?
und verstehe ich das richtig ? (bezogen auf obriges beispiel)
wenn ein high-signal auf dem pin anliegt, startet der interrup handler und danach fängt der loop von vorne an ?
und der interrupt, den ich verwendet habe, ist auch in der lage ein laufendes program zu unterbrechen ? (weil schalte den ja nicht ab?)
also wäre für das, was ich vorhabe folgendes sinnvoll ?:
ich habe mein teil vom sketch, der fürs auslesen der batterispannung und fürs senden usw zuständig ist mit einer variablen für "alarm".....
der tiny schläft und wird zb einmal pro std durch den watchdog geweckt..... im watchdog interrups handler ist dann "alarm = 0", weil geht ja nur darum die batterispannung zu übermitteln.
und in den interrup handler für den pin, auf dem der alarmausgelößt wird kommt dann "alarm = 1"....
wenn de rtiny jetzt schläft, und es kommt ein "alarm" wird er durch den interrupt geweckt, "alarm auf 1" gesetzt und dann gehts mit loop weiter ? loop sendet dann den string für den alarm und der tiny geht wieder schlafen.......
Beim Eintritt in eine ISR wird das globale Interrupt Enable Flag deaktiviert damit sich Interrupts nicht gegenseitig unterbrechen können. Damit wird der Timer0 Interrupt nicht mehr ausgelöst. delay() fragt aber in einer Schleife ständig micros() ab.
Die Lösung ist wie gesagt in der ISR nur eine boolsche Variable zu setzten (volatile nicht vergessen!) auf die man in loop() abfragt. Dann weiß man dort das was zu tun ist.
Delays gehen gar nicht!
Delays sind böse.
Ok... manchmal macht die Verwendung von Microdelays Sinn. Wenn es auf 100%iges Timig ankommt.
geht virtual wire denn im interrupt-handler ?
Da VirtualWire vermutlich auch mit Interrupts arbeitet, ein klares Nein!
Es sei denn du triffst spezielle Vorkehrungen, z.B. machst deine Dinge und die fremden Libs Reentrant.
1.) Alle Variablen die innerhalb und außerhalb von ISRs verwendet werden müssen als volatile deklariert werden
2.) Verwende besser einen unsigned char und nicht einen int. 2-Byte Variablen mit ISRs können auch Probleme bereiten da der Zugriff nicht atomar ist
3.) Das sind Pin-Change Interrupts. Das hat zwei Folgen:
3.1.) Der Interrupt wird mit beiden Flanken ausgelöst. Das wird bei dir mit dem riesigen Delay aber keine Rolle spielen
3.2.) Wenn man die Pins trennen will muss man in der ISR abfragen welcher Pin den Interrupt ausgelöst hat, da sich mehrere Pins (bis zu acht) einen Interrupt Vektor, d.h. eine ISR teilen.
aber geht auch nicht wirklich.......deswegen gehe ich mal davon aus, das ich das immer noch nicht ganz verstanden hab......
hab versucht, das zu berücksichtigen, was du geschrieben hast......
zb abfrage ob "HIGH"-flanke und unterschiedung, von welchem pin.
ein char statt ein int.
was ich auch noch nicht ganz verstehe....
mehrere pins teilen sich ja ein vektor......
wenn jetzt aber einer dieser pins ein interrupt ist und der andere ein output, was hat das dann für auswirkungen auf das programm bzw die interrupts ?
zb abfrage ob "HIGH"-flanke und unterschiedung, von welchem pin.
Du fragst auf den Zustand ab, nicht die Flanke. Das reicht in diesem Fall aber wahrscheinlich.
wenn jetzt aber einer dieser pins ein interrupt ist und der andere ein output, was hat das dann für auswirkungen auf das programm bzw die interrupts ?
Gar keine. Was soll sich da beißen?
Und hast du eigentlich irgendeinen Plan was du da machst? Pins 2, 3 und 4 sind PCINT8, PCINT9 und PCINT11. Die sind im PCMSK1 Register. Dazu musst du auch in GIMSK PCIE1 statt PCIE0 aktivieren. Und die ISR ist dann PCINT1_vect
Wir reden hier von einem ATtiny84 oder?
das mit den strings weiß ich auch nicht......
ich hatte das so verstanden:
"2.) Verwende besser einen unsigned char "
volatile hatte ich mir angesehen, ich wußte nur nicht, wie das da rein passt......
und um ehrlich zu sein.........ein wirklichen plan hab ich nicht, deswegen frag ich ja bzw versuche das irgendwie zu verstehen...... ich hab auch schon auf edlichen (meist englischen) seiten gesucht......aber naja.....
es ist ein attiny84, aber ich hab eine andere pinmap !!!!
phys. pin 13 ist bei mir input 0
und phys pin 2 ist bei mir input 10 !!!
damit müßte das was ich da fabriziert habe doch stimmen oder ?
also wenn ich das jetzt richtig verstanden hab...
geht der interrupt an jedem pin (PCINTx) ?
die pins werden in gruppen/vectoren(y) eingeteilt.
jede gruppe hat ihr eigenes "ISR(PCINTy_vect)" = interrupt handler.