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
|