LM75_UART.ASM


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