- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 22

Thema: Mit Taster von einem Loop zum nächsten springen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    23.12.2013
    Beiträge
    21
    Danke für den Code...

    Code:
    $regfile = "attiny13.dat"
    $crystal = 1200000
    $hwstack = 34                                               '### hwstack vergrößern. Wichtig bei Verwendung von Interrupts
    $swstack = 10
    $framesize = 10
    
    Config Portb.1 = Output
    Config Portb.2 = Output
    Config Portb.3 = Output
    Config Portb.4 = Output
    Config Pinb.0 = Input
    
    
    Dim Anzahlmodi As Integer
    Dim Modus As Byte
    
    Modus = 1
    Anzahlmodi = 3
    
                                                                '### Alle Variablen können als Byte deklariert werden (spart Speicher im kleinen Tiny13)
    
                                                                '### Der Timer0 wird für die Blink- bzw. Schaltfrequenz konfiguriert
    
    Compare0a = 116                                             '99,84ms Interruptperiode bei 1,2MHz µC-Takt
    Config Timer0 = Timer , Prescale = 1024 , Clear_timer = 1   'Timer0 im Clear Timer on Comparematch
    
    On Compare0a Isr_blink                                      'ISR wird bei Compare Match A aufgerufen
    
                                                                '### In der Haupschleife steht nur die Tastenabfrage inclusive Tastenentprellung
    
    Do                                                          'Beginn Hauptschleife
      Debounce Pinb.0 , 1 , Changemodus , Sub                   'Führt Unterprogramm aus, wenn Pinb.0 auf 1 wechselt
    Loop                                                        'Ende Hauptschleife
    
                                                                '### Nach Tastendruck wird dieses Unterprogramm ausgeführt, daß den Lichteffekt weiterschaltet und
                                                                '### die nötigen Parameter für die Interruptserviceroutine setzt.
    
    Changemodus:                                                'Unterprogramm setzt Werte für Lichteffekt nach Tastendruck
      Disable Compare0a                                         'Vermeidet Inkonsistenzen in der ISR
      If Modus < Anzahlmodi Then Incr Modus Else Modus = 1
      Select Case Modus
        Case 1 : Anzahlphasen = 0                               'Muß Anzahl der Daten in den DATA-Zeilen entsprechen
        Case 2 : Anzahlphasen = 5                               'Wert von 0 = ein Eintrag, 5 = sechs Einträge bei DATA
        Case 3 : Anzahlphasen = 1                               '.
      End Select
      Phase = 0
      Enable Compare0a
    Return
    
    
                                                                '### In der Interruptserviceroutine wird alle 100ms das neue Schaltmuster für die LEDs gelesen und
                                                                '### die LEDs geschaltet.
    
    Isr_blink:                                                  'wird alle ca. 100ms aufgerufen und schaltet die LEDs
      If Phase < Anzahlphasen Then Incr Phase Else Phase = 0    'setzt die nächste Effektphase
      Select Case Modus                                         'entsprechend dem Modus wird das Bitmuster für LEDs geholt
        Case 1 : Pattern = Lookup(phase , Lichteffekt1)
        Case 2 : Pattern = Lookup(phase , Lichteffekt2)
        Case 3 : Pattern = Lookup(phase , Lichteffekt3)
      End Select
      Portb.1 = Pattern.3                                       'LED wird geschaltet
      Portb.2 = Pattern.2                                       'LED wird geschaltet
      Portb.3 = Pattern.1                                       'LED wird geschaltet
      Portb.4 = Pattern.0                                       'LED wird geschaltet
    Return
    End                                                         'end program
    
    
                                                                '### Hier sind die Schaltmuster abgelegt.
    
    Lichteffekt1:
    Data &B0000
    
    Lichteffekt2:
    Data &B1010 , &B1001 , &B1010 , &B0101 , &B0110 , &B0101
    
    Lichteffekt3:
    Data &B1111 , &B0000

    Hab ich da was falsch kopiert? Folgende Fehlermeldung kommt. Klicke auf die Grafik für eine größere Ansicht

