camserv1.asm


1
;CamServo, Servoimpulsgenerator für zwei einstellbare Positionen eines
2
;Modellbauservos zur Fernauslösung einer Digicam.
3
4
5
;(c) 09/2006 by ...HanneS... (www.hanneslux.de)
6
7
8
.include"tn13def.inc"
9
10
.equ pwr=pb2            ;Ausgang für Power-Transistor (Pin7)
11
.equ imp=pb1            ;Ausgang für Servoimpuls (Pin6)
12
.equ tas0=pb0           ;Eingang für Auslöse-Taster (Pin 5)
13
.equ tas1=pb3           ;Eingang für Konfigutationstster 1
14
.equ tas2=pb4           ;Eingang für Konfigutationstster 2
15
16
.equ vrp=20             ;vorläufige Ruheposition
17
.equ vap=36             ;vorläufige Auslöseposition
18
.equ mipo=12            ;minimal erlaubte Position
19
.equ mapo=40            ;maximal erlaubte Position
20
.equ eeadr=1            ;EEP-Adresse Ruheposition
21
.equ eeada=2            ;EEP-Adresse Auslöseposition
22
23
.equ sida0=50           ;Signaldauer (Anzahl Servoimpulse)
24
.equ impein=(1<<com0b1)|(1<<wgm01)|(1<<wgm00) ;Fast-PWM an OcrB
25
26
27
.def null=r2            ;immer 0
28
.def srsk=r3            ;SREG-Sicherungs-Kopie
29
.def tz0=r4             ;Tasten-Prellzähler, Bit 0
30
.def tz1=r5             ;Tasten-Prellzähler, Bit 1
31
.def tas=r6             ;Tasten-Status
32
33
.def tdfl=r16           ;Tasten-Flags Drücken
34
.def tlfl=r17           ;Tasten-Flags Loslassen
35
.def sida=r18           ;Zähler Signaldauer (Anzahl Servoimpulse)
36
.def flags=r19          ;Zustands-Flags
37
.def rpos=r20           ;Ruheposition Servo
38
.def apos=r21           ;Auslöseposition Servo
39
40
41
.def wl=r24             ;temporär Low
42
.def wh=r25             ;temporär High
43
44
.cseg
45
.org 0              ;Reset- und Interrupt-Vektoren AT-Tiny13
46
 rjmp RESET         ;Reset Handler
47
 rjmp nix;EXT_INT0      ;IRQ0 Handler
48
 rjmp nix;PCINT0        ;PCINT0 Handler
49
 rjmp TIM0_OVF      ;Timer0 Overflow Handler
50
 rjmp nix;EE_RDY        ;EEPROM Ready Handler
51
 rjmp nix;ANA_COMP      ;Analog Comparator Handler
52
 rjmp nix;TIM0_COMPA    ;Timer0 CompareA Handler
53
 rjmp nix;TIM0_COMPB    ;Timer0 CompareB Handler
54
 rjmp nix;WATCHDOG      ;Watchdog Interrupt Handler
55
 rjmp nix;ADCC          ;ADC Conversion Handler
56
nix:                    ;unbenutzte Interrupts
57
 reti                   ;zurück...
58
RESET:
59
 ldi wl,ramend          ;Stackpointer
60
 out spl,wl             ;einrichten
61
 clr null               ;immer 0
62
63
 ldi wl,(1<<pwr)|(1<<imp)   ;Ausgänge
64
 out ddrb,wl            ;definieren
65
 ldi wl,(1<<tas0)|(1<<tas1)|(1<<tas2)   ;PullUps
66
 out portb,wl           ;für Taster einschalten
67
68
 ldi wl,vrp             ;vorläufige Ruheposition
69
 mov rpos,wl            ;einstellen
70
 ldi wl,vap             ;vorläufige Auslöseposition
71
 mov apos,wl            ;einstellen
72
 ldi wl,eeadr           ;EEP-Adresse für Ruheposition
73
 out eearl,wl           ;einstellen
74
 sbi eecr,eere          ;Leseimpuls an EEP senden
75
 in wl,eedr             ;EEP-Byte holen
76
 cpi wl,255             ;Datenbyte gültig (!=255)?
77
 breq reset1            ;nein, ignorieren...
78
 mov rpos,wl            ;ja, übernehmen
79
reset1:
80
 ldi wl,eeada           ;EEP-Adresse für Auslöseposition
81
 out eearl,wl           ;einstellen
82
 sbi eecr,eere          ;Leseimpuls an EEP senden
