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


von Thomas Kiss (Gast)


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

von Achim M. (minifloat)


Lesenswert?

Hi
Pseudo-Basic:
1
do
2
3
   if Pin=High then
4
      begin Unterprogramm_Pin_hi
5
         'Tue dieses
6
      end Unterprogramm_Pin_hi
7
   end if
8
9
   if Pin=Low then
10
      begin Unterprogramm_Pin_lo
11
         'Tue jenes
12
      end  Unterprogramm_Pin_lo
13
   end if
14
15
loop
mfg mf

von Thomas Kiss (Gast)


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

von Thomas Kiss (Gast)


Lesenswert?

Hat niemand eine Idee ?

von Roland P. (pram)


Lesenswert?

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

Gruß
Roland

von Anmerker (Gast)


Lesenswert?

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

von Tom M. (tomm) Benutzerseite


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!

von Helfer (Gast)


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.

von Thomas Kiss (Gast)


Lesenswert?

Danke hat mir schon geholfen !!

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.