Forum: Mikrocontroller und Digitale Elektronik Status abfragen, bevor es ins Hauptprogramm geht / BASCOM


von Peter (Gast)


Lesenswert?

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

von Glaskugel (Gast)


Lesenswert?

>>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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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

von BASCOM möger (Gast)


Lesenswert?

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.

von mue-c (Gast)


Lesenswert?

Ist doch alles viel zu kompliziert.
Schreibe einfach am Anfang deines Programms

Biwait Pind.2, Reset

Dies sollte vor dem Config Int0 = Change stehen.

von Peter (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.