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
        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