www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom Softwareinterrupts


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: weinbauer (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

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

Autor: M. Köhler (sylaina)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
$regfile = "m8def.dat"
$crystal = 8000000


Led1 Alias Portc.4
Config Led1 = Output

Led2 Alias Portd.2
Config Led2 = Output

Led3 Alias Portc.5
Config Led3 = Output

Led4 Alias Portd.3
Config Led4 = Output

Led5 Alias Portd.0
Config Led5 = Output

Led6 Alias Portd.4
Config Led6 = Output

Led7 Alias Portd.1
Config Led7 = Output

Led8 Alias Portd.5
Config Led8 = Output


Dim D As Integer
Dim T As Bit
Dim Sens As Integer

Sens = 95

Do

   D = 0
   For D = 1 To 1500
   Ddrb.0 = 0                                               'B3 hochohmig
   Portd.7 = 1                                              'B4 high
   Ddrd.7 = 1                                               'B4 niederohmig
   If Pinb.0 = 0 Then Exit For                              'B3 low?
   Ddrd.7 = 0                                               'B4 hochohmig
   Portd.7 = 0                                              'ohne Pullup
   Ddrb.0 = 1                                               'B3 low
   Next D
   Portb.0 = 0
   Portd.7 = 0
   Ddrb.0 = 1
   Ddrd.7 = 1

   If D < Sens Then
      T = 1
      Waitms 100
   End If

   If D < Sens And T = 1 Then
      Toggle Led1
      T = 0
   End If

Loop

End

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sebastian (Gast)

>Hier ist mein Programm das gut Funktioniert:

Und wo ist dann das Problem?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So in etwa.
$regfile = "m8def.dat"
$crystal = 8000000

Led1 Alias Portc.4
Config Led1 = Output

Led2 Alias Portd.2
Config Led2 = Output

Led3 Alias Portc.5
Config Led3 = Output

Led4 Alias Portd.3
Config Led4 = Output

Led5 Alias Portd.0
Config Led5 = Output

Led6 Alias Portd.4
Config Led6 = Output

Led7 Alias Portd.1
Config Led7 = Output

Led8 Alias Portd.5
Config Led8 = Output

Dim D As Integer
Dim T As Bit
Dim T_alt As Bit
Dim Led_go As Bit
Dim Sens As Integer
Dim Led_cnt As Integer

Sens = 95
Led_cnt = 0

' Endlose Hauptschleife

Do

   Gosub Taste                                              ' Sensortaste messen

   If T = 1 And T_alt = 0 Then                              'Steigende Flanke prüfen
      Toggle Led_go                                         ' LED Steuerung ein/aus schalten
   End If
   T_alt = T

   If Led_go = 1 Then
      Gosub Lauflicht
   End If

   Waitms 100

Loop

End

' Sensortaste auslesen

Taste:
   D = 0
   For D = 1 To 1500
      Ddrb.0 = 0                                            'B3 hochohmig
      Portd.7 = 1                                           'B4 high
      Ddrd.7 = 1                                            'B4 niederohmig
      If Pinb.0 = 0 Then
         Exit For
      End If                                                'B3 low?
      Ddrd.7 = 0                                            'B4 hochohmig
      Portd.7 = 0                                           'ohne Pullup
      Ddrb.0 = 1                                            'B3 low
   Next D

   If D < Sens Then
      T = 1
   Else
      T = 0
   End If

   Portb.0 = 0
   Portd.7 = 0
   Ddrb.0 = 1
   Ddrd.7 = 1

Return

' Lauflicht laufen lassen

Lauflicht:

   Led_cnt = Led_cnt + 1
   If Led_cnt = 9 Then
      Led_cnt = 1
   End If

   Select Case Led_cnt
      Case 1 : Led8 = 0
                Led1 = 1

      Case 2 : Led1 = 0
                Led2 = 1

      Case 3 : Led2 = 0
                Led3 = 1

      Case 4 : Led3 = 0
                Led4 = 1

      Case 5 : Led4 = 0
                Led5 = 1

      Case 6 : Led5 = 0
                Led6 = 1

      Case 7 : Led6 = 0
                Led7 = 1

      Case 8 : Led7 = 0
                Led8 = 1

   End Select

Return

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, damit kann ich etwas anfangen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.