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.
Danke für deine Antwort, anbei mal mein Code.
1 | $regfile "m32def.dat" |
2 | $crystal = 8000000 |
3 | $baud = 9600 |
4 | $hwstack = 32 |
5 | $swstack = 10 |
6 | $framesize = 40 |
7 | |
8 | |
9 | Config Portc = Output |
10 | Config Pind.4 = Output |
11 | Config Pind.5 = Output |
12 | Config Pind.6 = Output |
13 | Config Pind.7 = Output |
14 | Config Pind.2 = Input |
15 | |
16 | Config Pina.6 = Output |
17 | Config Pina.5 = Output |
18 | Motor1 Alias Porta.6 |
19 | Motor2 Alias Porta.5 |
20 | Motor1 = 0 |
21 | Motor2 = 0 |
22 | |
23 | |
24 | Config Lcdpin = Pin , Db4 = Portd.7 , Db5 = Portd.4 , Db6 = Portd.5 , Db7 = Portd.6 , E = Portc.0 , Rs = Portc.1 |
25 | Config Lcd = 20 * 2 |
26 | |
27 | |
28 | Cursor Off |
29 | Config Timer1 = Timer , Prescale = 1 |
30 | Config Int0 = Change |
31 | |
32 | Dim Reading As Bit |
33 | Dim Rc_value As Word |
34 | Dim Value As Single |
35 | Dim Signal As String * 10 |
36 | Dim Calc As Word |
37 | Dim Einschaltsignal As Bit |
38 | |
39 | Dim Servowert_1 As Byte |
40 | |
41 | On Int0 Rc_read |
42 | |
43 | Enable Timer1 |
44 | Stop Timer1 |
45 | Enable Int0 |
46 | Enable Interrupts |
47 | |
48 | Config Servos = 1 , Servo1 = Portc.4 , Reload = 10 |
49 | |
50 | Cls |
51 | |
52 | |
53 | |
54 | |
55 | '################################################### |
56 | |
57 | Do |
58 | |
59 | Locate 1 , 1 |
60 | Lcd "Signal:" |
61 | Locate 1 , 15 |
62 | Lcd "ms" |
63 | 'Locate 2 , 1 |
64 | 'Lcd Rc_value |
65 | Value = Rc_value / 8000 |
66 | Signal = Fusing(value , "#.##") |
67 | Locate 1 , 11 |
68 | Lcd Signal |
69 | |
70 | Calc = Value * 100 |
71 | Servowert_1 = Calc - 50 |
72 | Servo(1) = Servowert_1 |
73 | |
74 | Locate 2 , 1 |
75 | Lcd Servowert_1 |
76 | |
77 | If Value > 1.5 Then |
78 | Motor1 = 1 |
79 | Motor2 = 0 |
80 | Else |
81 | Motor1 = 0 |
82 | Motor2 = 1 |
83 | End If |
84 | |
85 | Loop |
86 | End |
87 | |
88 | |
89 | |
90 | '#################################################### |
91 | |
92 | |
93 | Rc_read: |
94 | If Reading = 0 Then |
95 | Start Timer1 |
96 | Reading = 1 |
97 | |
98 | Else |
99 | Stop Timer1 |
100 | Rc_value = Timer1 |
101 | Timer1 = 0 |
102 | Reading = 0 |
103 | End If |
104 | Return |
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.
Ist doch alles viel zu kompliziert. Schreibe einfach am Anfang deines Programms Biwait Pind.2, Reset Dies sollte vor dem Config Int0 = Change stehen.
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 |
14 | If Value > 1.9 And Status = 3 |
15 | |
16 | |
17 | Value_old = Signalstufe |
18 | |
19 | |
20 | Select Case Status |
21 | |
22 | Case 1 |
23 | Locate 1 , 1 |
24 | Lcd "Klappen zu " |
25 | Locate 2 , 1 |
26 | Lcd "Hebel drin " |
27 | |
28 | Case 22 |
29 | Locate 1 , 1 |
30 | Lcd "Klappen auf " |
31 | Locate 2 , 1 |
32 | Lcd "Hebel aus " |
33 | |
34 | Case 21 |
35 | Locate 1 , 1 |
36 | Lcd "Klappen offen " |
37 | Locate 2 , 1 |
38 | Lcd "Motor aus " |
39 | |
40 | Case 3 |
41 | Locate 1 , 1 |
42 | Lcd "Klappen offen " |
43 | Locate 2 , 1 |
44 | Lcd "Motor ein " |
45 | End Select |
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. ...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.