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.