Hallo an alle,
sorry für den blöden "Betrefftext", mir ist nichts besseres eingefallen.
Ok nun zur Frage:
ich habe einen M32 der über INT0 ein Empfängersignal einliest. Das
Signal ist nur aus (1ms) oder ein (2ms).
Nun möchte ich in meinem Programm so eine Art Sicherung einbauen, dass
es erst losläuft, wenn der Schalter auf "Aus" ist. Das Signal messe ich
mit einer Interrupt Routine.
Nun wollte ich eine IF Schleife vor dem eigentlichen Programmstart
setzen (Do-Loop-End), also noch bei den Initialisierungen. Das Problem
dabei ist, dass das Programm da anscheinend noch nicht in die Interrupt
Routine springt und ich somit das Signal nicht auswerten kann.
Dann wollte ich es mit einer Do-Loop Until Schleife im Programm
versuchen, das geht auch nicht, da er auch dort nicht in die Routine
springt.(?)
also wie kann ich es geschickt lösen, dass das Programm erst richtig los
geht, wenn der Schalter aud AUS ist?
ist sicherlich kinderleicht, aber ich bin noch Anfänger...
Vielen Dank!
Lg
Peter
>>Das Signal messe ich mit einer Interrupt Routine.
wie sieht die aus ? (code)
>>Das Problem dabei ist, dass das Programm da anscheinend noch nicht in die >>Interrupt Routine springt ...
wenn der Interrupt bereits eingerichtet und freigegeben ist, dann schon.
Zeig doch mal, was du bisher schon hast.
Peter schrieb:>> Nun wollte ich eine IF Schleife vor dem eigentlichen Programmstart> setzen (Do-Loop-End), also noch bei den Initialisierungen. Das Problem> dabei ist, dass das Programm da anscheinend noch nicht in die Interrupt> Routine springt und ich somit das Signal nicht auswerten kann.
Sobald du die Interrupts freigibst, sind sie freigegeben.
Die zentrale Do-Loop hat damit nichts zu tun
Du hast dann eben in deinem Programm 2 Do-Loops
die erste wartet solange bis die Anfangsbedingung hergestellt ist und
die zweite ist die eigentliche Arbeitsschleife.
Du scheinst in der Vorstellung zu leben, dass die übliche Do-Loop
irgendetwas besonderes darstellen würde und über irgendwelche Magie
verfügt. Dem ist aber nicht so. Das ist einfach nur eine ganz normale
Schleife. Und klar kannst du auch meherer Schleifen hintereinander
machen, so dass der Programmfluss von einer Schleife in die nächste
fällt, wenn bestimmte Bedinungen eintreten. Nur aus der letzten sollte
der Programmfluss dannn nicht mehr herauskommen.
AHHHH,
ich glaube, ich habe meinen Fehler gefunden.
in der Interrupt Routine wird zwar ein Wert gebildet. Aber umgeformt
wird der Wert erst in dem Hauptprogramm. Daher konnte das nicht
funktionieren...
Das muss ich jetzt mal schnell austesten.
Oft ist es einfach gut, wenn man wo was postet, man kommt hin und wieder
doch selber drauf.
Dann werde ich es jetzt genau mit den zwei Schleifen versuchen!
DANKE!
Lg
Peter
Peter schrieb:> Nun wollte ich eine IF Schleife vor dem eigentlichen Programmstart> setzen (Do-Loop-End), also noch bei den Initialisierungen. Das Problem> dabei ist, dass das Programm da anscheinend noch nicht in die Interrupt> Routine springt und ich somit das Signal nicht auswerten kann.
Ich verstehe nicht so genau was du sagen willst, aber vielleicht hilft
ja dieser Ansatz:
Nimm eine Variable zum Testen ob das Programm 'loslaufen' darf, und
setze diese im Interrupt.
Selbst wenn -warum auch immer- das Programm noch nicht in die
Interruptroutine springt, wartet es trotzdem weil die Variable eben noch
nicht nicht den erforderlichen Wert hat.
Danke an alle,
habs nun geschafft!
Nun habe ich eine erneute Frage an euch:
Ich verwende nun einen 3 Stufen Schalter an meiner Fernsteuerung. Also
lese ich am M32 3 Werte ein. Schalter unten ist 1ms, Schalter mitte ist
1,5ms und Schalter oben ist 2ms.
Also das einlesen ist kein Problem, das funktioniert alles. Nun müssen
aber gewissen Handlungen geschehen (Servos steuern, Leds leuchten...),
je nach dem, wo der Schalter steht. Das schwierige daran ist, dass das
Programm erkennen muss, wo der Schalter vorher war. Also wenn man die
mittlere Stellung vom Schalter nimmt, so muss ich wissen, ob der
Schalter von oben kommt, oder von unten kommt, da je nach dem andere
Handlungen gesetzt werden müssen.
wie könnte ich das am besten angehen? Ich möchte dazu gerne "Case
select" nehmen. Ich habe dazu mal das Eingangssignal in mehrere Ebenen
unterteilt.
Anbei ein bisschen Code....
1
If Rc_value > 8000 And Rc_value < 9000 Then Signalstufe = 1
2
If Rc_value > 9000 And Rc_value < 10000 Then Signalstufe = 2
3
If Rc_value > 10000 And Rc_value < 11000 Then Signalstufe = 3
4
If Rc_value > 11000 And Rc_value < 12000 Then Signalstufe = 4
5
If Rc_value > 12000 And Rc_value < 13000 Then Signalstufe = 5
6
If Rc_value > 13000 And Rc_value < 14000 Then Signalstufe = 6
7
If Rc_value > 14000 And Rc_value < 15000 Then Signalstufe = 7
8
If Rc_value > 15000 And Rc_value < 16000 Then Signalstufe = 8
9
10
11
If Value < 1.1 Then Status = 1
12
If Value > 1.3 And Value < 1.7 And Signalstufe < Value_old Then Status = 21
13
If Value > 1.3 And Value < 1.7 And Signalstufe > Value_old Then Status = 22
Ich weiß nicht, ob es Dir hilft, aber ich hänge mal ein paar Spielereien
in Bascom an, wo ein AVR als Modellbau-Schaltmodul eingesetzt wird. Ich
hab's mal für einen Programmieranfänger (TV- und Elektronik-Fachman)
geschrieben, so in der Hoffnung, dass es es selbst an eigene Bedürfnisse
anpassen kann.
...