1 | ; ******************************************************************************
|
2 | ; * Thermometer.asm - Abschlussprojekt HBFI05a von Steffen Schalhorst *
|
3 | ; ******************************************************************************
|
4 | ; Mit Hilfe des PIC-Mikrocontroller 16F84A soll mit Hilfe des 1-Wire *
|
5 | ; Sensors DS18S20 ein Thermometer aufgebaut werden. *
|
6 | ; Der PIC bekommt die Daten über den Port RA,0. *
|
7 | ; Die gemessenen Werte werden BCD codiert und an einen BCD/7-Segement *
|
8 | ; Decoder gesendet der diesen Wert an die Entsprechenden Anzeigen sendet *
|
9 | ; die nacheinander Eingeschaltet werden. *
|
10 | ; ******************************************************************************
|
11 | ; EINGÄNGE: *
|
12 | ; *
|
13 | ; RA,0 --> 1-Wire Sensor DS18S20 *
|
14 | ; RA,1 --> Taster 1 Höchste Temp. *
|
15 | ; RA,2 --> Taster 2 Niedrigste Temp. *
|
16 | ; ******************************************************************************
|
17 | ; AUSGÄNGE: *
|
18 | ; *
|
19 | ; RB,0 --> BCD/7 Segement Decoder Eingang IA *
|
20 | ; RB,1 --> BCD/7 Segement Decoder Eingang IB *
|
21 | ; RB,2 --> BCD/7 Segement Decoder Eingang IC *
|
22 | ; RB,3 --> BCD/7 Segement Decoder Eingang ID *
|
23 | ; RB,4 --> BCD/7 Segement Decoder Eingang LT *
|
24 | ; RB,5 -->Transistor 1 für Anzeige 1 zu schalten *
|
25 | ; RB,6 -->Transistor 2 für Anzeige 2 zu schalten *
|
26 | ; RB,7 -->Transistor 3 für Anzeige 3 zu schalten *
|
27 | ;*******************************************************************************
|
28 |
|
29 | ;*******************************************************************************
|
30 | ;* Bestimmung des Prozessortyps für den Assembler und das Programmiergerät *
|
31 | ;*******************************************************************************
|
32 | LIST p=16F84A
|
33 | ;*******************************************************************************
|
34 | ;* Includedatei für den 16F84A einbinden (vordef. Reg. und Konst.) *
|
35 | ;*******************************************************************************
|
36 |
|
37 | #include <p16f84A.INC>
|
38 |
|
39 | ; Diese Datei enthält Vordefinitionen für wichtige Register und Konstanten.
|
40 | ; (Z.B. gibt es die Konstante PORTB mit der sich ohne Angabe der
|
41 | ; absoluten Adresse H'0006' der Port B des Prozessors ansprechen lässt)
|
42 |
|
43 |
|
44 | ;*******************************************************************************
|
45 | ;* Konfigurationseinstellungen für IC-Prog vordefinieren *
|
46 | ;*******************************************************************************
|
47 |
|
48 | __CONFIG _PWRTE_ON & _CP_OFF & _HS_OSC & _WDT_OFF
|
49 |
|
50 | ; Hier werden verschiedene Prozessoreigenschaften festgelegt:
|
51 | ; PWRTE_ON schaltet den Power Up Timer ein, d.h. der Prozessor wartet nach
|
52 | ; dem Einschalten ca. 70ms mit dem Programmstart, um sicher zu sein,
|
53 | ; dass alle angeschlossene Peripherie bereit ist.
|
54 | ; CP_OFF schaltet die Code-Protection des Prozesors aus. Damit ist das im Prozessor
|
55 | ; befindliche Programm jederzeit auslesbar und überschreibbar.
|
56 | ; HS_OSC spezifiziert einen Quarzoszillator (Highspeed) als Zeitbasis für den Prozessor.
|
57 | ; WDT_OFF schaltet den Watchdog-Timer des Prozesors aus.
|
58 |
|
59 |
|
60 | ;*******************************************************************************
|
61 | ;* Register / Variablen festlegen *
|
62 | ;*******************************************************************************
|
63 | ; hier werden Adressen von Registern / Variablen festgelegt. Diese werden beginnend
|
64 | ; mit der Adresse H'20' aufsteigend vergeben.
|
65 | CBLOCK H'20'
|
66 | sensor ; Variable wird benutzt um den ausgelesenen ByteCode vom Sensor geschrieben
|
67 | bcd_wert ; Variable in den der Umgewandelte Wert von Sensor geschrieben wird
|
68 |
|
69 | wait
|
70 | wait_1
|
71 | wait_2
|
72 |
|
73 |
|
74 | ENDC
|
75 | ;*******************************************************************************
|
76 | ;* Konstanten festlegen *
|
77 | ;*******************************************************************************
|
78 |
|
79 | ; Hier sollten alle im Verlauf des Programms verwendeten Konstanten deklariert werden.
|
80 | ; Die Deklaration sieht z.B. folgendermaßen aus:
|
81 |
|
82 | ;*******************************************************************************
|
83 | ;* Definition von einzelnen Bits in einem Register / in einer Variable *
|
84 | ;*******************************************************************************
|
85 | ; hier kann mit Hilfe der #DEFINE Direktive einzelnen Bits in einem Register ein
|
86 | ; Name zugewiesen werden.
|
87 | ; Eine Definition sieht z.B. folgendermaßen aus:
|
88 | ;
|
89 | ;*******************************************************************************
|
90 | ;* Name * Port * Bedeutung / Funktion *
|
91 | ;*******************************************************************************
|
92 | #DEFINE Sensor PORTA,0 ;Anschluss für 1-Wire Sensor
|
93 | #DEFINE TH PORTA,1 ;Taster für höchste Temperatur -->TH =Temp High
|
94 | #DEFINE TL PORTA,2 ;Taster für niedrigste Temperatur -->TL =Temp Low
|
95 | ;*******************************************************************************
|
96 | #DEFINE IA PORTB,0 ;BCD Decoder Eingang IA
|
97 | #DEFINE IB PORTB,1 ;BCD Decoder Eingang IB
|
98 | #DEFINE IC PORTB,2 ;BCD Decoder Eingang IC
|
99 | #DEFINE ID PORTB,3 ;BCD Decoder Eingang ID
|
100 | ;*******************************************************************************
|
101 | #DEFINE T1 PORTB,7 ;Transistor T1 --> Für Anzeige 1
|
102 | #DEFINE T2 PORTB,6 ;Transistor T2 --> Für Anzeige 2
|
103 | #DEFINE T3 PORTB,5 ;Transistor T3 --> Für Anzeige 3
|
104 | #DEFINE bank1 STATUS, RP0 ;Spezielle Register Bank
|
105 | ;*******************************************************************************
|
106 | ;*******************************************************************************
|
107 | ;* Programmstart *
|
108 | ;*******************************************************************************
|
109 | ORG H'00' ; Das Programm wird ab Speicherstelle 0 in den Speicher geschrieben
|
110 | GOTO init ; Springe zur Grundinitialisierung der Ports A und B
|
111 | ;*******************************************************************************
|
112 | ;* Initialisierung *
|
113 | ;*******************************************************************************
|
114 | init BSF bank1 ; wechsle zu Registerbank 1 (spezielle Register)
|
115 | MOVLW B'00011111'
|
116 | MOVWF TRISA ; RA0 .. RA4 Eingänge
|
117 | MOVLW B'00000000'
|
118 | MOVWF TRISB ; RB0-RB7 Ausgänge
|
119 | BCF bank1 ; wechsle zu Registerbank 0 (normaler Speicherbereich)
|
120 |
|
121 | CLRF PORTA ; Port A löschen
|
122 | CLRF PORTB ; Port B löschen
|
123 |
|
124 | ; Die Register TRISA und TRISB legen fest, welche Bits in den jeweiligen Ports Ein- bzw.
|
125 | ; Ausgänge sind. Eine '1' an der entsprechenden Stelle setzt das Bit des Ports als Ein-
|
126 | ; gang eine '0' setzt das Bit als Ausgang.
|
127 | ;*******************************************************************************
|
128 | ;* Hauptprogramm *
|
129 | ;*******************************************************************************
|
130 | main
|
131 | BSF T3
|
132 | BSF IA
|
133 |
|
134 |
|
135 |
|
136 |
|
137 |
|
138 |
|
139 |
|
140 |
|
141 |
|
142 | ;*******************************************************************************
|
143 | ;* Unterprogramme *
|
144 | ;*******************************************************************************
|
145 |
|
146 |
|
147 |
|
148 | UP_wait1s
|
149 | ;4999993 cycles
|
150 | movlw 0x2C
|
151 | movwf wait
|
152 | movlw 0xE7
|
153 | movwf wait_1
|
154 | movlw 0x0B
|
155 | movwf wait_2
|
156 | UP_wait1s_0
|
157 | decfsz wait, f
|
158 | goto $+2
|
159 | decfsz wait_1, f
|
160 | goto $+2
|
161 | decfsz wait_2, f
|
162 | goto UP_wait1s_0
|
163 |
|
164 | ;3 cycles
|
165 | goto $+1
|
166 | nop
|
167 |
|
168 | ;4 cycles (including call)
|
169 | return
|
170 |
|
171 | END
|