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


von Thomas Kiss (Gast)


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

von screwdriver (Gast)


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

1
$regfile = "m8def.dat"
2
$crystal = 16000000
3
$hwstack = 40
4
$swstack = 32
5
$framesize = 100
6
7
8
Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portb.1 , Db5 = Portb.2 , _
9
      Db4 = Portb.3 , E = Portb.4 , Rs = Portb.5
10
Config Lcd = 16 * 2
11
Cls
12
Cursor Off
13
14
'System-Timer für periodische Encoder-Abfrage
15
Config Timer0 = Timer , Prescale = 256
16
On Timer0 Isr_timer0
17
Enable Timer0
18
Const Timer0_reload = 224                                   'Wert für 1ms
19
20
Config Pinc.1 = Input : Set Portc.1                         'EncoderA, PullUp aktiviert
21
Config Pinc.2 = Input : Set Portc.2                         'EncoderB, PullUp aktiviert
22
Config Pinc.3 = Input : Set Portc.3                         'Encoder Taste, PullUp aktiviert
23
24
Dim Rotary0 As Byte                                         'Phasenzustand des Drehencoders
25
Dim Rotary1 As Byte                                         'Zähler der Phasenwechsel
26
Dim Rotary2 As Byte                                         'Hilfsvariable
27
Dim Rotary As Byte                                          'Encoder-Wert
28
Dim Rotary$ As String * 16                                  'Encoder-Wert als String
29
30
Dim Rotary_last As Byte                                     'Letzter Encoder-Wert (nur für Demo)
31
32
Dim Wert_a As Byte                                          'Menu Variable
33
Dim Wert_a$ As String * 3
34
35
Declare Sub Encoder2()                                      'Routine zur Anpassung des ENCODER-Befehls
36
37
Enable Interrupts
38
39
Do
40
   Call Encoder2()
41
   If Rotary_last <> Rotary Then
42
      Rotary_last = Rotary
43
      Rotary$ = Str(rotary)
44
      Rotary$ = Format(rotary$ , "  0")
45
   End If
46
47
   If Pinc.3 = 0 Then
48
      Wert_a = Rotary
49
      Wert_a$ = Str(wert_a)
50
      Wert_a$ = Format(wert_a$ , "  0")
51
   End If
52
53
   Locate 1 , 1
54
   Lcd Rotary$
55
   Locate 2 , 1
56
   Lcd Wert_a$
57
58
Loop
59
End
60
61
Isr_timer0:
62
   Timer0 = Timer0_reload
63
   Rotary0 = Encoder(pinc.0 , Pinc.1 , Links , Rechts , 0)
64
Return
65
66
Rechts:                                                     'Bei Rechtsdrehung
67
   Rotary1 = Rotary1 + 1                                    'Zählvariable Phasenwechsel erhöhen
68
Return
69
70
Links:                                                      'Bei Linksdrehung
71
   Rotary1 = Rotary1 - 1                                    'Zählvariable Phasenwechsel vermindern
72
Return
73
74
'***   Routine zur Anpassung des ENCODER-Befehls an POLLIN Drehencoder
75
76
Sub Encoder2()
77
   Disable Interrupts
78
   Rotary2 = Rotary1                                        'Zählvariable Phasenwechsel kopieren
79
   Rotary1 = Rotary1 And 1                                  'Ggf.Phasenwechsel zwischen Rastungen stehenlassen
80
   push r0                                                  'BASCOM kann kein arithmetisches Rechtsschieben
81
   lds r0,{rotary2}                                         'Aber der AVR kanns!
82
   asr r0                                                   'ASR= Rechtsschieben mit Berücksichtigen
83
   sts {rotary2},r0                                         'des Vorzeichens, also teilen durch 2
84
   pop r0                                                   'eines signed byte
85
   Rotary = Rotary + Rotary2                                'Encoder-Wert um Anzahl Rastungen erhöhen/vermindern
86
   Enable Interrupts
87
End Sub
88
89
Return

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.