Du meintest sicher EIMSK = (1<<PCIE1); oder EIMSK = (1<<PCIE0);
sehe Seite 53 Dattenblatt
Ich hoffe das war der Fehler...
Gruß Sebastian
Druckbare Version
Du meintest sicher EIMSK = (1<<PCIE1); oder EIMSK = (1<<PCIE0);
sehe Seite 53 Dattenblatt
Ich hoffe das war der Fehler...
Gruß Sebastian
JAAAAAAAA es tut sich was es tut sich was!!
Super, dein EIMSK = (1<<PCIE1) war die Tageslösung.
In der Main() wird permanent von 1 bis 9 gezählt bis ein Interrupt kommt.
Gehe ich mit der Hand vor den Sensor, bleibt die Zahl auf dem Display stehen, die als letzte auf das LCD gepinnt wurde.
Und danach bleibt der Butterfly stehen und es passiert nüscht, also es wird nicht das hübsche Wort "wand" angeschrieben, wie in der Interruptfunktion gefordert wird, sondern das Ding bleibt stehen und das wars.
Aber für die Angabe des Registers schonmal vielen Dank, Izaseba.
Naja, jetzt habe ich der PinChangeInterrupt() am Ende noch ein return; spendiert und manchmal klappt es, dass "wand" erscheint und er danach brav weiterzählt. Aber meistens bleibt er wieder nur hängen...
wie ? einer void ...(void) Funktion hast Du noch ein return spendiert ?
Normal dürfte sich sowas nicht kompilieren lassen, oder zumindest eine Warnung ausgeben.
Tue Dir selber ein gefallen, und halte Deine ISR so klein wie möglich,
setze ein globale volatile variable z.B. volatile uint8_t blabla = 0;
un der ISR machst Du nur blabla =1; und in Deiner main schleife prüfst Du Sie mit if (blabla){
tue_was;
blabla = 0;
}
so ist es auf jedemfall sauberer....
Gruß Sebastian
Ja, es ist möglich eine "void"-Funktion mit return zu beenden.
Man schreibt es dann so:
return;
Im Endeffekt dürfte sich mein Butterfly gar nicht aufhängen.
Ein return kann übrigends ohne Wert in c immer gesetzt werden, weil es dann automatisch dem break glecihgesetzt wird.
Wieso sich der BTFLY aufhängt, muss ich aber noch klären.
In jedem Fall wurde mir in diesem Forum stark weitergeholfen.
Wieder vielen Dank,
Florian.
Aha, und was bringt das ?Zitat:
Ja, es ist möglich eine "void"-Funktion mit return zu beenden.
Man schreibt es dann so:
return;
Kann ich dann die Funktion vorzeitig beenden, ohne sie komplett abzuarbeiten also irgendwie aus einer if Abfrage z.B ?
Bis jetzt kannte ich ja return nur im Zusammenhang mit Rückgabewerten...
Man lernt ja nie aus, danke für den Hinweis.
Gruß Sebastian
Ja du kannst eine Funktion vorzeitig beenden.
z.B.:
Code:if(lol==1)
{
return;
}
Wie ich schon gesagt habe, befrei die ISR von der ganzen Last, Das ist ja eine ziemliche Rumspringerei, was Du da drin hast. SprinterSB hat mal einen Artikel in Wiki geschrieben, was der kompiler aus deinem Code macht, schau mal hier und zwar unter Interrupt und Funktion aufrufen.Zitat:
Wieso sich der BTFLY aufhängt, muss ich aber noch klären.
Du springst ja aus der ISR in eine Funktion, damit landet einiges auf dem Stack, in der Funktion werden wiederum Funktionen Aufgerufen, da landet wieder was auf dem Stack, vielleicht läuft der Dir über, keine Ahnung.
Gruß Sebastian
Genau so ist es. Das geht natürlich auch für nicht-void-Funktionen, dann natürlich mit return-Wert. Das kann in einem if oder Schleife oder wo auch immer stehen. Overhead ist es nicht (zumindest bei avr-gcc). Zudem ist das ganz normales C/C++.Zitat:
Zitat von izaseba