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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.