MATURAPROJEKT - EIBLER, EDTINGER - DSP

Index

 

1. Allgemeine Beschreibung

Die PIC Steuerplatine wird auf die maximale Anzahl von Tasten erweitert (4 Stück).
Mit diesen 4 Tasten ist es möglich eine 3 stellige Frequenz-Eingabe vorzunehmen. Diese wird am Display angezeigt.

Die Tasten haben folgende Bedeutungen:

Taste 1 - Schaltung: S2, Portleitung RB4:
   Die Stelle auf der der Cursor steht wird um 1 erhöht
Taste 2 - Schaltung: S4, Portleitung RB5:
   Die Stelle auf der der Cursor steht wird um 1 erniedrigt
Taste 3 - Schaltung: S3, Portleitung RB6:
   Die Stelle des Cursors wird ausgewählt (Einer-, Zehner- Hunderterstelle)
Taste 4 - Schaltung: S1, Portleitung RB7:
   Der eingestellte Wert wird übernommen

Mit den beiden Tastern 1 und 2 kann man die Stelle, auf der sich der Cursor gerade befindet um 1 erhöhen oder erniedrigen. Um zur nächsten Stelle zu gelangen, drückt man die Taste 3. Danach kann man diese Stelle erhöhen oder erniedrigen. Nachdem man bei der Hunderter-Stelle angelangt ist, springt der Cursor wieder auf die Einerstelle. Abgeschlossen wird die Auswahl der Frequenz durch drücken der Taste 4. Danach erscheint am Display ein OK neben der Frequenz. Sobald man eine Stelle ändert, wird dieses OK wieder gelöscht.

LC Display bei der Eingabe Dies ist eine typische Ausgabe auf dem Display im Betrieb: Nachdem die Steuerplatine eingeschalten wurde, kann man die einzelnen Stellen ändern. Wie zu sehen ist, befindet sich der Cursor _ gerade auf der Einerstelle. Der Punkt . ist ein Teil der Animation.
LC Display nach Bestaetigung Hier ist zu sehen, dass sich der Cursor _ gerade bei der 100er Stelle befindet. Dass der Wert übernommen wurde, wird durch das OK daneben angezeigt. Das kleine o ist wieder ein Teil der Animation.

 

2. Schaltung

 

2.1. Schaltbild

Schaltbild der 4 Tasten PIC Steuerplatine

 

2.2. Bestueckungsplan - Preisliste

R1,R2,R3,R4 12 kOhm 4 x 0,77 ATS
R5 22 Ohm 0,77 ATS
C2 100 nF 0,20 ATS
C5,C6 27 pF 2 x 0,20 ATS
C3 100 nF 0,20 ATS
C4 100 uF 16 V Elko / radial 0,32 ATS
IC1 PIC 16F84 116,20 ATS
IC3 7805 (TO-220 Gehaeuse) 16,10 ATS
IC3 74164 5,25 ATS
S1,S2,S3,S4 Taster 4 x ca 14,00 ATS
JP1,JP3,JP4 2x1, 1x1, 16x1 Stiftleiste kleiner 15,12 ATS
JP2 8x2 Stiftleiste kleiner 21,28 ATS

Die Preise sind ungefaehre Angaben Schuricht 98 Katalog) umgerechnet von DM auf ATS

 

2.3. Zur Schaltung - Beschreibung

Stiftleistenanschlüsse:

JP1 ist die Spannungsversorgung:
Pin 1 Masse
Pin 2 +7 V bis +10 V

JP2 ist der Anschluss mittels Flachbandkabel zum DSP:
    Ein 1:1 Kabel ist erforderlich (Pin 1 bei JP2 = Pin 1 bei DSP J7)
JP3 ist der Interrupt Anschluss zum DSP:
    Hier ist eine einzige Leitung nötig, die auf einen Interrupt Eingang beim DSP führt.
JP4 ist der Anschluss zum Display:
   Dieser Anschluss wurde mittels Stiftleiste realisiert, da es somit möglich ist, das Display getrennt von der Platine zu montieren.
   Nötig ist ebenfalls eine 1:1 Verbindung (Pin 1 bei JP4 = Pin 1 beim Display)

Das Display wurde nicht in die Preisrechnung miteinbezogen, da es verschiedene Typen gibt (mit und ohne Hintergrundbeleuchtung - mit und ohne zusätzliche Möglichkeit, eigene Zeichen zu definieren, ...). In diesem Fall wurde ein Hitachi MC-162-2 Display mit Hintergrundbeleuchtung verwendet. Die Hintergrundbeleuchtung ist ebenfalls ausgeführt an Pin 15 und 16 bei JP4.
Die 4 verwendeten Taster, sind Standard Drucktaster. Da es verschiedenste Ausführungen gibt, kann auch hier die Preisangabe u.U. nicht stimmen.

 

