1 | .include "m8def.inc"
|
2 |
|
3 |
|
4 | .def data1= r18
|
5 | .def data2= r19
|
6 | .equ CLOCK= 1000000
|
7 | .equ BAUD = 2400
|
8 |
|
9 | .equ UBRRVAL = CLOCK/(BAUD*16)-1
|
10 |
|
11 |
|
12 | ldi r16, LOW(RAMEND)
|
13 | out SPL, r16
|
14 | ldi r16, HIGH(RAMEND)
|
15 | out SPH, r16
|
16 |
|
17 |
|
18 | ldi r16, LOW(UBRRVAL)
|
19 | out UBRRL, r16
|
20 | ldi r16, HIGH(UBRRVAL)
|
21 | out UBRRH, r16
|
22 | ldi r16, (1<<URSEL)|(3<<UCSZ0)
|
23 | out UCSRC, r16
|
24 |
|
25 | sbi UCSRB,TXEN ; TX mit 2400 baud aktivieren
|
26 |
|
27 | main:
|
28 |
|
29 |
|
30 | LM75_Read:
|
31 |
|
32 | ldi R16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) ; *** I2C Start ***
|
33 | out TWCR,R16 ;Start Condition senden
|
34 | in R16,TWCR ;Status holen
|
35 |
|
36 | wait1: sbrs R16,TWINT ;Kommando ausgeführt?
|
37 | rjmp wait1 ;nein -> warten
|
38 |
|
39 | ldi r17,0b10010010 ; *** LM 75 mit Addr=1 ansprechen ***
|
40 | out TWDR,R17 ;Byte in Ausgaberegister
|
41 | ldi R16,(1<<TWINT)|(1<<TWEN)
|
42 | out TWCR,R16 ;Byte senden
|
43 |
|
44 | wait2: sbrs R16,TWINT ;Kommando ausgeführt?
|
45 | rjmp wait2 ;nein -> warten
|
46 |
|
47 |
|
48 | ldi r17,0b00000000 ; *** LM 75 Temperaturregister ansprechen ***
|
49 | out TWDR,R17 ;Byte in Ausgaberegister
|
50 | ldi R16,(1<<TWINT)|(1<<TWEN)
|
51 | out TWCR,R16 ;Byte senden
|
52 |
|
53 | wait3: sbrs R16,TWINT ;Kommando ausgeführt?
|
54 | rjmp wait3 ;nein -> warten
|
55 |
|
56 |
|
57 | ldi R16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) ; *** erneut I2C Start senden ***
|
58 | out TWCR,R16 ;Start Condition senden
|
59 | in R16,TWCR ;Status holen
|
60 |
|
61 | wait4: sbrs R16,TWINT ;Kommando ausgeführt?
|
62 | rjmp wait4 ;nein -> warten
|
63 |
|
64 |
|
65 | ldi r17,0b10010011 ; *** LM75 lesen aktivieren ***
|
66 |
|
67 | out TWDR,R17 ;Byte in Ausgaberegister
|
68 | ldi R16,(1<<TWINT)|(1<<TWEN)
|
69 | out TWCR,R16 ;Byte senden
|
70 |
|
71 | wait5: sbrs R16,TWINT ;Kommando ausgeführt?
|
72 | rjmp wait5 ;nein -> warten
|
73 |
|
74 | ldi R16,(1<<TWINT)|(1<<TWEN)|(0<<TWEA) ; ***1. Byte lesen***
|
75 | out TWCR,R16 ;Flags setzen
|
76 | wait6: in R16,TWCR ;Status holen
|
77 | sbrs R16,TWINT ;Kommando ausgeführt?
|
78 | rjmp wait6 ;nein -> warten
|
79 | in data1,TWDR ;Daten sind da
|
80 |
|
81 | ldi R16,(1<<TWINT)|(1<<TWEN)|(0<<TWEA) ; ***2. Byte lesen***
|
82 | out TWCR,R16 ;Flags setzen
|
83 | wait7: in R16,TWCR ;Status holen
|
84 | sbrs R16,TWINT ;Kommando ausgeführt?
|
85 | rjmp wait7 ;nein -> warten
|
86 | in data2,TWDR ;Daten sind da
|
87 |
|
88 | ldi R16,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) ; ***I2C Stop senden ***
|
89 | out TWCR,R16 ; Stop Condition senden
|
90 |
|
91 | mov r16,data1 ; ***senden 1. Byte über UART ***
|
92 | rcall serout
|
93 |
|
94 | mov r16,data2 ; ***senden 2. Byte über UART ***
|
95 | rcall serout
|
96 |
|
97 |
|
98 |
|
99 | end: rjmp main
|
100 |
|
101 |
|
102 | serout:
|
103 | sbis UCSRA,UDRE
|
104 | rjmp serout
|
105 | out UDR, r16
|
106 | ret
|