Forum: Mikrocontroller und Digitale Elektronik Bascom Softwareinterrupts


von Sebastian (Gast)


Lesenswert?

Hallo
Ich habe mir eine kleine Schaltung mit einem Mega8 gebaut weil ich 
kapazitive Touchschalter für ein anderes Projekt einsetzen will und das 
vorher testen wollte.
Der Schalter besteht aus einem 1,5nf Kondensator und einem Stück Draht. 
Das funktionier auf super. Ich wollte mit dem Sensor ein Lauflicht ein 
und aus schalten. (Also einmal drücken ein nochmal drücken aus.)
Einschalten ist auch keine Problem aber ich kann es nicht mehr 
ausschalten weil ich während das Lauflicht läuft den Touchsensor nicht 
auslesen kann.
Normalerweise würde ich das einfach mit Interrupts machen, aber das geht 
nicht weil ich ja keinen Pin auslesen will sondern einen Wert überwachen 
muss. Wenn der unter einen bestimmten Wert fällt soll ein Interrupt 
ausgelöst werden.
Ich habe keine Möglichkeit gefunden in Bascom Softwareinterrupts zu 
machen.
Wie kann ich das sonst lösen?

von Falk B. (falk)


Lesenswert?

@  Sebastian (Gast)

>Wie kann ich das sonst lösen?

Mit dem richtigen Programmkonzept. Du musst bei der Bearbeitung des 
Lauflichts immer auch mal den Taster abfragen. Siehe Multitasking.

MFG
Falk

von weinbauer (Gast)


Lesenswert?

indem du das Lauflicht im Timer laufen lässt und
aus einem anderen Programmteil, z.B. in der
Mainloop Deinen Wert ausliest.

von Sebastian (Gast)


Lesenswert?

Gibt es dafür eine Fertige Funktion in  oder muss ich mir das selber 
ausdenken

von M. K. (sylaina)


Lesenswert?

Sebastian schrieb:
> Wenn der unter einen bestimmten Wert fällt soll ein Interrupt
> ausgelöst werden.

Heißt das, dass du deinen kapazitiven Sensor mittels ADC ausließt?

Einen SW-Interrupt könnte man recht simpel mittels Timer realisieren. Je 
nach Tasterwert wird der Timer0 z.B. vorgeladen. Mit dem einen Wert 
sorgt man dann dafür, dass der Timer überläuft und schwubbs hast du 
deinen Interrupt ;). Nur mal so als Beispiel aus dem Stehgreif. Andere 
Varianten sind sicher auch möglich.

von Sebastian (Gast)


Lesenswert?

Michael Köhler schrieb:
> Heißt das, dass du deinen kapazitiven Sensor mittels ADC ausließt?

Nein, ich verwende diese Methode: 
http://www.elektronik-labor.de/AVR/Touch.html


Hier ist mein Programm das gut Funktioniert:
1
$regfile = "m8def.dat"
2
$crystal = 8000000
3
4
5
Led1 Alias Portc.4
6
Config Led1 = Output
7
8
Led2 Alias Portd.2
9
Config Led2 = Output
10
11
Led3 Alias Portc.5
12
Config Led3 = Output
13
14
Led4 Alias Portd.3
15
Config Led4 = Output
16
17
Led5 Alias Portd.0
18
Config Led5 = Output
19
20
Led6 Alias Portd.4
21
Config Led6 = Output
22
23
Led7 Alias Portd.1
24
Config Led7 = Output
25
26
Led8 Alias Portd.5
27
Config Led8 = Output
28
29
30
Dim D As Integer
31
Dim T As Bit
32
Dim Sens As Integer
33
34
Sens = 95
35
36
Do
37
38
   D = 0
39
   For D = 1 To 1500
40
   Ddrb.0 = 0                                               'B3 hochohmig
41
   Portd.7 = 1                                              'B4 high
42
   Ddrd.7 = 1                                               'B4 niederohmig
43
   If Pinb.0 = 0 Then Exit For                              'B3 low?
44
   Ddrd.7 = 0                                               'B4 hochohmig
45
   Portd.7 = 0                                              'ohne Pullup
46
   Ddrb.0 = 1                                               'B3 low
47
   Next D
48
   Portb.0 = 0
49
   Portd.7 = 0
50
   Ddrb.0 = 1
51
   Ddrd.7 = 1
52
53
   If D < Sens Then
54
      T = 1
55
      Waitms 100
56
   End If
57
58
   If D < Sens And T = 1 Then
59
      Toggle Led1
60
      T = 0
61
   End If
62
63
Loop
64
65
End

von Falk B. (falk)


Lesenswert?

@Sebastian (Gast)

>Hier ist mein Programm das gut Funktioniert:

Und wo ist dann das Problem?

von Sebastian (Gast)


Lesenswert?

Das ich nicht eine LED ein und auschalten will sondern ein Lauflicht, 
und während der code für das Lauflicht läuft kann ich den Zustand vom 
Sensor nicht überwachen, also kann ich das Lauflicht nicht mehr 
ausschalten.

von Falk B. (falk)


Lesenswert?

@  Sebastian (Gast)

>Das ich nicht eine LED ein und auschalten will sondern ein Lauflicht,
>und während der code für das Lauflicht läuft kann ich den Zustand vom
>Sensor nicht überwachen, also kann ich das Lauflicht nicht mehr
>ausschalten.

Ähhh, und dir ist TROTZ der Hinweise es nicht möglich, dein Programm 
abzuändern? Dann hast du das Programm nur kopiert, ohne einen Funken zu 
verstehen, nicht wahr?

von Sebastian (Gast)


Lesenswert?

Das Programm verstehe ich schon und ich habe auch schon den Rest fast 
gehabt nur hat wenn ich ausgeschalten habe irgend eine Led immer 
geleuchtet. Ich brauche nur einen Ansatz bzw. ein Beispiel wie man das 
am einfachsten macht. Über Multitasking in Bascom habe ich nichts 
sinnvolles gefunden.

von Falk B. (falk)


Lesenswert?

So in etwa.
1
$regfile = "m8def.dat"
2
$crystal = 8000000
3
4
Led1 Alias Portc.4
5
Config Led1 = Output
6
7
Led2 Alias Portd.2
8
Config Led2 = Output
9
10
Led3 Alias Portc.5
11
Config Led3 = Output
12
13
Led4 Alias Portd.3
14
Config Led4 = Output
15
16
Led5 Alias Portd.0
17
Config Led5 = Output
18
19
Led6 Alias Portd.4
20
Config Led6 = Output
21
22
Led7 Alias Portd.1
23
Config Led7 = Output
24
25
Led8 Alias Portd.5
26
Config Led8 = Output
27
28
Dim D As Integer
29
Dim T As Bit
30
Dim T_alt As Bit
31
Dim Led_go As Bit
32
Dim Sens As Integer
33
Dim Led_cnt As Integer
34
35
Sens = 95
36
Led_cnt = 0
37
38
' Endlose Hauptschleife
39
40
Do
41
42
   Gosub Taste                                              ' Sensortaste messen
43
44
   If T = 1 And T_alt = 0 Then                              'Steigende Flanke prüfen
45
      Toggle Led_go                                         ' LED Steuerung ein/aus schalten
46
   End If
47
   T_alt = T
48
49
   If Led_go = 1 Then
50
      Gosub Lauflicht
51
   End If
52
53
   Waitms 100
54
55
Loop
56
57
End
58
59
' Sensortaste auslesen
60
61
Taste:
62
   D = 0
63
   For D = 1 To 1500
64
      Ddrb.0 = 0                                            'B3 hochohmig
65
      Portd.7 = 1                                           'B4 high
66
      Ddrd.7 = 1                                            'B4 niederohmig
67
      If Pinb.0 = 0 Then
68
         Exit For
69
      End If                                                'B3 low?
70
      Ddrd.7 = 0                                            'B4 hochohmig
71
      Portd.7 = 0                                           'ohne Pullup
72
      Ddrb.0 = 1                                            'B3 low
73
   Next D
74
75
   If D < Sens Then
76
      T = 1
77
   Else
78
      T = 0
79
   End If
80
81
   Portb.0 = 0
82
   Portd.7 = 0
83
   Ddrb.0 = 1
84
   Ddrd.7 = 1
85
86
Return
87
88
' Lauflicht laufen lassen
89
90
Lauflicht:
91
92
   Led_cnt = Led_cnt + 1
93
   If Led_cnt = 9 Then
94
      Led_cnt = 1
95
   End If
96
97
   Select Case Led_cnt
98
      Case 1 : Led8 = 0
99
                Led1 = 1
100
101
      Case 2 : Led1 = 0
102
                Led2 = 1
103
104
      Case 3 : Led2 = 0
105
                Led3 = 1
106
107
      Case 4 : Led3 = 0
108
                Led4 = 1
109
110
      Case 5 : Led4 = 0
111
                Led5 = 1
112
113
      Case 6 : Led5 = 0
114
                Led6 = 1
115
116
      Case 7 : Led6 = 0
117
                Led7 = 1
118
119
      Case 8 : Led7 = 0
120
                Led8 = 1
121
122
   End Select
123
124
Return

von Sebastian (Gast)


Lesenswert?

Vielen Dank, damit kann ich etwas anfangen.

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.