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?
@ 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
indem du das Lauflicht im Timer laufen lässt und aus einem anderen Programmteil, z.B. in der Mainloop Deinen Wert ausliest.
Gibt es dafür eine Fertige Funktion in oder muss ich mir das selber ausdenken
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.
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 |
@Sebastian (Gast)
>Hier ist mein Programm das gut Funktioniert:
Und wo ist dann das Problem?
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.
@ 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?
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.
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 |
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.