3. Layout

Komplettes Layout
Das Print Layout, sowie Bohrplan und Bestückungsplan sind als Ausdruck der Dokumentation hier beigefügt.
Der Bereich links oben wurde für das Display freigehalten.

 

4. Genaue Beschreibung des PIC Programms

Das Programm (PIC_1.ASM) besitzt, wie in der Vorgänger-Version (PIC_TST5.ASM für Ansteuerung des DSP) eine Interrupt Service Routine, welche aufgerufen wird, sobald eine der 4 Tasten gedrückt wird. Diese ISR arbeitet alle Anfragen ab und ruft die Menü-Routine menu auf.
In der ISR wird zuerst abgefragt, welche Taste gedrückt wurde. Wenn an Port B4 ein High Pegel anliegt (=Taste 1), wird zuerst abgefragt, bei welcher Stelle sich der Cursor befindet (diese steht in Speicherzelle sp7 - 0=1er Stelle, 1=10er Stelle, 2=100er Stelle) und danach wird die jeweilige Speicherzelle der Stelle um 1 erhöht (sp10=1er Stelle, sp11=10er Stelle, sp12=100er Stelle). Ist die jeweilige Stelle gerade bei 9, wird sie auf 0 zurückgesetzt.
Liegt an Port B5 ein High Pegel an (Taste 2), wird wieder ausgewertet, bei welcher Stelle sich der Cursor befindet, und die jeweilige Speicherzelle dann dekrementiert. Ist diese Stelle bei 0, wird sie auf 9 gesetzt.
Ist an Port B6 ein High Pegel aufgetreten (Taste 3), wird die Speicherzelle sp7 erhöht. Dies ist die Auswahl der Cursorposition - sprich die Stellenauswahl. Ist sp7 bei 2 (Hunderterstelle), so wird sie wieder auf 0 gesetzt (Einerstelle).
Tritt ein Highpegel an Port B7 auf (Taste 4), dann wird der eingestelle Wert übernommen. Dies geschieht indem ein Flag (Bit2 von Speicherzelle sp13 - valueok-Flag) gesetzt wird.
Da der DSP in dieser Programm Version nicht mit Daten versorgt werden muss, ist zum Abschluss der ISR nur mehr die Aktualisierung des Displays erforderlich.
Die Routine menu Schreibt dazu in der ersten Zeile des Displays DSP und danach einen Unterstrich genau über der jeweiligen Stelle. In der zweiten Zeile steht der String Wert: und danach werden einfach der Wert der jeweiligen Speicherzelle für die Stellen hintereinander ausgegeben. Ist das Flag valueok gesetzt, steht nach der eingestellten Frequenz der Schriftzug OK. Am letzten Zeichen in der 2ten Zeilen wird eine Animation abgespielt, solange der PIC in Ruhelage ist und "nichts zu tun" hat (keine Interruptanforderung).

 

4.1. Hints

Das PIC Programm befindet sich noch im Teststadium. Deswegen ist noch ein wenig Debug-Code enthalten. Weiters hat das Programm einige selbstkorrigierende Teile eingebaut. Diese treten z.B. bei der Anzeige des Stellencursors in der Funktion menu in Kraft. Falls sich nämlich der Wert von sp7 in einem ungültigen Bereich befindet (nicht zwischen 0 und einschließlich 2), dann wird sp7 auf 0 zurück gesetzt. Dieser Fehler kann auftreten, wenn kurzzeitig die Spannungsversorgung der PIC Steuerplatine ausfällt.

 

4.2. Links

Für eine weiterführende Erklärung des Programms (Display Ausgabe), siehe Aufgabe 1 vom 14. Mai 2001 (Blockschaltbild und genaue Erklärung) bzw. http://blub2k.yi.org/dsp/ oder http://sprossenwanne.myip.org/dsp/

 