Name:	Unbenannt.PNG
Hits:	5
Größe:	12,3 KB
ID:	29136


    Code:
    Compare0a = 116                                             '99,84ms Interruptperiode bei 1,2MHz µC-Takt
    Config Timer0 = Timer , Prescale = 1024 , Clear_timer = 1   'Timer0 im Clear Timer on Comparematch
    
    On Compare0a Isr_blink                                      'ISR wird bei Compare Match A aufgerufen
    Und könntest du mir diesen Bereich etwas genauer erklären?

    Gruß Glenn

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Das könnte daran liegen, dass Du die Variablen Phase und Anzahlphase nicht dimensioniert hast.

    Du kannst eine Variable zwar nennen wie Du willst - aber damit Bascom vernünftig mit den Variablen arbeiten kann muss es wissen, um was für einen Typ von Variable es sich handelt. Das ist die Geschichte mit "Dim XY as Bit (bzw. byte, Integer o.ä.).

    Ein Bit ist die kleinste Einheit und kann nur die Werte 1 oder 0 annehmen. Ideal also, um einen Zustand wie "ein/aus" zu speichern.
    Ein Byte sind 8 Bits und kann Werte zwischen 0 und 255 darstellen (keine negativen Zahlen!)
    Ein Word sind zwei Bytes und kann Werte zwischen 0 und 65535 darstellen (ebenfalls nur positive Zahlen)
    Ein Integer sind auch zwei Bytes, diese Variable kann aber Werte zwischen -32768 und +32767 annehmen.

    Und dann gibts noch DWord, Single, Double, Long und String, aber die brauchst Du hier erstmal nicht. Wie Searcher ja schon in seinem Codevorschlag auskommentiert hat, kann man für Deine Anwendung alle Variablen als Byte dimensionieren, um Speicherplatz zu sparen.

    Der langen Rede kurzer Sinn:

    Wenn Du irgendwo in Deinem Programm Variablen einsetzt, musst Du sie vorher dimensioniert haben.
    In Deinem Fall fehlen also irgendwo die Zeilen

    Dim Phase as Byte
    Dim Anzahlphase as Byte

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Zitat Zitat von Bow-Hunter Beitrag anzeigen
    Hab ich da was falsch kopiert? Folgende Fehlermeldung kommt.
    Hallo Glenn, hat Sauerbruch schon erläutert. Die Deklarationen der Variablen könnte so aussehen (und es könnten immer noch welche fehlen?):
    Code:
     '### Alle Variablen können als Byte deklariert werden (spart Speicher im kleinen Tiny13)
    .
    .
    Dim Anzahlmodi As Byte
    Dim Modus As Byte
    Dim Anzahlphasen as Byte
    Dim Phase as Byte
    
    Modus = 1
    Anzahlmodi = 3
    .
    .

    Code:
    Compare0a = 116                                             '99,84ms Interruptperiode bei 1,2MHz µC-Takt
    Config Timer0 = Timer , Prescale = 1024 , Clear_timer = 1   'Timer0 im Clear Timer on Comparematch
    
    On Compare0a Isr_blink                                      'ISR wird bei Compare Match A aufgerufen
    Und könntest du mir diesen Bereich etwas genauer erklären?
    Mit dem Config Timer0 Kommando wird der Timer in den Clear Timer on Compare Match Mode gebracht. Erklärt im RN Wiki http://rn-wissen.de/wiki/index.php/T..._Match_mode.29 (und im Datenblatt zum Tiny13 ). Compare0a=116 setzt das OCR0A Register, so daß der Timer0 nach 116 Schritten wieder bei 0 an zu zählen fängt. Der Presacaler 1024 sorgt dafür, das der Timer mit 1/1024stel des Systemtaktes läuft. Er läuft also mit 1200000Hz/1024 = 1171,875Hz, braucht also für einen Schritt 1/1171,875Hz = 0,000853s. Für 116 (OCR0A) Schritte plus 1 = 117 * 0,000853s = 0,099801s.
    Der Timer läuft also in knapp 100ms von 0 auf 116 (116Schritte) dann wieder auf 0 (117ter Schritt) und erzeugt jedesmal wenn er auf 116 ist einen ComparematchA Interrupt.
    Mit On Compare0a Isr_blink werden also alle ca 100ms die LEDs geschaltet. Der Code ist nicht ganz vollständig. Es fehlt noch "Enable Compare0a" und "Enable Interrupts" direkt nach "On Compare0a .."

    Dadurch, daß die ISR (Interrupt Service Routine) immer nur alle 100ms die LEDs schaltet, kann ein Druck auf die Taste erst nach maximal 125ms - aber nicht länger - sichtbar werden. (100ms wg. Interruptfrequenz und 25ms Verzögerung durch die Debounce Routine). Falls da was stört, könnte man sich noch was überlegen...

    Gruß und hoffentlich klappts
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    23.12.2013
    Beiträge
    21
    Hab das "Dim Pattern As Byte" vergessen.
    Jetzt funktioniert alles einwandfrei. Vielen Dank für die Tatkräftige Unterstützung.
    Hätte das so nie herausgefunden.

    Finaler Code:
    Code:
    $regfile = "attiny13.dat"
    $crystal = 1200000
    $hwstack = 34                                               '### hwstack vergrößern. Wichtig bei Verwendung von Interrupts
    $swstack = 10
    $framesize = 10
    
    Config Portb.1 = Output
    Config Portb.2 = Output
    Config Portb.3 = Output
    Config Portb.4 = Output
    Config Pinb.0 = Input
    
    
    Dim Anzahlmodi As Byte
    Dim Modus As Byte
    Dim Anzahlphasen as Byte
    Dim Phase As Byte
    Dim Pattern As Byte
    
    Modus = 1
    Anzahlmodi = 3
    
                                                                '### Alle Variablen können als Byte deklariert werden (spart Speicher im kleinen Tiny13)
    
                                                                '### Der Timer0 wird für die Blink- bzw. Schaltfrequenz konfiguriert
    
    Compare0a = 116                                             '99,84ms Interruptperiode bei 1,2MHz µC-Takt
    Config Timer0 = Timer , Prescale = 1024 , Clear_timer = 1   'Timer0 im Clear Timer on Comparematch
    
    On Compare0a Isr_blink
    
    Enable Compare0a
    
    Enable Interrupts                                    'ISR wird bei Compare Match A aufgerufen
    
                                                                '### In der Haupschleife steht nur die Tastenabfrage inclusive Tastenentprellung
    
    Do                                                          'Beginn Hauptschleife
      Debounce Pinb.0 , 1 , Changemodus , Sub                   'Führt Unterprogramm aus, wenn Pinb.0 auf 1 wechselt
    Loop                                                        'Ende Hauptschleife
    
                                                                '### Nach Tastendruck wird dieses Unterprogramm ausgeführt, daß den Lichteffekt weiterschaltet und
                                                                '### die nötigen Parameter für die Interruptserviceroutine setzt.
    
    Changemodus:                                                'Unterprogramm setzt Werte für Lichteffekt nach Tastendruck
      Disable Compare0a                                         'Vermeidet Inkonsistenzen in der ISR
      If Modus < Anzahlmodi Then Incr Modus Else Modus = 1
      Select Case Modus
        Case 1 : Anzahlphasen = 0                               'Muß Anzahl der Daten in den DATA-Zeilen entsprechen
        Case 2 : Anzahlphasen = 5                               'Wert von 0 = ein Eintrag, 5 = sechs Einträge bei DATA
        Case 3 : Anzahlphasen = 1                               '.
      End Select
      Phase = 0
      Enable Compare0a
    Return
    
    
                                                                '### In der Interruptserviceroutine wird alle 100ms das neue Schaltmuster für die LEDs gelesen und
                                                                '### die LEDs geschaltet.
    
    Isr_blink:                                                  'wird alle ca. 100ms aufgerufen und schaltet die LEDs
      If Phase < Anzahlphasen Then Incr Phase Else Phase = 0    'setzt die nächste Effektphase
      Select Case Modus                                         'entsprechend dem Modus wird das Bitmuster für LEDs geholt
        Case 1 : Pattern = Lookup(phase , Lichteffekt1)
        Case 2 : Pattern = Lookup(phase , Lichteffekt2)
        Case 3 : Pattern = Lookup(phase , Lichteffekt3)
      End Select
      Portb.1 = Pattern.3                                       'LED wird geschaltet
      Portb.2 = Pattern.2                                       'LED wird geschaltet
      Portb.3 = Pattern.1                                       'LED wird geschaltet
      Portb.4 = Pattern.0                                       'LED wird geschaltet
    Return
    End                                                         'end program
    
    
                                                                '### Hier sind die Schaltmuster abgelegt.
    
    Lichteffekt1:
    Data &B0000
    
    Lichteffekt2:
    Data &B1010 , &B1001 , &B1010 , &B0101 , &B0110 , &B0101
    
    Lichteffekt3:
    Data &B1111 , &B0000

    Hab mal meinen Verwendungszweck gefilmt...

    https://www.dropbox.com/s/9huyg7qzqg...94432.mp4?dl=0

    So, die eine Baustelle ist fertig, jetzt kommt die Nächste...

    https://www.roboternetz.de/community...trom-An-Aus%29

Ähnliche Themen

  1. Drei Led´s mit einem Taster unabhängig von einander schalten
    Von p@ty im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 61
    Letzter Beitrag: 10.07.2014, 12:03
  2. von einem zu anderem springen?
    Von robots4-ever im Forum Software, Algorithmen und KI
    Antworten: 2
    Letzter Beitrag: 08.04.2012, 20:24
  3. Screens wechseln mit 2 Taster (oder mit einem Taster)
    Von tordy im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 14.07.2009, 13:39
  4. 3 Taster von RN-LCD-Adapter mit einem Port abfragen
    Von masabuana im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 20.07.2007, 12:23
  5. Von Unterprogramm zum Hauptprogrammanfang springen
    Von Hübi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 06.02.2007, 18:15

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test