1 | #include "m8def.inc" ;include description of PORTS
|
2 | ;---------------------------------------------------------------------------
|
3 | ;Reset and Interrupt vector ;VNr. Desrciption
|
4 | rjmp main ;1 Power on Reset
|
5 | reti ;2 Int0-Interrupt
|
6 | reti ;3 Int1-Interrupt
|
7 | reti ;4 TC2 Compare Match
|
8 | reti ;5 TC2 Overflow
|
9 | reti ;6 TC1 Capture
|
10 | reti ;7 TC1 Compare Match A
|
11 | reti ;8 TC1 Compare Match B
|
12 | reti ;9 TC1 Overflow
|
13 | reti ;10 TC0 Overflow
|
14 | reti ;11 SPI,STC Serial Transfer Complete
|
15 | reti ;12 UART Rx Complete
|
16 | reti ;13 UART Data Register Empty
|
17 | reti ;14 UART Tx Complete
|
18 | reti ;15 ADC Conversion Complete
|
19 | reti ;16 EEPROM Ready
|
20 | reti ;17 Analog Comperator
|
21 | reti ;18 TWI (I²C) Serial Interface
|
22 | reti ;19 Store Program Memory Ready
|
23 | ;---------------------------------------------------------------------------
|
24 | ;Start, Power On, Reset
|
25 | ;-----------------------------
|
26 | ;define PORTS, PullUp PullDown, I/O Ports
|
27 | ;---------------------------
|
28 | ; General Purpose
|
29 | .def temp = r16
|
30 | .def temp1 = r17
|
31 | .def temp2 = r18
|
32 | .def temp3 = r19
|
33 | .def WAHL = r20
|
34 | ;---------------------------
|
35 | .equ XTAL = 3686400
|
36 | ;Sensoren Adressen
|
37 | .equ SENSX_Akt = $92
|
38 | ;.equ SENS0_Write = 90
|
39 | ;.equ SENS0_Read = 91
|
40 | ;.equ SENS1_Write = 92
|
41 | ;.equ SENS1_Read = 93
|
42 | ;Anzahl der Temperatur Werte
|
43 | .equ TEMP_SENS = 2 ;128 Byte = 64 Werte je Sensor
|
44 | ;Code after every Start, REset, Power ON
|
45 | main:
|
46 | ;--Stackpointer init
|
47 | ldi temp, LOW(RAMEND);
|
48 | out SPL, temp;
|
49 | ldi temp, HIGH(RAMEND);
|
50 | out SPH, temp;
|
51 | sbi UCSRB, 3; ;USR=UCSRB=0x0A TXEN=Bit3; Tx activated
|
52 | ldi temp, 23 ;load Baudrate 9600
|
53 | out UBRRL, temp ;set Baudreate to register
|
54 | ldi WAHL,SENSX_Akt
|
55 | neue_messung: ;Neue Messung einsprung
|
56 | ldi r30,LOW(daten_sensor) ; den Z-Pointer mit dem Start der OCR Bytes laden
|
57 | ldi r31,HIGH(daten_sensor)
|
58 | ldi temp3,TEMP_SENS ;Schleifendurchläufe von mainloop definieren
|
59 | ;Program begin
|
60 | mainloop: wdr ;Reset Watchdog
|
61 | ; *** I2C Start ***
|
62 | ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) ;Vorbereiten
|
63 | out TWCR,temp ;Start Condition senden
|
64 | wait1: in temp,TWCR ;Status holen
|
65 | sbrs temp,TWINT ;Kommando ausgef?hrt?
|
66 | rjmp wait1 ;nein -> warten
|
67 | ; *** LM 75 mit Addr=1 ansprechen ***
|
68 | mov temp1,WAHL ;akutelle Adresse verwenden
|
69 | out TWDR,temp1 ;Byte in Ausgaberegister
|
70 | ldi temp,(1<<TWINT)|(1<<TWEN)
|
71 | out TWCR,temp ;Byte senden
|
72 |
|
73 | wait2: in temp,TWCR ;Status holen
|
74 | sbrs temp,TWINT ;Kommando ausgef?hrt?
|
75 | rjmp wait2 ;nein -> warten
|
76 | ; *** LM 75 Temperaturregister ansprechen ***
|
77 | ldi temp1,0b00000000 ;Temperaturregister
|
78 | out TWDR,temp1 ;Byte in Ausgaberegister
|
79 | ldi temp,(1<<TWINT)|(1<<TWEN);Vorbereiten
|
80 | out TWCR,temp ;Byte senden
|
81 |
|
82 | wait3: in temp,TWCR ;Status holen
|
83 | sbrs temp,TWINT ;Kommando ausgef?hrt?
|
84 | rjmp wait3 ;nein -> warten
|
85 |
|
86 | ; *** erneut I2C Start senden ***
|
87 | ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
|
88 | out TWCR,temp ;Start Condition senden
|
89 |
|
90 | wait4: in temp,TWCR ;Status holen
|
91 | sbrs temp,TWINT ;Kommando ausgef?hrt?
|
92 | rjmp wait4 ;nein -> warten
|
93 | ; *** LM75 lesen aktivieren ***
|
94 | inc WAHL ;für lesen um 1 Adresse erhöhen
|
95 | mov temp1,WAHL
|
96 | out TWDR,temp1 ;Byte in Ausgaberegister
|
97 | ldi temp,(1<<TWINT)|(1<<TWEN)
|
98 | out TWCR,temp ;Byte senden
|
99 |
|
100 | wait5: in temp,TWCR ;Status holen
|
101 | sbrs temp,TWINT ;Kommando ausgef?hrt?
|
102 | rjmp wait5 ;nein -> warten
|
103 |
|
104 | ldi temp,(1<<TWINT)|(1<<TWEN)|(0<<TWEA) ; ***1. Byte lesen MSB***
|
105 | out TWCR,temp ;Flags setzen
|
106 |
|
107 | wait6: in temp,TWCR ;Status holen
|
108 | sbrs temp,TWINT ;Kommando ausgef?hrt?
|
109 | rjmp wait6 ;nein -> warten
|
110 |
|
111 | in temp1,TWDR ;Daten sind da MSB
|
112 |
|
113 | ldi temp,(1<<TWINT)|(1<<TWEN)|(1<<TWEA) ; ***2. Byte lesen LSB***
|
114 | out TWCR,temp ;Flags setzen
|
115 |
|
116 | wait7: in temp,TWCR ;Status holen
|
117 | sbrs temp,TWINT ;Kommando ausgef?hrt?
|
118 | rjmp wait7 ;nein -> warten
|
119 |
|
120 | in temp2,TWDR ;Daten sind da LSB
|
121 |
|
122 | ldi temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) ; ***I2C Stop senden ***
|
123 | out TWCR,temp ; Stop Condition senden
|
124 |
|
125 | ; mov temp,temp1 ; ***senden 1. Byte ?ber UART ***
|
126 |
|
127 | st Z+, temp1 ;MSB sichern in Sram
|
128 | ;-------NOCHMAL
|
129 | ; inc WAHL ;UM Nächsten Sensor Abzufragen
|
130 | ; cpi WAHL,$94; ;Compare ob gleich, wenn ja dann überspringe nächste instruktion wenn WAHL=94
|
131 | ;breq weiter
|
132 | ;brne mainloop;
|
133 | ;weiter:
|
134 | ldi WAHL,SENSX_Akt
|
135 | dec temp3; ; Duchläufe fertig?
|
136 | brne mainloop; ;NEIN-> Nochmal durchlaufen die Abfrage
|
137 |
|
138 | rcall putChar ;alle Daten ausgeben
|
139 |
|
140 |
|
141 | end: rjmp neue_messung ;Repeat Program
|
142 |
|
143 | ;-----------------------------------------------
|
144 | ;Subroutines
|
145 | ;-----------------------------------------------
|
146 | ;Putt Characters to Output, UART
|
147 | putChar: ldi temp3,TEMP_SENS
|
148 | ldi r30,LOW(daten_sensor) ; den Z-Pointer mit dem Start der SensorDatenBytes laden
|
149 | ldi r31,HIGH(daten_sensor)
|
150 |
|
151 | Fertig:
|
152 | sbis UCSRA,5 ;USR=UCSRA=0x0B UDRE=Bit5
|
153 | rjmp Fertig ;wait until UDR is Ready
|
154 | ld temp, Z+ ; den TempSensor Wert für Uart Nr. i holen und Z-Pointer erhöhen
|
155 | out UDR, temp
|
156 | dec temp3 ;128 Durchlüfe erreicht?
|
157 | brne Fertig
|
158 | ret
|
159 | ;-----------------------------------------------
|
160 | #include "timing.asm"
|
161 | ;-----------------------------------------------
|
162 | ;Datenspeichereinrichten im SRAM
|
163 | .DSEG
|
164 | .org 0x60 ;erste mögliche Adresse angeben
|
165 | daten_sensor: .BYTE TEMP_SENS
|