5. PIC Programm

  1:          list p=16f84
  2: 
  3: ;;------------------------------------------------------------------------
  4: ;; pic_1.asm
  5: ;; (C) by Leo Eibler 20010515  (mailto:leo@sprossenwanne.at)
  6: ;; LU: 20010515
  7: ;; DSP Project Site: http://blub2k.no-ip.com/dsp/
  8: ;;------------------------------------------------------------------------
  9: ;; Klausurarbeit - Matura 2001: Aufgabe:
 10: ;; insgesamt 4 Tasten: 2 Tasten dienen zum Aendern der derzeit ausgewaehl.
 11: ;; Stelle (Taste mit Pfeil rauf & runter). Eine weitere Taste dient zum
 12: ;; weitergehen auf die naechste zu aendernte Stelle. Die 4. Taste dient
 13: ;; zum Uebernehmen/Bestaetigen der Werte.
 14: ;; Tastendruecke (sprich high-Pegel auf den Portleitungen RB4-RB7).
 15: ;; Tritt so ein high-Pegel auf, springt das Programm in eine ISR.
 16: ;; 20010515: Quellcode Grundgeruest von PIC_TST5.ASM uebernommen
 17: ;;------------------------------------------------------------------------
 18: ;; kompiliert wurde das Programm mit 02.50.02
 19: ;; geflasht mit IC-Prog 1.01
 20: ;;  Einstellungen: JDM Programmer, Oscillator XT, nothing else
 21: ;;------------------------------------------------------------------------
 22: 
 23:          status      equ         03h
 24:          rp0         equ         05h ;SpeicherBank Auswahlbit
 25:          rp1         equ         06h ;SpeicherBank Auswahlbit
 26:          intcon      equ         0Bh
 27:          porta       equ         05h
 28:          trisa       equ         85h
 29:          portb       equ         06h
 30:          trisb       equ         86h
 31:          sp1         equ         0Ch ;Zeichenausgabe
 32:          sp2         equ         0Dh ;Zeichenausgabe
 33:          sp3         equ         0Eh ;Delay Schleife
 34:          sp4         equ         0Fh ;Delay Schleife
 35:          sp5         equ         10h ;Entprell-Delay-Schleife
 36:          sp6         equ         11h ;Entprell-Delay-Schleife
 37:          sp7         equ         12h ;Einer,Zehner,oder Hunderterstelle ?
 38:          sp8         equ         13h
 39:          sp9         equ         14h ;EnableInt,Outstate
 40:          sp10        equ         15h ;Einerstelle
 41:          sp11        equ         16h ;Zehnerstelle
 42:          sp12        equ         17h ;Hunderterstelle
 43:          sp13        equ         18h ;HT=Bit0, FIR=Bit1, ValueOk=Bit2
 44: 
 45: ;;------------------------------------------------------------------------
 46: 
 47:          org         00h             ; Reset Vector
 48:          goto        start
 49: 
 50: ;;------------------------------------------------------------------------
 51: ;; ISR's
 52: 
 53:          org         004h            ; Startvector (Interrupt)
 54: 
 55:          btfss       sp9,7           ; Bit7 auf 0:
 56:          goto        end_isr         ; Interrupt sofort beenden
 57: 
 58:          call        Entprellen
 59: 
 60:          btfsc       portb,4         ; Taster an RB4 betaetigt
 61:          goto        a1              ; um 1 nach oben
 62: 
 63:          btfsc       portb,5         ; Taster an RB5 betaetigt
 64:          goto        a2              ; um 1 nach unten
 65: 
 66:          btfsc       portb,6         ; Taster an RB6 betaetigt
 67:          goto        a3              ; zur naechsten Stelle
 68: 
 69:          btfsc       portb,7         ; Taster an RB7 betaetigt
 70:          goto        valueok         ; Wert uebernehmen !
 71: 
 72:          goto        chg_nothing            ; anscheinend nix von beiden ;-)
 73: 
 74: a3:                                  ; high-Pegel an RB6
 75:       movfw       sp7             ; sp7 - welche stelle ?
 76:       sublw       02h             ; sind wir bei der Hunderterstelle ?
 77:       btfsc       status,2        
 78:       goto        stelle_einer    ; ja - wir gehen wieda zur Einerstelle !
 79:       incf        sp7             ; nein - eine Stelle weiter
 80:       goto        chg_nothing
 81: stelle_einer:
 82:       clrf        sp7             ; wieder zur 1er Stelle
 83:       goto        chg_nothing     
 84: 
 85: a2:                                  ; high-Pegel an RB5 - 1 nach unten
 86:       bcf         sp13,2          ; Erst nach druck auf OK uebernehmen
 87:       movfw       sp7             ; sp7 - welche stelle ?
 88:       sublw       00h             ; einerstelle?
 89:       btfsc       status,2        
 90:       goto        chg_einerdn     ; ja - wir aendern die Einerstelle !
 91:       movfw       sp7             ; sp7 - welche stelle ?
 92:       sublw       01h             ; zehnerstelle?
 93:       btfsc       status,2        
 94:       goto        chg_zehnerdn    ; ja - wir aendern die Zehnerstelle !
 95:       movfw       sp7             ; sp7 - welche stelle ?
 96:       sublw       02h             ; hunderterstelle?
 97:       btfsc       status,2        
 98:       goto        chg_hundertdn   ; ja - wir aendern die Hunderterstelle !
 99:       clrf        sp7             ; wir sind hier her gekommen - Fehler
