Forum: Mikrocontroller und Digitale Elektronik Trennmittel für Programm gesucht


von Nette M. (nette-mann)


Lesenswert?

$regfile = "m8def.dat"
$crystal = 4000000
Config Timer1 = Timer , Prescale = 64
Config Portc = Output
Config Portd.4 = Output
Led Alias Portc.0
Led2 Alias Portc.1
Led3 Alias Portc.2
Led4 Alias Portc.3
Led5 Alias Portc.4
Led6 Alias Portc.5
Led7 Alias Portd.4
   Led = 0
   Led7 = 0
   Led3 = 0
   Led2 = 0
   Led4 = 0
   Led5 = 0
   Led6 = 0

Dim A As Single
Dim B As Bit
Dim C As Bit
Dim B1 As Bit
Dim C1 As Bit
Config Portd.2 = Input
Config Portd.3 = Input
On Timer1 Timer_irq

 Config Int0 = Rising
 Config Int1 = Rising

Const Timervorgabe = 39886
Portd.2 = 1
Portd.3 = 1
Enable Timer1
Enable Interrupts
 Enable Int0
 Enable Int1
 On Int0 Isr_von_int0
 On Int1 Isr_von_int1


Do
If B = 0 Then
Gosub Sub1
Elseif C = 0 Then
 Gosub Sub3
Else
Gosub Sub4
End If
Loop

Sub1:
If A = 2 Then
   Toggle Led
   Toggle Led2
   Toggle Led3
   Toggle Led4
   Led7 = 0
A = 0
End If
If A = 0 Then
   Led7 = 1
End If
Return

Sub2:
   Led = 0
   Led7 = 0
   Led3 = 0
   Led2 = 0
   Led4 = 0
   Led5 = 0
   Led6 = 0
Return

Sub3:
If A = 2 Then
   Toggle Led
   Toggle Led4
   Toggle Led6
A = 0
End If
If A = 0 Then
   Led7 = 1
End If
Return

Sub4:
If A = 2 Then
   Toggle Led
   Toggle Led4
   Toggle Led7
A = 0
End If
If A = 0 Then
   Led7 = 1
End If
Return


Timer_irq:
  Timer1 = Timervorgabe
        Incr A
   Return

Isr_von_int0:
  If B = 1 Then
  Reset B
  Else
  Set B
  End If
 Return

Isr_von_int1:
  If C = 1 Then
  Reset C
  Else
  Set C
  End If
 Return


Hab momentan das Problem das sich 2 Schleifen überlagern und komm nicht 
auf die Lösung. Ich hoffe ihr könnt helfen

von oldmax (Gast)


Lesenswert?

Hi
Soviel wie ich von Basic verstehe, sehe ich nur eine Schleife, do -- 
Loop.
Könnt es sein, das ein Elseif  else If heißt?
Gruß oldmax

von oldmax (Gast)


Lesenswert?

Hi
Hab nochmal drübergeschaut. Vermutlich meinst du, das die ISR_Int0 die 
Variable B und ISR_Int1 C die VAriable C beackert. In der Hauptschleife 
kommt dann das besagte Elseif. Auch wenn Elseif richtig bearbeitet wird, 
ist Cvon B abhängig, d. H. Ist B=0 ist der Wert in C uninteressant. Du 
mußt "Nur" die Variable B bearbeiten (setzen oder löschen) und C in Ruhe 
lassen. Dann genügt ein Else.
 Willst du sowas wie ein Puls-Pausenverhältnis, mußt du einen 
Flankenmerker und zwei Variablen zum Zählen haben. Dann in der ISR in 
Abhängigkeit der Flanke die Zähler bearbeiten. Der Flankenmerker wird in 
der Loop statt B eingesetzt.
Angenommen, B und C sind Integer, dann setzt du einen Flankenmerker und 
die Zählvariablen vor der Hauptschleife auf die Werte.
FM=0
B=200
C=150
dann die ISR

ISR_Int0
 If FM = 1 then
   Dec B
   if B=0 then
     C=150
     FM=0
   endIf
 endif
 If FM=0 then
   Dec C
   If C=0 then
     B=200
     FM=1
   endIf
  endIf
Return  ' return von ISR ! Ich kenn den Syntax nicht
Gruß oldmax

von Nette M. (nette-mann)


Lesenswert?

$regfile = "m8def.dat"
$crystal = 4000000

Config Timer1 = Timer , Prescale = 64
Config Portc = Output
Config Portd.4 = Output
Led Alias Portc.0
Led2 Alias Portc.1
Led3 Alias Portc.2
Led4 Alias Portc.3
Led5 Alias Portc.4
Led6 Alias Portc.5
Led7 Alias Portd.4
   Led = 0
   Led7 = 0
   Led3 = 0
   Led2 = 0
   Led4 = 0
   Led5 = 0
   Led6 = 0
Dim Fm As Single
Dim A As Single
Dim B As Single
Dim C As Bit
Dim D As Bit
Dim C1 As Bit
Config Portd.2 = Input
Config Portd.3 = Input
On Timer1 Timer_irq

 Config Int0 = Rising
 Config Int1 = Rising
B = 350
Const Timervorgabe = 39886
Portd.2 = 1
Portd.3 = 1
Enable Timer1
Enable Interrupts
 Enable Int0
 Enable Int1
 On Int0 Isr_von_int0
 On Int1 Isr_von_int1


Do
If B = 100 Then
   Led = 0
   Led7 = 0
   Led3 = 0
   Led2 = 0
   Led4 = 0
   Led5 = 0
   Led6 = 0
   Toggle Led
   Toggle Led2
   Toggle Led3
   Toggle Led4
   Led7 = 0
   A = 0
End If

If B = 200 Then
   Led = 0
   Led7 = 0
   Led3 = 0
   Led2 = 0
   Led4 = 0
   Led5 = 0
   Led6 = 0
   End If
If B = 350 Then
   Led = 0
   Led7 = 0
   Led3 = 0
   Led2 = 0
   Led4 = 0
   Led5 = 0
   Led6 = 0
   Toggle Led
   Toggle Led4
   Toggle Led6
End If
If B = 400 Then
   Led = 0
   Led7 = 0
   Led3 = 0
   Led2 = 0
   Led4 = 0
   Led5 = 0
   Led6 = 0
   Toggle Led
   Toggle Led4
   Toggle Led7
End If

Loop

Timer_irq:
  Timer1 = Timervorgabe
        Incr A
   Return

Isr_von_int0:
If C = 0 Then
Set C
Else
Reset C
End If
If C = 0 Then
B = 400
Else
B = 350
End If
Return

Isr_von_int1:
If D = 0 Then
Set D
Else
Reset D
End If
If D = 0 Then
B = 200
Else
B = 100
End If
Return


So gehts nu nur noch die LEDs richtig zu ordnen und mit Case arbeiten

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.