Hallo zusammen, ich versuch grad mit einem Inkrementalgeber einen Zähler zu verändern und den aktuellen Wert des Zählers zur Kontrolle über LEDs wieder auszugeben. Als Controller verwende ich den AT89S8253. Ein Signal des Gebers geht auf Port 3.2 und das andere auf Port 3.3. Der Interrupt wird über Port 3.2 ausgelöst. Die LEDs sind an Port 0 angeschlossen. Der Geber hat 15 Inkremente und 30 Raststellungen pro Umdrehung. Je nachdem in welcher Stelle er sich gerade befindet zeigten die LEDs entweder irgend ein Leuchtmuster an oder die LEDs 0 bis 6 leuchten und die 7. blinkt. Ich hab im Moment keine Ahnung was ich an dem Programm verändern muss und auch m Netz hab ich nichts gefunden.
1 | #include <REG8253.H> |
2 | |
3 | ;------------------------------------------------ |
4 | |
5 | ; Reservierung des Stack-Bereichs |
6 | |
7 | ?STACK SEGMENT IDATA |
8 | |
9 | RSEG ?STACK |
10 | |
11 | DS 10H |
12 | |
13 | ;------------------------------------------------ |
14 | |
15 | ; Variablen im int. direkt adressierbaren RAM |
16 | |
17 | Variablen SEGMENT DATA ;Variablen im direkt adressierbaren internen RAM |
18 | |
19 | RSEG Variablen ;Variablen-Segment waehlen |
20 | |
21 | zahl: DS 1 ;Reserviere 1Byte |
22 | |
23 | zeit1: DS 1 |
24 | |
25 | zeit100:DS 1 |
26 | |
27 | ;-------------------------------------------------------------------------- |
28 | ; Auf Adresse 0 im Code-Speicher muss ein LJMP zum Programmanfang stehen |
29 | |
30 | CSEG AT 0 ;absolutes Code-Segment bei Adresse 0 |
31 | |
32 | ljmp start ;Springe zur Marke start |
33 | |
34 | ;-------------------------------------------------------------------------- |
35 | ; Interrupt Vektoren |
36 | |
37 | cseg at 03h |
38 | |
39 | ljmp positionierung |
40 | |
41 | ;-------------------------------------------------------------------------- |
42 | ; Hier folgt Programmcode (Code-Beginn ueber Linker festgelegt) |
43 | |
44 | program_code SEGMENT CODE |
45 | |
46 | RSEG program_code ;waehle Code-Segment |
47 | |
48 | USING 0 ;Zeige Benuetzung von Registerbank 0 fuer den folgenden Programmcode an |
49 | |
50 | ;-------------------------------------------------------------------------- |
51 | ;Initialisierung Stack und I/O-Karte |
52 | |
53 | start: |
54 | |
55 | mov sp,#?stack-1 ;STACK-Definition |
56 | |
57 | ;-------------------------------------------------------------------------- |
58 | |
59 | |
60 | setb ea ;Interrupts zulassen |
61 | |
62 | |
63 | |
64 | mov zahl,#0 ;Zahl vordefinieren |
65 | |
66 | |
67 | |
68 | loop: |
69 | |
70 | mov a,zahl ;Zahl ausgeben |
71 | |
72 | cpl a |
73 | |
74 | mov p0,a |
75 | |
76 | setb ex0 ;Fenster für Interrupt |
77 | |
78 | nop |
79 | |
80 | clr ex0 |
81 | |
82 | |
83 | |
84 | ljmp loop ;Hauptschleife |
85 | |
86 | |
87 | |
88 | ;-------------------------------------------------------------------------- |
89 | |
90 | |
91 | positionierung: ;externer Interrupt 0 |
92 | |
93 | jb p3.3,invers ;Drehrichtung |
94 | |
95 | inc zahl ;hochzählen |
96 | |
97 | ljmp positionierung2 ;wieder zusammenführen |
98 | |
99 | invers: |
100 | |
101 | dec zahl ;runterzählen |
102 | |
103 | positionierung2: |
104 | |
105 | lcall t100ms ;Entprellzeit |
106 | |
107 | clr ie0 ;Flag löschen |
108 | |
109 | reti |
110 | |
111 | |
112 | |
113 | ;-------------------------------------------------------------------------- |
114 | |
115 | |
116 | t1ms: ;1ms Wartezeit |
117 | |
118 | mov zeit1,#250 |
119 | |
120 | zeitmarke1: |
121 | |
122 | nop |
123 | |
124 | nop |
125 | |
126 | djnz zeit1,zeitmarke1 |
127 | |
128 | ret |
129 | |
130 | |
131 | |
132 | t100ms: ;100ms Wartezeit |
133 | |
134 | mov zeit100,#100 |
135 | |
136 | zeitmarke100: |
137 | |
138 | djnz zeit100,zeitmarke100 |
139 | |
140 | ret |
141 | |
142 | |
143 | |
144 | END ;END Of File |