100:       goto        chg_nothing     
101: 
102: a1:                                  ; high-Pegel an RB4 - 1 nach oben
103:       bcf         sp13,2          ; Erst nach druck auf OK uebernehmen
104:       movfw       sp7             ; sp7 - welche stelle ?
105:       sublw       00h             ; einerstelle?
106:       btfsc       status,2        
107:       goto        chg_einerup     ; ja - wir aendern die Einerstelle !
108:       movfw       sp7             ; sp7 - welche stelle ?
109:       sublw       01h             ; zehnerstelle?
110:       btfsc       status,2        
111:       goto        chg_zehnerup    ; ja - wir aendern die Zehnerstelle !
112:       movfw       sp7             ; sp7 - welche stelle ?
113:       sublw       02h             ; hunderterstelle?
114:       btfsc       status,2        
115:       goto        chg_hundertup   ; ja - wir aendern die Hunderterstelle !
116:       clrf        sp7             ; wir sind hier her gekommen - Fehler
117: ;;      incf        sp7             ; also wieda auf 1 setzen (einerstelle)
118:       goto        chg_nothing     
119: 
120: chg_einerup:
121:       movfw       sp10            ; sp10 (Einerstelle) laden
122:       sublw       09h             ; sind wir schon bei 9 ?
123:       btfss       status,2        ; wenn ja, spring zu einer_rauf
124:       goto        einer_rauf      ; Einerstelle erhoehen
125:       goto        einer_is_9      ; wir sind bei 9 -> wieda 0
126: 
127: einer_rauf:
128:       incf        sp10            ; Einerstelle + 1
129:       goto        chg_nothing
130: einer_is_9:
131:       clrf        sp10            ; Einerstelle = 0
132:       goto        chg_nothing
133: 
134: chg_einerdn:
135:       movfw       sp10            ; sp10 (Einerstelle) laden
136:       sublw       00h             ; sind wir schon bei 0 ?
137:       btfss       status,2        ; wenn ja, spring zu einer_rauf
138:       goto        einer_runter    ; Einerstelle erhoehen
139:       goto        einer_is_0      ; wir sind bei 9 -> wieda 0
140: einer_runter:
141:       decf        sp10            ; Einerstelle + 1
142:       goto        chg_nothing
143: einer_is_0:
144:       movlw       09h
145:       movwf       sp10            ; Einerstelle = 9
146:       goto        chg_nothing
147: 
148: chg_zehnerup:
149:       movfw       sp11            ; sp11 (Zehnerstelle) laden
150:       sublw       09h             ; sind wir schon bei 9 ?
151:       btfss       status,2        ; wenn ja, spring zu einer_rauf
152:       goto        zehner_rauf     ; Zehnerstelle erhoehen
153:       goto        zehner_is_9     ; wir sind bei 9 -> wieda 0
154: 
155: zehner_rauf:
156:       incf        sp11            ; zehnerstelle + 1
157:       goto        chg_nothing
158: zehner_is_9:
159:       clrf        sp11            ; zehnerstelle = 0
160:       goto        chg_nothing
161: chg_zehnerdn:
162:       movfw       sp11            ; sp11 (Zehnerstelle) laden
163:       sublw       00h             ; sind wir schon bei 0 ?
164:       btfss       status,2        ; wenn ja, spring zu einer_rauf
165:       goto        zehner_runter   ; Zehnerstelle erhoehen
166:       goto        zehner_is_0     ; wir sind bei 9 -> wieda 0
167: zehner_runter:
168:       decf        sp11            ; zehnerstelle + 1
169:       goto        chg_nothing
170: zehner_is_0:
171:       movlw       09h
172:       movwf       sp11            ; zehnerstelle = 9
173:       goto        chg_nothing
174: 
175: chg_hundertup:
176:       movfw       sp12            ; sp12 (hunderterstelle) laden
177:       sublw       09h             ; sind wir schon bei 9 ?
178:       btfss       status,2        ; wenn ja, spring zu einer_rauf
179:       goto        hundert_rauf    ; hunderterstelle erhoehen
180:       goto        hundert_is_9    ; wir sind bei 9 -> wieda 0
181: 
182: hundert_rauf:
183:       incf        sp12            ; hunderterstelle + 1
184:       goto        chg_nothing
185: hundert_is_9:
186:       clrf        sp12            ; hunderterstelle = 0
187:       goto        chg_nothing
188: chg_hundertdn:
189:       movfw       sp12            ; sp12 (Hunderterstelle) laden
190:       sublw       00h             ; sind wir schon bei 0 ?
191:       btfss       status,2        ; wenn ja, spring zu einer_rauf
192:       goto        hundert_runter  ; Hunderterstelle erhoehen
193:       goto        hundert_is_0    ; wir sind bei 9 -> wieda 0
194: hundert_runter:
195:       decf        sp12            ; hunderterstelle + 1
196:       goto        chg_nothing
197: hundert_is_0:
198:       movlw       09h
199:       movwf       sp12            ; hunderterstelle = 9
200:       goto        chg_nothing
201: 
202: 
203: valueok:
204:          btfss       sp13,2          ; ist der Wert Ok ?
205:          goto        set_valueok     ;   is net gsetzt, jetzt setzen !
206: ;;         bcf         sp13,2         ; is scho gsetzt, jetzt loeschen
207: ;;                                    ; Funktion ist nicht gewuenscht
208:          goto        chg_nothing
209: set_valueok:
210:          bsf         sp13,2
211: 
212: chg_nothing:
213:          call        menu            ; Menu anzeigen bzw. updaten
214:          bsf         sp9,6           ; Bit 6 setzen (debug)
215: end_isr:
216:          bcf         intcon,0        ; PortChangeInterruptFlag rueckset.
217:          retfie
218: 
219: ;;------------------------------------------------------------------------
220: start:
221:           bcf         sp9,6          ; debug bit fuer Interrupt
222:           bcf         sp9,7          ; keine Interrupts erlauben
223: 
224:           movlw       b'11110000'    ; RB0-3 auf Ausg. RB4-7 auf Eing.
225:           tris        portb          ; TrisRegister mit altem Befehl set
226: 
227:           movlw       b'00000000'    ; RA0-3 auf Ausgang
228:           tris        porta          ; TrisRegister mit altem Befehl set
229: 
230:           bcf         portb,2        ; LCD: Instruction Code
231:           bcf         portb,3        ; LCD: Enable Signal
232:           bsf         porta,4        ; RA4 (DSP-IRQ Leitung) auf High
233: 
234:           movlw       0h             ; Debug Register auf
235:           movwf       sp8            ; 0 setzen
236: 
237:           clrf        sp7            ; sp7 (Stellenauswahl) auf einen
238:  ;         incf        sp7            ; definierten Wert bringen (1)
239: 
240:           movlw       b'10001000'    ; Enable Global Ints
241:           movwf       intcon         ; Enable PortChange Ints.
242: 
243: 
244: ;;------------------------------------------------------------------------
245: ;;Display Init
246: endlos:
247:          bcf          portb,2        ; LCD: Instruction Code
248: 
249:          movlw        b'00000001'    ; Display Clear
250:          call         dataout
251: 
252:          movlw        b'00000110'    ; Entry Mode Set
253:          call         dataout
254: 
255:          movlw        b'00001100'    ; Display On
256:          call         dataout
257: 
258:          movlw        b'00111000'    ; Set Function
259:          call         dataout
260: 
261:          bsf          portb,2        ; LCD: Data Code
262: 
263:          movlw        b'01000100'  ;D
264:          call         dataout
265:          movlw        b'01010011'  ;S
266:          call         dataout
267:          movlw        b'01010000'  ;P
268:          call         dataout
269:          movlw        b'00101101'  ;-
270:          call         dataout
271:          movlw        b'01010000'  ;P
272:          call         dataout
273:          movlw        72h          ;r
274:          call         dataout
275:          movlw        6fh          ;o
276:          call         dataout
277:          movlw        6Ah          ;j
278:          call         dataout
279:          movlw        65h          ;e
280:          call         dataout
281:          movlw        63h          ;c
282:          call         dataout
283:          movlw        74h          ;t
284:          call         dataout
285: 
286:          bcf          portb,2
287:          movlw        b'11000000'  ; LCD: 2. Zeile, Pos. 0
288:          call         dataout
289:          bsf          portb,2
290: 
291: 
292:          movlw        62h          ;b
293:          call         dataout
294:          movlw        79h          ;y
295:          call         dataout
296:          movlw        20h          ;<space>
297:          call         dataout
298:          movlw        b'01001100'  ;L
299:          call         dataout
300:          movlw        b'01100101'  ;e
301:          call         dataout
302:          movlw        b'01101111'  ;o
303:          call         dataout
304:          movlw        26h          ;&
305:          call         dataout
306:          movlw        4eh          ;N
307:          call         dataout
308:          movlw        69h          ;i
309:          call         dataout
310:          movlw        63h          ;c
311:          call         dataout
312:          movlw        b'01101111'  ;o
313:          call         dataout
314: 
315:                                    ; LCD: Data Code
316:          bsf          portb,2
317:          movlw        20h          ;<space>
318:          call         dataout
319:          bsf          sp9,7
320: 
321: ;;------------------------------------------------------------------------
322: x:                                 ; Endlosschleife
323:                                    ; Beginn mit kleiner Animation ;-)
324: 
325:          bcf          portb,2
326:          movlw        b'11001111'  ; LCD: 2. Zeile, Pos. 15
327:          call         dataout
328:          bsf          portb,2
329:          movlw        2eh          ;.
330:          call         dataout
331: 
332:          call         zeit_30_1ms
333: 
334:          bcf          portb,2
335:          movlw        b'11001111'  ; LCD: 2. Zeile, Pos. 15
336:          call         dataout
337:          bsf          portb,2
338:          movlw        6fh          ;o
339:          call         dataout
340: 
341:          call         zeit_30_1ms
342: 
343:          bcf          portb,2
344:          movlw        b'11001111'  ; LCD: 2. Zeile, Pos. 15
345:          call         dataout
346:          bsf          portb,2
347:          movlw        4fh          ;O
348:          call         dataout
349: 
350:          call         zeit_30_1ms
351: 
352:          bcf          portb,2
353:          movlw        b'11001111'  ; LCD: 2. Zeile, Pos. 15
354:          call         dataout
355:          bsf          portb,2
356:          movlw        6fh          ;o
357:          call         dataout
358: 
359:          call         zeit_30_1ms
360: 
361:          goto         x            ; Endlos-Schleife, Animation
362: 
363: ;;------------------------------------------------------------------------
364: ;;  space=20h [=5Bh ]=5Dh C=43h E=45h H=48h O=4Fh P=50h T=54h
365: menu:                              ; Menu (von ISR aufgerufen)
366: 
367:       bcf          portb,2
368:       movlw        b'00000110'  ; Entry Mode Set
369:       call         dataout
370:       movlw        b'00111000'  ; Set Function
371:       call         dataout
372:       movlw        b'10000000'  ; LCD: 1. Zeile, Pos. 0
373:       call         dataout
374:       bsf          portb,2
375:       movlw        44h          ;D
376:       call         dataout
377:       movlw        53h          ;S
378:       call         dataout
379:       movlw        50h          ;P
380:       call         dataout
381:       movlw        20h          
382:       call         dataout
383:       movlw        20h          
384:       call         dataout
385:       movlw        20h          
386:       call         dataout
387: 
388:       movfw       sp7             ; sp7 - welche stelle ?
389:       sublw       02h             ; sind wir bei der Hunderterstelle ?
390:       btfsc       status,2        
391:       goto        show_1er
392:       movlw       20h          
393:       call        dataout
394:       movfw       sp7             ; sp7 - welche stelle ?
395:       sublw       01h             ; sind wir bei der Zehnerstelle ?
396:       btfsc       status,2        
397:       goto        show_10er
398:       movlw       20h          
399:       call        dataout
400:       movfw       sp7             ; sp7 - welche stelle ?
401:       sublw       00h             ; sind wir bei der Einerstelle ?
402:       btfsc       status,2        
403:       goto        show_100er
404:       movlw       20h          
405:       call        dataout
406:       clrf        sp7             ; wieda Fehler
407: ;;      incf        sp7             ; in definierten Zustand !
408:       goto        show_xno
409: show_1er:
410:       movlw       5Fh          ;_
411:       call        dataout
412:       movlw       20h          
413:       call        dataout
414:       movlw       20h          
415:       call        dataout
416:       goto        show_xno
417: show_10er:
418:       movlw       5Fh          ;_
419:       call        dataout
420:       movlw       20h          
421:       call        dataout
422:       goto        show_xno
423: show_100er:
424:       movlw       5Fh          ;_
425:       call        dataout
426:       goto        show_xno
427: show_xno:
428:       movlw       20h          
429:       call        dataout
430:       movlw       20h          
431:       call        dataout
432: 
433: 
434:          bcf         portb,2
435:          movlw        b'00000110'  ; Entry Mode Set
436:          call         dataout
437: 
438:          movlw        b'00111000'  ; Set Function
439:          call         dataout
440: 
441:          movlw        b'11000000'  ; LCD: 2. Zeile, Pos. 0
442:          call         dataout
443:          bsf          portb,2
444: 
445: 
446:          movlw        57h          ;W
447:          call         dataout
448:          movlw        45h          ;E
449:          call         dataout
450:          movlw        52h          ;R
451:          call         dataout
452:          movlw        54h          ;T
453:          call         dataout
454:          movlw        3Ah          ;:
455:          call         dataout
456:          movlw        20h          ;<space>
457:          call         dataout
458: 
459:          movfw        sp12     ; Hunderterstelle laden
460:          addlw        30h      ; ASCII Code von 0 dazuzaehlen
461:          call         dataout
462:          movfw        sp11     ; Zehnerstelle laden
463:          addlw        30h      ; ASCII Code von 0 dazuzaehlen
464:          call         dataout
465:          movfw        sp10     ; Einerstelle laden
466:          addlw        30h      ; ASCII Code von 0 dazuzaehlen
467:          call         dataout
468: 
469:          movlw        20h          ;<space>
470:          call         dataout
471: 
472:          btfss       sp13,2          ; ist Wert ok ?
473:          goto        show_valuenotok ;   is net gsetzt, anzeigen
474:          movlw        4Fh          ;O
475:          call         dataout
476:          movlw        4Bh          ;K
477:          call         dataout
478:          movlw        20h          ;<space>
479:          call         dataout
480:          goto        showend_vnok
481: show_valuenotok
482:          movlw        20h          ;<space>
483:          call         dataout
484:          movlw        20h          ;<space>
485:          call         dataout
486:          movlw        20h          ;<space>
487:          call         dataout
488: showend_vnok
489:          goto         end_menu
490: 
491: 
492: end_menu:
493:          movlw        20h          ;<space>
494:          call         dataout
495: 
496: ;;         bcf          sp9,6        ; Wenn nicht aus ISR aufgerufen
497:          return
498: 
499: ;;------------------------------------------------------------------------
500: ;; DSP Interrupt ausloesen (low aktiv)
501: ;; 4. Pin auf Port a auf 0 - warten - wieda auf high
502: 
503: DSP_Int
504:          call         zeit_13_1ms
505:          bcf          porta,4      ; RA4: Interruptleitung fuer DSP
506:          call         zeit_5_1ms  ;      mal auf GND ziehn, warten,
507:          bsf          porta,4      ;      und wieder auf High
508:          call         zeit_5_1ms
509:          call         zeit_5_1ms
510:          return
511: 
512: ;;------------------------------------------------------------------------
513: ;; Zeichen Ausgabe:
514: 
515: dataout:
516:          movwf        sp1
517:          bcf          status,0
518:          movlw        b'00001001'
519:          movwf        sp2
520: 
521: dataout1:
522:          decfsz       sp2,1
523:          goto         dataout2
524:          goto         uu
525:          return
526: 
527: dataout2:
528:          rrf          sp1,1        ; Daten seriell auf das
529:          btfss        status,0     ; Schieberegister ausgeben
530:          goto         null
531:          goto         eins
532: 
533: null:
534:          bcf          portb,0      ; Serial Input von Schieberegister
535: 
536:          call         clock
537:          goto         dataout1
538: 
539: eins:
540:          bsf          portb,0      ; Serial Input von Schieberegister
541: 
542:          call         clock
543:          goto         dataout1
544: 
545: clock:
546:          bcf          portb,1      ; Clock Input von Schieberegister
547:          bsf          portb,1      ; einen Taktflanke erzeugen, damit
548:          bcf          portb,1      ; das naechste Bit uebernommen wird
549:          return
550: 
551: uu:
552:          bcf          portb,3      ; Und schliesslich
553:          call         zeit_13_1ms  
554:          bsf          portb,3      ; Enable Signal fuer LCD erzeugen
555:          call         zeit_13_1ms  
556:          bcf          portb,3      ; und wieder loeschen
557:          return
558: 
559: ;;------------------------------------------------------------------------
560: ;; zeit_13_1ms
561: 
562: zeit_13_1ms:
563:          movlw        b'00000011'
564:          movwf        sp3
565: 
566:          movlw        b'00000001'
567:          movwf        sp4
568: 
569: zeit_13_2ms:
570:          decfsz       sp3,1
571:          goto         zeit_13_3ms
572:          return
573: 
574: zeit_13_3ms:
575:          decfsz       sp4,1
576:          goto         zeit_13_3ms
577:          goto         zeit_13_2ms
578: 
579: ;;------------------------------------------------------------------------
580: ;; Zeit_30ms => 325,125 msec
581: 
582: zeit_30ms:
583:          call         zeit_30_1ms
584:          return
585: 
586: zeit_30_1ms:
587:          movlw        b'11111111'
588:          movwf        sp3
589: 
590: zeit_30_2ms:
591:          movlw        b'11111111'
592:          movwf        sp4
593:          decfsz       sp3,1
594:          goto         zeit_30_3ms       ; 255 * 1,275 msec = 325,125 msec
595:          return
596: 
597: zeit_30_3ms:
598:          decfsz       sp4,1
599:          goto         zeit_30_4ms       
600:          goto         zeit_30_2ms
601: 
602: zeit_30_4ms:
603:          nop                            ; 4 Mhz Takt =>
604:          nop                            
605:          nop                            
606:          nop                            
607:          nop                            
608:          goto         zeit_30_3ms
609: 
610: ;;------------------------------------------------------------------------
611: ;; Entprellen
612: 
613: Entprellen
614:          nop
615:          call         zeit_4x_1ms
616:          nop
617:          call         zeit_4x_1ms
618:          nop
619:          return
620: 
621: zeit_4x_1ms:
622:          movlw        b'11111111'
623:          movwf        sp5
624: 
625: zeit_4x_2ms:
626:          movlw        b'00000110'
627:          movwf        sp6
628:          decfsz       sp5,1
629:          goto         zeit_4x_3ms
630:          return
631: 
632: zeit_4x_3ms:
633:          decfsz       sp6,1
634:          goto         zeit_4x_4ms
635:          goto         zeit_4x_2ms
636: 
637: zeit_4x_4ms:
638:          nop
639:          goto         zeit_4x_3ms
640: 
641: 
642: ;;------------------------------------------------------------------------
643: ;; zeit_5_1ms
644: 
645: zeit_5_1ms:
646:          movlw        b'00000111'
647:          movwf        sp3
648: 
649:          movlw        b'00001111'
650:          movwf        sp4
651: 
652: zeit_5_2ms:
653:          decfsz       sp3,1      
654:          goto         zeit_5_3ms 
655:          return
656: 
657: zeit_5_3ms:                      
658:          decfsz       sp4,1      
659:          goto         zeit_5_3ms 
660:          nop
661:          nop
662:          nop                     
663:          goto         zeit_5_2ms 
664: 
665: 
666:          end                       ; und zu Ende is unser schoenes Prog.
667: 
668: ;;------------------------------------------------------------------------
669: ;; check out the DSP Project Site:
670: ;; http://blub2k.no-ip.com/dsp/
671: ;; http://sprossenwanne.yi.org/dsp/ or http://sprossenwanne.myip.org/dsp/
672: ;; mailto: leo@sprossenwanne.at
673: ;;------------------------------------------------------------------------
674: ;; einige Teile des Programmcodes wurden von der MaturaDoku der Schueler
675: ;; Eggler/Geiger 1998/99 Schellinggasse, Wien1, Oesterreich entnommen.
676: ;;------------------------------------------------------------------------
 

