www.mikrocontroller.net

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


Autor: Nette Mann (nette-mann)
Datum:

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

Autor: oldmax (Gast)
Datum:

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

Autor: oldmax (Gast)
Datum:

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

Autor: Nette Mann (nette-mann)
Datum:

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

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.