mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Lösungsansatz Drehgeber mit Bascom


Autor: Thomas Kiss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jungs, ich bräuchte mal einige Gedankenanstösse.

Ich habe folgendes vor. ( bereits einiges durchgelesen und umgesetzt )

Ich möchte mit einem Encoder ( Pollin mit Taster ) 3 verschiedene Werte 
einstellen.

Wert A
Wert B
Wert C

Die aktuelle Daten vom Drehgeber ( Auswertung vom Peter ) möchte die 
Werte A.B,C zuweisen, wenn der Taster gedrück wird...

Also Wert A encoder drehen, Tastdrücken, Wert B einstellen Taster..

Ich habe bereits folgendes an Auswertung gebastellt:

$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 32
$framesize = 100


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

'System-Timer für periodische Encoder-Abfrage
Config Timer0 = Timer , Prescale = 256
On Timer0 Isr_timer0
Enable Timer0
Const Timer0_reload = 224                                   'Wert für 
1ms


Dim Rotary0 As Byte                'Phasenzustand des Drehencoders
Dim Rotary1 As Byte                'Zähler der Phasenwechsel
Dim Rotary2 As Byte                'Hilfsvariable
Dim Rotary As Byte                 'Encoder-Wert

Dim Rotary_last As Byte             'Letzter Encoder-Wert (nur für Demo)

Declare Sub Encoder2()          'Routine zur Anpassung des 
ENCODER-Befehls

Enable Interrupts

Do
   Call Encoder2()
   If Rotary_last <> Rotary Then
      Rotary_last = Rotary
      Print Rotary
   End If

Locate 1 , 1
Lcd Rotary
Locate 2 , 1
Lcd Rotary1

Loop
End

Isr_timer0:
   Timer0 = Timer0_reload
   Rotary0 = Encoder(pinc.0 , Pinc.1 , Links , Rechts , 0)
Return

Rechts:                                'Bei Rechtsdrehung
   Rotary1 = Rotary1 + 1               'Zählvariable Phasenwechsel 
erhöhen
Return

Links:                               'Bei Linksdrehung
   Rotary1 = Rotary1 - 1           'Zählvariable Phasenwechsel 
vermindern
Return

***   Routine zur Anpassung des ENCODER-Befehls an POLLIN Drehencoder

Sub Encoder2()
   Disable Interrupts
   Rotary2 = Rotary1            'Zählvariable Phasenwechsel kopieren
   Rotary1 = Rotary1 And 1      'Ggf.Phasenwechsel zwischen Rastungen 
stehenlassen
   push r0                      'BASCOM kann kein arithmetisches 
Rechtsschieben
   lds r0,{rotary2}             'Aber der AVR kanns!
   asr r0                       'ASR= Rechtsschieben mit Berücksichtigen
   sts {rotary2},r0             'des Vorzeichens, also teilen durch 2
   pop r0                       'eines signed byte
   Rotary = Rotary + Rotary2    'Encoder-Wert um Anzahl Rastungen 
erhöhen/vermindern
   Enable Interrupts
End Sub

Return

Autor: screwdriver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi thomaskiss,

ich habe mal deinen Code überarbeitet und um ein paar Passagen ergänzt. 
Das sollte dann jetzt mal eine funktionierende Diskussionsgrundlage 
sein. (Habs aber nicht testen können)

screwdriver

$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 32
$framesize = 100


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

'System-Timer für periodische Encoder-Abfrage
Config Timer0 = Timer , Prescale = 256
On Timer0 Isr_timer0
Enable Timer0
Const Timer0_reload = 224                                   'Wert für 1ms

Config Pinc.1 = Input : Set Portc.1                         'EncoderA, PullUp aktiviert
Config Pinc.2 = Input : Set Portc.2                         'EncoderB, PullUp aktiviert
Config Pinc.3 = Input : Set Portc.3                         'Encoder Taste, PullUp aktiviert

Dim Rotary0 As Byte                                         'Phasenzustand des Drehencoders
Dim Rotary1 As Byte                                         'Zähler der Phasenwechsel
Dim Rotary2 As Byte                                         'Hilfsvariable
Dim Rotary As Byte                                          'Encoder-Wert
Dim Rotary$ As String * 16                                  'Encoder-Wert als String

Dim Rotary_last As Byte                                     'Letzter Encoder-Wert (nur für Demo)

Dim Wert_a As Byte                                          'Menu Variable
Dim Wert_a$ As String * 3

Declare Sub Encoder2()                                      'Routine zur Anpassung des ENCODER-Befehls

Enable Interrupts

Do
   Call Encoder2()
   If Rotary_last <> Rotary Then
      Rotary_last = Rotary
      Rotary$ = Str(rotary)
      Rotary$ = Format(rotary$ , "  0")
   End If

   If Pinc.3 = 0 Then
      Wert_a = Rotary
      Wert_a$ = Str(wert_a)
      Wert_a$ = Format(wert_a$ , "  0")
   End If

   Locate 1 , 1
   Lcd Rotary$
   Locate 2 , 1
   Lcd Wert_a$

Loop
End

Isr_timer0:
   Timer0 = Timer0_reload
   Rotary0 = Encoder(pinc.0 , Pinc.1 , Links , Rechts , 0)
Return

Rechts:                                                     'Bei Rechtsdrehung
   Rotary1 = Rotary1 + 1                                    'Zählvariable Phasenwechsel erhöhen
Return

Links:                                                      'Bei Linksdrehung
   Rotary1 = Rotary1 - 1                                    'Zählvariable Phasenwechsel vermindern
Return

'***   Routine zur Anpassung des ENCODER-Befehls an POLLIN Drehencoder

Sub Encoder2()
   Disable Interrupts
   Rotary2 = Rotary1                                        'Zählvariable Phasenwechsel kopieren
   Rotary1 = Rotary1 And 1                                  'Ggf.Phasenwechsel zwischen Rastungen stehenlassen
   push r0                                                  'BASCOM kann kein arithmetisches Rechtsschieben
   lds r0,{rotary2}                                         'Aber der AVR kanns!
   asr r0                                                   'ASR= Rechtsschieben mit Berücksichtigen
   sts {rotary2},r0                                         'des Vorzeichens, also teilen durch 2
   pop r0                                                   'eines signed byte
   Rotary = Rotary + Rotary2                                'Encoder-Wert um Anzahl Rastungen erhöhen/vermindern
   Enable Interrupts
End Sub

Return

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.