6. Protokoll

Datum Eintrag
14.5.2001 Blockschaltbild des Gesamtsystems (Stimmenverzerrer - PIC Steuerplatine und DSP); Beschreibung des Blockschaltbilds und des Systems (Schnittstellen, Software Beschreibung von DSP und PIC)
15.5.2001 Schaltung der PIC Steuerplatine mit 4 Tasten gezeichnet. PIC Programm entwickelt mit 4 Tasten Eingabe. 3 stellige Anzeige der Frequenz, ändern jeder einzelnen Stelle durch 2 Tasten nach oben und unten, 1 Taste für die nächste Stelle, 1 Taste zum Bestätigen. Ausgabe auf dem Display. Layout der PIC Steuerplatine mit 4 Tasten begonnen.
16.5.2001 Dokumentation zur PIC Steuerplatine mit 4 Tasten. Layout der PIC Steuerplatine.
 

X. Anhang

 

X.A. Quellenangabe

 

X.B. Fachklausurpruefung

Dies ist die Dokumentation für die Fachklausurprüfung 14.5.2001 bis einschliesslich 18.5.2001.

Es wurde am 1. Tag eine Aufgabe gestellt:


Am 2.&3. Tag:

Am 4. Tag:

Am 5. Tag:

 

X.C. Diese Dokumentation

Diese Dokumentation basiert auf Scripts von view->source[Nico Edtinger] um sie sowohl online verfügbar als auch druckbar zu machen. In nächster Zeit wird der Code unter der GPL auf http://viewsource.web.ag/ zur Verfügung stehen.

Das Copyright für den gesamten Inhalt liegt bei Leo Eibler und Nico Edtinger. Wir sind per Mail zu ereichen falls jemand größere Auszüge aus dieser Dokumentation verwenden will.

Valid HTML 4.01!

Valid CSS!