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 | ldi r16, 0xFF
|
28 | out DDRB, r16
|
29 |
|
30 |
|
31 | main:
|
32 |
|
33 |
|
34 | LM75_Read:
|
35 |
|
36 | ldi R16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) ; *** I2C Start ***
|
37 | out TWCR,R16 ;Start Condition senden
|
38 |
|
39 | wait1: in R16,TWCR ;Status holen
|
40 | sbrs R16,TWINT ;Kommando ausgeführt?
|
41 | rjmp wait1 ;nein -> warten
|
42 |
|
43 | ldi r17,0b10010010 ; *** LM 75 mit Addr=1 ansprechen ***
|
44 | out TWDR,R17 ;Byte in Ausgaberegister
|
45 |
|
46 | ldi R16,(1<<TWINT)|(1<<TWEN)
|
47 | out TWCR,R16 ;Byte senden
|
48 |
|
49 | wait2: in R16,TWCR ;Status holen
|
50 | sbrs R16,TWINT ;Kommando ausgeführt?
|
51 | rjmp wait2 ;nein -> warten
|
52 |
|
53 | ldi r17,0b00000000 ; *** LM 75 Temperaturregister ansprechen ***
|
54 | out TWDR,R17 ;Byte in Ausgaberegister
|
55 | ldi R16,(1<<TWINT)|(1<<TWEN)
|
56 | out TWCR,R16 ;Byte senden
|
57 |
|
58 | wait3: in R16,TWCR ;Status holen
|
59 | sbrs R16,TWINT ;Kommando ausgeführt?
|
60 | rjmp wait3 ;nein -> warten
|
61 |
|
62 |
|
63 | ldi R16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) ; *** erneut I2C Start senden ***
|
64 | out TWCR,R16 ;Start Condition senden
|
65 |
|
66 | wait4: in R16,TWCR ;Status holen
|
67 | sbrs R16,TWINT ;Kommando ausgeführt?
|
68 | rjmp wait4 ;nein -> warten
|
69 |
|
70 | ldi r17,0b10010011 ; *** LM75 lesen aktivieren ***
|
71 | out TWDR,R17 ;Byte in Ausgaberegister
|
72 | ldi R16,(1<<TWINT)|(1<<TWEN)
|
73 | out TWCR,R16 ;Byte senden
|
74 |
|
75 | wait5: in R16,TWCR ;Status holen
|
76 | sbrs R16,TWINT ;Kommando ausgeführt?
|
77 | rjmp wait5 ;nein -> warten
|
78 |
|
79 | ldi R16,(1<<TWINT)|(1<<TWEN)|(0<<TWEA) ; ***1. Byte lesen***
|
80 | out TWCR,R16 ;Flags setzen
|
81 |
|
82 | wait6: in R16,TWCR ;Status holen
|
83 | sbrs R16,TWINT ;Kommando ausgeführt?
|
84 | rjmp wait6 ;nein -> warten
|
85 |
|
86 | in data1,TWDR ;Daten sind da
|
87 |
|
88 | ldi R16,(1<<TWINT)|(1<<TWEN)|(0<<TWEA) ; ***2. Byte lesen***
|
89 | out TWCR,R16 ;Flags setzen
|
90 |
|
91 | wait7: in R16,TWCR ;Status holen
|
92 | sbrs R16,TWINT ;Kommando ausgeführt?
|
93 | rjmp wait7 ;nein -> warten
|
94 |
|
95 | in data2,TWDR ;Daten sind da
|
96 |
|
97 | ldi R16,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) ; ***I2C Stop senden ***
|
98 | out TWCR,R16 ; Stop Condition senden
|
99 |
|
100 | ;mov r16,data1 ; ***senden 1. Byte über UART ***
|
101 | ;rcall serout
|
102 |
|
103 | ;mov r16,data2 ; ***senden 2. Byte über UART ***
|
104 | ;rcall serout
|
105 |
|
106 | out portb,data1
|
107 |
|
108 | end: rjmp main
|
109 |
|
110 |
|
111 | serout:
|
112 | sbis UCSRA,UDRE
|
113 | rjmp serout
|
114 | out UDR, r16
|
115 | ret
|