83
 in wl,eedr             ;EEP-Byte holen
84
 cpi wl,255             ;Datenbyte gültig (!=255)?
85
 breq reset2            ;nein, ignorieren...
86
 mov apos,wl            ;ja, übernehmen
87
reset2:
88
 out ocr0b,rpos         ;Ruheposition einstellen
89
 ldi wl,impein          ;Servoimpulserzeugung einschalten
90
 out tccr0a,wl          ;(Fast-PWM an OcrB für Timer einstellen)
91
 ldi wl,255             ;Comp A auf
92
 out ocr0a,wl           ;Top setzen
93
 ldi wl,3               ;Vorteiler 64
94
 out tccr0b,wl          ;für Timer einstellen
95
 ldi wl,1<<toie0        ;Überlauf-Interrupt
96
 out timsk0,wl          ;freischalten
97
 ldi wl,1<<se           ;Sleep-Mode 'Idle' vorwählen
98
 out mcucr,wl
99
 sbr tlfl,1<<tas0       ;erstmal in Ruheposition fahren
100
 sei                    ;Interrupts freischalten
101
102
103
mainloop:
104
 sleep                  ;bis zum nächsten Interrupt nixtun
105
 sbrc tdfl,tas1         ;Justage-Taster 1 neu gedrückt? - nein...
106
 rcall justup           ;ja, Job abarbeiten
107
 sbrc tdfl,tas2         ;Justage-Taster 2 neu gedrückt? - nein...
108
 rcall justdn           ;ja, Job abarbeiten
109
 sbrc tdfl,tas0         ;Auslöse-Taster neu gedrückt? - nein...
110
 rcall druecken         ;ja, Job abarbeiten
111
 sbrc tlfl,tas0         ;Auslöse-Taster neu losgelassen? - nein...
112
 rcall loslassen        ;ja, Job abarbeiten
113
 tst sida               ;Signaldauer abgelaufen?
114
 brne mainloop          ;nein, warten...
115
 out tccr0a,null        ;ja, Servoimpulserzeugung ausschalten
116
 sbi portb,pwr          ;Servo-Stromversorgung ausschalten
117
 rjmp mainloop          ;nochmal...
118
119
120
justup:             ;Justage-Taster 1 gedrückt
121
 cbr tdfl,1<<tas1       ;Jobflag löschen
122
 sbrc tas,tas2          ;beide Justage-Taster gedrückt? - nein...
123
 rjmp save              ;ja, Daten im EEP sichern...
124
 sbrs tas,tas0          ;Auslöser betätigt? - ja...
125
 inc rpos               ;nein, Ruheposition erhöhen
126
 sbrc tas,tas0          ;Auslöser betätigt? - nein...
127
 inc apos               ;ja, Auslöseposition erhöhen
128
 cpi rpos,mapo          ;Maximalwert überschritten?
129
 brcs justup1           ;nein...
130
 ldi rpos,mapo          ;ja, korregieren
131
justup1:
132
 cpi apos,mapo          ;Maximalwert überschritten?
133
 brcs justup2           ;nein...
134
 ldi apos,mapo          ;ja, korregieren
135
justup2:
136
 rcall justdn2          ;weiter wie bei Down
137
138
justdn:             ;Justage-Taster 2 gedrückt
139
 cbr tdfl,1<<tas2       ;Jobflag löschen
140
 sbrc tas,tas1          ;beide Justage-Taster gedrückt? - nein...
141
 rjmp save              ;ja, Daten im EEP sichern...
142
 sbrs tas,tas0          ;Auslöser betätigt? - ja...
143
 dec rpos               ;nein, Ruheposition vermindern
144
 sbrc tas,tas0          ;Auslöser betätigt? - nein...
145
 dec apos               ;ja, Auslöseposition vermindern
146
 cpi rpos,mipo          ;Minimalwert unterschritten?
147
 brcc justdn1           ;nein...
148
 ldi rpos,mipo          ;ja, korregieren
149
justdn1:
150
 cpi apos,mipo          ;Minimalwert unterschritten?
151
 brcc justdn2           ;nein...
152
 ldi apos,mipo          ;ja, korregieren
153
justdn2:
154
 sbrs tas,tas0          ;Auslöser betätigt? - ja...
155
 rjmp loslassen         ;nein, Ruheposition aktualisieren
156
                        ;ja, Auslöseposition aktualisieren
157
158
druecken:           ;UP Auslösetaster gedrückt
159
 cbr tdfl,1<<tas0       ;Jobflag löschen
