mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie unterbreche ich ein Programm ?


Autor: Thomas Kiss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jungs habe eine BASCOM Frage.

Ich muss folgendes umsetzen:

ein Umschalter sitzt an einem Port. Entweder ist der Port High oder Low 
je nachdem wie der schalter steht.

Wenn der Schalter auf LOW steht dann soll das Programm in der
Do
Loop

schleife bleiben

wenn der Schalter High ist dann soll aus der Do-Loop Schleife in einem 
SUB
springen und dort do-loop ausführen bis der Schalter wieder Low geht.

Wie setze ich es um ? Ich grübele schon seit stunden..bitte um ein paar 
Codezeilen..

Danke..

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Pseudo-Basic:
do

   if Pin=High then
      begin Unterprogramm_Pin_hi
         'Tue dieses
      end Unterprogramm_Pin_hi
   end if

   if Pin=Low then
      begin Unterprogramm_Pin_lo
         'Tue jenes
      end  Unterprogramm_Pin_lo
   end if

loop
mfg mf

Autor: Thomas Kiss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie funzt es nicht..ich poste mal was schon fertig ist

'*********************************************************************** 
********
' Schalter an PD.1    High = "Fader"    Low = "Fix"
' 10k-Poti an PC.0
' LED Rot  an PB.1
' LED Grün an PB.2
' LED Blau an PB.3
'*********************************************************************** 
********
$sim
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40

Config Portb.1 = Output                                     'LED Rot
Config Portb.2 = Output                                     'LED Gruen
Config Portb.3 = Output                                     'LED Blau

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm 
= Clear Up , Prescale = 1
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Down , Prescale = 1
Enable Timer1
Enable Timer2
 Start Timer1
 Start Timer2

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Dim Pause As Byte
Dim Speed As Byte
Dim Rwert As Integer
Dim Adc0 As Integer

R Alias Compare1a
G Alias Compare1b
B Alias Ocr2


Config Pind.1 = Input
Portd.1 = 1
Taster1 Alias Pind.1


   Config Lcdpin = Pin , Db7 = Portb.5 , Db6 = Portc.1 , Db5 = Portc.2 , 
_
      Db4 = Portc.3 , E = Portc.4 , Rs = Portc.5
   Config Lcd = 16 * 2
   Cls
   Cursor Off

Do

Pause = 2
Speed = 1

If Taster1 = 0 Then


Do
Incr G
Waitms Speed
Loop Until G = 255
Waitms Pause

Do
Decr R
Waitms Speed
Loop Until R = 0
Waitms Pause

Do
Incr B
Waitms Speed
Loop Until B = 255
Waitms Pause

Do
Decr G
Waitms Speed
Loop Until G = 0
Waitms Pause

Do
Incr R
Waitms Speed
Loop Until R = 255
Waitms Pause

Do
Decr B
Waitms Speed
Loop Until B = 0
Waitms Pause

End If

If Taster1 = 1 Then

Adc0 = Getadc(0)
Rwert = Adc0 / 4

Locate 1 , 1
Lcd Adc0
Locate 2 , 1
Lcd Rwert

R = Rwert
G = 0
B = 0

End If

Loop

Autor: Thomas Kiss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat niemand eine Idee ?

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu viel code, nochh dazu nicht eingerückt (code-tags verwenden)
-> das liest keiner

Gruß
Roland

Autor: Anmerker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...und dann markiere bitte auch gleich diejenige Deiner 1097 Do..Loop 
Schleifen, auf die sich Deine Frage bezieht.. Will sagen: Es fehlen 
Kommentare!

Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Kiss schrieb:
> Config Pind.1 = Input

Ich kenn mich mit BASCOM nicht aus; mir fällt aber auf, dass du hier 
PINx verwendest, um die "Richtung" des Ports zu definieren. Müsste das 
nicht PORTx sein, analog zu der Konfig für die LEDs?

> Portd.1 = 1

Damit aktivierst du den internen pull-up, oder? Kommentare kosten nix 
und sind enorm hilfreich, um ein Programm bzw. die Absichten des Autors 
zu verstehen, was ein Codeblock tun sollte/tut!

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas, ich vermute aus dem Programmcode, du willst im Normalbetrieb 
einen R-Wert einstellen und anzeigen und beim Drücken des active low 
Tasters eine RGB-Animation mit diesem R-Wert ablaufen lassen.

Die Animation läuft dann bei obigem Programmcode einmal ununterbrechbar 
durch. Du kannst dann ca. alle 6 x 255 x (Speed+Pause) ms unterbrechen.

Um die Animation zu unterbrechen und einen neuen R-Wert einzulesen, 
kannst du dein Programm auf verschiedene Arten umstellen.

Einfachste Art: Jeden Block der Animation mit If Taster = 0 kapseln. Du 
unterteilst die große Animation in mehrere kleine. Du kannst dann ca. 
alle 255 x (Speed+Pause) ms unterbrechen.

Kompliziertere Art: Du setzt einen Timer auf. Der pollt regelmäßig den 
Tasterzustand und eventuell den R-Wert. Die Animation verwendet dann ab 
dem aktuellen Animationszustand die neuen Werte. Statt Timer und pollen 
kannst du auch einen externen Interrupt verwenden. Es ist aber 
schwieriger beim externen Interrupt die Entprellung in den Griff zu 
bekommen.

Autor: Thomas Kiss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke hat mir schon geholfen !!

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.