E. O. schrieb:> Ich hab schon geschaut im Datenblatt,> kann das aber nicht richtig deuten.
und was kannst du dort nicht deuten? Es gibt doch für jeden Interupt ein
enable flag und bei den externen kann man sogar noch die die flanke für
die erkennung einstellen.
In Assembler geht das einfach mit Enable INT0.
Ich schau im Datenblatt unter External Interrupts und da seh ich nicht
durch. Muss ich dort unter EIFR schauen?
E. O. schrieb:> In Assembler geht das einfach mit Enable INT0.
das glaube ich nicht.
Du musst nur die passenden Bits im passenden Register auf 1 setzen
RegisterNameAusDatenblatt |= (1<<BIT_AUS_DATENBLATT)
The INT0 and INT1 interrupts can be triggered by a falling or rising
edge or a low level. This is
set up as indicated in the specification for the “MCU Control Register –
MCUCR” on page 30.
Peter das ist sicherlich nett gemeint, aber mir ist leider noch nicht
ersichtlich welches Register das ist. Es gibt dort ein
MCU Control Register
General Interrupt Mask Register
External Interrupt Flag Register
Pin Chance Mask Register.
Meiner Vermutung nach würd ich dann das External Interrupt Flag Register
nehmen. Und dort müsst ich wohl den Pin6 setzen, damit der INT0 aktiv
wird?
Also so vielleicht:
EIFR = |= (1<<INTF0)
Peter II schrieb:> The INT0 and INT1 interrupts can be triggered by a falling or rising> edge or a low level. This is> set up as indicated in the specification for the “MCU Control Register –> MCUCR” on page 30.
Muss ich denn die Entscheidung treffen ob steigende oder fallende
Flanke? Oder entscheidet er eventuell automatisch wenn ich das
unverändert lasse? Mit dem Register aktivier ich doch aber noch nicht
den INT0 !?
E. O. schrieb:> EIFR = |= (1<<INTF0)
ja sorry der verweis mit der seite 30 war ein wenig falsch. Das sieht
schon besser aus, dazu musst du noch die Flanke festlegen
Table 32. Interrupt 0 Sense Control
(seite 60)
E. O. schrieb:> Sieht das nur besser aus oder ist es auch richtig?
keine Ahnung - dafür gibt es doch den Simulator
> Für den Taster - den leg ich einmal auf den INT0 und auf der anderen> Seite auf GND oder V++?
kommt darauf an, hast du auch noch einen Pull-UP oder Pull-Down
widerstand vorgesehen, wenn nein musst du auch noch den internen Pull-UP
aktivieren und dann gegen GND schalten.
Peter II schrieb:> kommt darauf an, hast du auch noch einen Pull-UP oder Pull-Down> widerstand vorgesehen, wenn nein musst du auch noch den internen Pull-UP> aktivieren und dann gegen GND schalten.
Bislang habe ich davon noch nichts gemacht. Also könnt ich
theorischerweise noch hinten den Taster ein Widerstand auf Masse legen?
Mit Simulator hab ich noch nicht gearbeiter. Aber so wie es jetzt ist
funktioniert es anscheinend nicht. Bleibt weiterhin im sleepmode
E. O. schrieb:> Also könnt ich theorischerweise noch hinten den Taster ein Widerstand auf Masse
legen?
diesen Satz versteht ich nicht. Du musst dafür sorgen das wenn er Taster
nicht gedrückt ist, das ein definierter Pegel an dem eingang anliegt. Es
darf also keine "offnen" eingang geben.
Dafür kann man den Internen Pull-UP aktivieren oder man muss einen
Externen Pull-UP oder Pull-Down verwenden.
Peter II schrieb:> Dafür kann man den Internen Pull-UP aktivieren oder man muss einen> Externen Pull-UP oder Pull-Down verwenden.
Ich schalte also zwischen INT0 und GND einen Widerstand (z.B. 4,7k?).
Dann leg ich den Schließer-Taster an Spannung und INT0?
E. O. schrieb:> Ich schalte also zwischen INT0 und GND einen Widerstand (z.B. 4,7k?).> Dann leg ich den Schließer-Taster an Spannung und INT0?
wenn du unbedingt einen Widerstand verbauen willst: JA.
Naja sagen wir mal so, bis jetzt läuft das immer noch nicht mit dem
Interrupt. Da ist für mich die schnellere Lösung. Es macht natürlich
wahrscheinlich mehr Sinn den internen Widerstand zu nutzen. Das würd ich
machen wenn der Interrupt funktioniert.
Mein Quellcode schaut jetzt so aus. Er arbeitet sich bis zum
Sleepmodeaufruf durch, da diese Zeile noch verarbeitet wird.
1
lcd_string("830");
Allerdings kommt er dort wohl nicht raus, weil weder die LED an B5
leuchtet, noch der Text sich auf dem LCD ändert.
Super genau das war es! Jetzt erkennt er die externen Interrupts. Vielen
Dank Peter! Und jetzt kannst du mir vielleicht noch ein Hinweis zum
internen Pulldownwiderstand geben.
Wenn ich den Sleepmode auf Standby stellen würde, dann könnt ich den
Controller mit den externen Interrupt doch dennoch aus dem Schlaf holen
oder?
E. O. schrieb:> Und jetzt kannst du mir vielleicht noch ein Hinweis zum> internen Pulldownwiderstand geben.
steht alles auf Seite 47.
> Wenn ich den Sleepmode auf Standby stellen würde, dann könnt ich den> Controller mit den externen Interrupt doch dennoch aus dem Schlaf holen> oder?
Warum testest du es nicht einfach (oder liest das Datenblatt, dort steht
erstmal ob es gehen müsste) oder hast du Angst das etwas Explodiert?
Peter II schrieb:> Warum testest du es nicht einfach (oder liest das Datenblatt, dort steht> erstmal ob es gehen müsste) oder hast du Angst das etwas Explodiert?
Ne explodieren sollte hier wenig, aber wenn der nicht mehr aufwacht,
dann hab ich keinen Controller mehr :) Hätte ja sein können, dass du
darüber schon bescheid weißt.
Leider lässt sich durch den INT0 nicht der Controller daraus aufwecken.
Wobei im Datenblatt für INT0 steht:
"for INT0 only level interrupt"
Was soll mir das sagen?
Hm ich weiß warum es nicht geht. Ich brauch wohl einen externen Takt,
nutze bislang den internen.
Ok an dem interner RC-Oszillator sollte es nicht liegen.
Unter folgenden Link ist dafür nämlich eine Wartezeit im Powerdownmode
angegeben. Die ich vielleicht nicht einhalte?
http://www.mikrocontroller.net/articles/Sleep_Mode
E. O. schrieb:> Ne explodieren sollte hier wenig, aber wenn der nicht mehr aufwacht,> dann hab ich keinen Controller mehr :) Hätte ja sein können, dass du> darüber schon bescheid weißt.
ich weiss das, weil ich mich intensiv mit den Datenblatt beschäftig
habe. Und auch die nebensätze lese wo drin steht unter welchen
bedingungen er wir arbeitet.
> "for INT0 only level interrupt"> Was soll mir das sagen?
das soll dir sagen das es im zusammenhang mit einer Flanken-Erkennung
nicht geht.
Peter II schrieb:> das soll dir sagen das es im zusammenhang mit einer Flanken-Erkennung> nicht geht.
Also wenn ich die Flankenerkennung auskommentiere sollte es gehen? Wenn
ich das mache, dann hängt er sich dort wohl auf, also es werden erst gar
keine Messungen gestartet. Er brauch das wohl eine Flankenerkennung
bevor ich INT0 aktivere.
E. O. schrieb:> Also wenn ich die Flankenerkennung auskommentiere sollte es gehen?
nich auskommentieren, anpassen. Du musst dich dann entscheiden ob du auf
High oder Low reagieren willst. Wenn du auf "spannung" den Taster
angeschlossn hast dann must du auf High reagieren. Aber der interupt
wird dann ständig aufgerufnen wenn der Taster gedrückt ist. Wenn das
stört muss die den Interupt abschalten wenn du wach bist und ihn erst
wieder anschalten wenn du schlafen gehst. (oder eine anderen Atmel
verwenden, die Megas können das was du willst)
Achso ich hatte dich so verstanden das Standbymodus allgemein mit
Flankenerkennung nicht geht. Du meinst aber ich muss die
Flankenerkennung jetzt noch um den Pegel ergänzen? Wenn mir jetzt
nochmal bei dem entsprechenden Register behilflich sein könntest? Das
MCU Control Register ist es nicht.
Ich habe noch mal die Doku genau gelesen. Bei INT0 sollte auch die
Flanke gehen wie du es schon gemacht hast.
Seite 31:
Power-down : INT0, INT1 and Pin Change[2]
2. For INT0, only level interrupt.
Damit sollte das Aufwachen aus dem PowerDown mit INT0 und level gehen.
Versteh ich nicht, das hab ich doch längst im Quellcode drin. Zumal es
Tabelle 32 für INT0 sein sollte.
//Steigende Flanke für INT0
MCUCR |= (1<<ISC01) | (1<<ISC00);
Peter II schrieb:> Damit sollte das Aufwachen aus dem PowerDown mit INT0 und level gehen.
Ja dachte ich auch, aber es passiert nicht. Den Sleepmode tu ich jetzt
mit
1
MCUCR|=(0<<SM1)|(1<<SM0);
anstelle von vorher
1
set_sleep_mode(SLEEP_MODE_IDLE);
setzen. Das sollte aber nicht das Problem sein.
Für den Powerdownmode weiß ich allerdings noch nicht so recht ob es egal
ist SM1 = 0 und SM0 = 1 oder SM1 = 1 und SM0 = 0. Ich habe beide
Varianten versucht. Erfolglos.
Laut Datenblatt sollte das eigentlich wirklich funktionierne. Ich weiß
nicht wo ich weiter suchen soll.
Also wenn ich das ganze im idlemode mache, hab ich ein Strom von ca.
4mA, bring ich den Controller in den powerdownmode dann hab ich
lediglich 1mA mit LCD. Aus dem Grund ist es für mich sehr
erstrebenswert, den Controller in den powerdownmode zu bekommen und den
mit den Interrupt wieder daraus zu erwecken.