160
 out ocr0b,apos         ;Auslöseposition einstellen
161
 rjmp servoan           ;Servo anschalten
162
163
loslassen:          ;UP Auslösetaster losgelassen
164
 cbr tlfl,1<<tas0       ;Jobflag löschen
165
 out ocr0b,rpos         ;Ruheposition einstellen
166
servoan:
167
 cbi portb,pwr          ;Stromversorgung Servo ein
168
 ldi sida,sida0         ;Signaldauer auf Startwert
169
 ldi wl,impein          ;Servoimpulserzeugung einschalten
170
 out tccr0a,wl          ;(Fast-PWM an OcrB für Timer einstellen)
171
 ret                    ;fertig...
172
173
save:               ;Justage-Daten im EEP sichern
174
 cli                    ;Interrupts verhindern
175
save1:
176
 sbic eecr,eewe         ;EEP noch beschäftigt? - nein...
177
 rjmp save1             ;ja...
178
 ldi wl,eeadr           ;EEP-Adresse für Ruheposition
179
 out eearl,wl           ;setzen
180
 out eedr,rpos          ;Ruhepositions-Daten ins EEP
181
 sbi eecr,eemwe         ;Schreibschutz aufheben
182
 sbi eecr,eewe          ;Schreib-Impuls setzen
183
save2:
184
 sbic eecr,eewe         ;EEP noch beschäftigt? - nein...
185
 rjmp save2             ;ja...
186
 ldi wl,eeada           ;EEP-Adresse für Auslöseposition
187
 out eearl,wl           ;setzen
188
 out eedr,apos          ;Auslösepositions-Daten ind EEP
189
 sbi eecr,eemwe         ;Schreibschutz aufheben
190
 sbi eecr,eewe          ;Schreib-Impuls setzen
191
save3:
192
 sbic eecr,eewe         ;sicherheitshalber warten,
193
 rjmp save3             ;bis EEP fertig ist...
194
 out eearl,null         ;EEP-Adresse auf ungültigen Wert
195
 reti                   ;Interrupts wieder freigeben und fertig...
196
197
198
tim0_ovf:           ;ISR Timer0-Überlauf
199
 in srsk,sreg           ;SREG sichern
200
Tastenabfrage:          ;Entprellroutine geklaut bei Peter Dannegger...
201
 in xl,pinb     ;Tastenport einlesen (gedrückt=L)
202
 com xl         ;invertieren (gedrückt=H)
203
 andi xl,(1<<tas0)|(1<<tas1)|(1<<tas2)  ;nur benutzte Taster berücksichtigen
204
 eor xl,tas     ;nur Änderungen werden H
205
 and tz0,xl     ;Prellzähler unveränderter Tasten löschen (Bit0)
206
 and tz1,xl     ;Prellzähler unveränderter Tasten löschen (Bit1)
207
 com tz0        ;L-Bit zählen 0,2,->1, 1,3,->0
208
 eor tz1,tz0    ;H-Bit zählen 0,2,->tz1 toggeln
209
 and xl,tz0     ;Änderungen nur dann erhalten, wenn im Prellzähler
210
 and xl,tz1     ;beide Bits gesetzt sind (Zählerstand 3)
211
 mov xh,xl      ;Kopie von geänderten Tasten
212
 and xh,tas     ;nur (neu) losgelassene Tastenbits bleiben erhalten
213
 or tlfl,xh     ;Tasten-Loslass-Flags setzen
214
 eor tas,xl     ;erhaltene Änderungen toggeln alten (gültigen) Tastenstatus
215
 and xl,tas     ;nur (neu) gedrückte Tastenbits bleiben erhalten
216
 or tdfl,xl     ;und zugehörige Bits setzen (gelöscht wird nach Abarbeitung)
217
 ;in "tas" steht jetzt der gültige Tastenzustand,
218
 ;in "tdfl" die Flags der neu gedrückten, noch nicht abgearbeiteten Tasten...
219
 ;in "tlfl" die Flags der neu losgelassenen, nicht abgearbeiteten Tasten
220
 ;xl ist jetzt wieder frei für weitere temporäre Zwecke in der ISR
221
 tst sida               ;Signaldauer schon abgelaufen?
222
 breq tim0_ovf1         ;ja...
223
 dec sida               ;nein, herunterzählen
224
tim0_ovf1: 
225
 out sreg,srsk          ;SREG wiederherstellen
226
 reti