Forum: Mikrocontroller und Digitale Elektronik SHT71 Assembler Code für Atmega8


von Philip O. (versipellis)


Lesenswert?

Hey,
ich bin zur Zeit daran mit einem Temperatur- und 
Feuchtigkeitssensor(Sensirion SHT71) per Assembler durch ein Display 
Temperatur und Feuchtigkeit aus zu geben. Und ich wollte mal fragen ob 
jemand da schon Routinen für den ATmega8 geschrieben hat in Assembler, 
weil in C gibts die überall wie Sand am Meer.
Nur ich würde es gern in Assembler haben.
Ich hab schon angefangen nur bin ich mir nicht sicher ob das 
funktionieren würde. Bzw. wies weiter geht^^.

Zum Aufbau, ich hab zwischen Vdd und Data wie beschrieben einen 10kOhm 
Widerstand hingelötet.

Ich habe nur noch nicht wirklich kapiert wie es weiter geht nach dem ich 
die Verbindung aufgebaut habe. Also gerade wenn ich eine 
Temperaturabfrage machen will.

Hier mal mein Quellcode bis jetzt:
1
.equ SENSOR_PORT = PORTC
2
.equ SENSOR_DDR  = DDRC
3
.equ PIN_DATA   = 4
4
.equ PIN_CLK    = 3
5
6
.ifndef XTAL
7
.equ XTAL = 4000000
8
.endif
9
10
;Kurze Pause        
11
shortbreak:                            ; 50us Pause
12
        ldi  temp1, ( XTAL * 50 / 3 ) / 1000000
13
shortbreak_:
14
        dec  temp1
15
        brne shortbreak_
16
        ret                         ; wieder zurück
17
18
set_Data:
19
        cbi    SENSOR_DDR,    PIN_DATA
20
        ret
21
22
clear_Data:
23
        sbi SENSOR_DDR,    PIN_DATA
24
        ret
25
26
set_Clock:
27
        cbi SENSOR_PORT, PIN_CLK
28
        ret
29
30
clear_Clock:
31
        sbi SENSOR_PORT, PIN_CLK
32
        ret
33
              
34
;Startsequenz einer Übertragung von SHT71
35
sensor_transmission_start:
36
        
37
        rcall set_Data                ; Data auf HIGH
38
        rcall clear_Clock            ; Clock auf LOW
39
        rcall shortbreak            ; Kurze Pause
40
        rcall set_Clock                 ; Clock HIGH
41
        rcall shortbreak            ; Kurze Pause
42
        rcall clear_Data            ; Data auf LOW
43
        rcall shortbreak            ; Kurze Pause
44
        rcall clear_Clock            ; Clock LOW
45
        rcall shortbreak            ; Kurze Pause
46
        rcall set_Clock                ; Clock HIGH
47
        rcall shortbreak            ; Kurze Pause
48
        rcall set_Data                ; Data auf HIGH
49
        rcall shortbreak            ; Kurze Pause
50
        rcall clear_Clock            ; Clock auf LOW
51
        ret
52
;Resetsequenz
53
sensor_reset:
54
        clr      temp3
55
        rcall clear_Clock
56
        rcall set_Data                ;Data auf HIGH
57
        ldi      temp1, 9             ;Counter für Schleife
58
reset_loop:
59
        dec   temp1
60
        rcall set_Clock               ;Toggeln des SCK
61
        rcall clear_Clock
62
        brne  reset_loop
63
        ret

von Philip O. (versipellis)


Lesenswert?

Kann mir da niemand helfen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Und ich wollte mal fragen ob jemand da schon Routinen für den ATmega8
> geschrieben hat in Assembler, weil in C gibts die überall wie
> Sand am Meer. Nur ich würde es gern in Assembler haben.
Warum lässt du nicht einfach den C-Code durch den Compiler und siehst 
dir an, was da rauskommt?

> Ich habe nur noch nicht wirklich kapiert wie es weiter geht...
Wie wäre es mit Reverse Engineering des C-Codes?

von spess53 (Gast)


Angehängte Dateien:

Lesenswert?

Hi

Ich habe das mal für den SHT11 gemacht. Vielleicht hilft es dir.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Lothar Miller schrieb:

>> Ich habe nur noch nicht wirklich kapiert wie es weiter geht...
> Wie wäre es mit Reverse Engineering des C-Codes?

Ergäntung von mir:
Wie wäre es mit 'gleich in C schreiben'

Komm jetzt nicht mit 'Ich kann kein C'. Denn: Assembler kannst du ja 
auch nicht, wenn ich mir den Code da oben so ansehe.

von spess53 (Gast)


Lesenswert?

Hi

>Komm jetzt nicht mit 'Ich kann kein C'. Denn: Assembler kannst du ja
>auch nicht, wenn ich mir den Code da oben so ansehe.

Bleibt nur die Frage nach den kleineren Übel.

MfG Spess

von Philip O. (versipellis)


Lesenswert?

Karl heinz Buchegger schrieb:
> Komm jetzt nicht mit 'Ich kann kein C'. Denn: Assembler kannst du ja
> auch nicht, wenn ich mir den Code da oben so ansehe.

Wieso was soll mit dem Code denn sein?Ich weiß dass ich die rcall auch 
direkt machen kann...aber was soll denn damit sein?

spess53 schrieb:
> Ich habe das mal für den SHT11 gemacht. Vielleicht hilft es dir.

Danke für die Hilfe, ist der SHT11 nicht von den Befehlen her gleich wie 
der SHT71?

von spess53 (Gast)


Lesenswert?

Hi

>Danke für die Hilfe, ist der SHT11 nicht von den Befehlen her gleich wie
>der SHT71?

Ist der gleiche Sensor. Nur anders verpackt.

MfG Spess

von Philip O. (versipellis)


Lesenswert?

So ich habe nun einen etwas anderen Code geschrieben...nur ist mir noch 
nicht ganz schlüssig, warum er nicht funktioniert(ist nur die Routine, 
aber schon mit der funktioniert es nicht und ich weiß nicht warum):
1
.equ SENSOR_PORT = PORTC
2
.equ SENSOR_DDR  = DDRC
3
.equ SENSOR_PIN  = PINC
4
.equ PIN_DATA   = 4
5
.equ PIN_CLK    = 3
6
7
.def  rhl=r8
8
.def  rhh=r9
9
10
.def  tl=r10
11
.def  th=r11
12
13
.def  rel=r12
14
.def  reh=r13
15
16
.def  trt=r14
17
18
.def  rhrt=r15
19
20
.ifndef XTAL
21
.equ XTAL = 4000000
22
.endif
23
24
;Kurze Pause        
25
shortbreak:                            ; 50us Pause
26
        ldi  temp1, ( XTAL * 50 / 3 ) / 1000000
27
shortbreak_:
28
        dec  temp1
29
        brne shortbreak_
30
        ret                         ; wieder zurück
31
32
dlow:  sbi SENSOR_DDR,PIN_DATA    ;set data low
33
  rjmp rdelay
34
  
35
dhigh:  cbi SENSOR_DDR,PIN_DATA    ;set data high
36
  rjmp rdelay
37
  
38
39
clow:  cbi SENSOR_PORT,PIN_CLk    ;set clock low
40
  rjmp rdelay
41
  
42
chigh:  sbi SENSOR_PORT,PIN_CLK    ;set clock high
43
44
rdelay:  push temp1      ;1 msek delay to allow the lines to settle
45
  push temp2
46
  ldi temp1,1
47
  rcall g_wms
48
  pop temp2
49
  pop temp1
50
  ret
51
52
;-------PAUSE----------
53
g_wms:  ldi temp2,250  ;wait zl msec  (at 4MHz clock)
54
g_wmsa:  rcall g_wmsb
55
  nop
56
  nop
57
  nop
58
  nop
59
  nop
60
  dec temp2
61
  brne g_wmsa
62
  dec temp1
63
  brne g_wms
64
g_wmsb:  ret  
65
66
67
68
readsh11:
69
  clr trt
70
  
71
  clr rhrt
72
  
73
  cbi SENSOR_PORT,PIN_CLK    ;init clock line
74
  sbi SENSOR_DDR,PIN_CLK
75
  
76
  cbi SENSOR_PORT,PIN_DATA    ;init data line
77
  cbi SENSOR_DDR,PIN_DATA
78
  
79
  rcall rdelay
80
  
81
  
82
  ldi temp1 ,10    ;connection reset sequence
83
  
84
re1:  rcall chigh
85
  rcall clow
86
  dec temp1
87
  brne re1
88
89
90
  rcall chigh    ;transmission start
91
  rcall dlow
92
  rcall clow
93
  rcall chigh
94
  rcall dhigh
95
  rcall clow
96
    
97
    
98
  ldi temp1,0b00000101  ;send byte: command for 'check RH'
99
  rcall sendbyte
100
;---------  
101
        ;wait for sensor ready 
102
re3:  ldi temp1,2
103
  rcall g_wms
104
  sbis SENSOR_PIN,PIN_DATA
105
  rjmp re2
106
  inc rhrt
107
  brne re3
108
  
109
re4:  rjmp reto    ;sensor timed out (512 ms)
110
  
111
re2:  rcall readbyte    ;read one byte
112
113
  mov rhh,temp2
114
115
  rcall dlow    ;acknowlegde
116
  rcall chigh
117
  rcall clow
118
  rcall dhigh  
119
  
120
  rcall readbyte    ;readbyte
121
  
122
  mov rhl,temp2
123
  
124
  rcall chigh    ;skip acknowlegde to end communication
125
  rcall clow
126
  
127
  
128
        ;--------read temperature
129
        
130
131
  rcall chigh    ;transmission start
132
  rcall dlow
133
  rcall clow
134
  rcall chigh
135
  rcall dhigh
136
  rcall clow
137
    
138
    
139
  ldi temp1,0b00000011  ;send byte: command for 'check temp'
140
  rcall sendbyte
141
  
142
        ;wait for sensor ready 
143
rew3:  ldi zl,2
144
  rcall g_wms
145
  sbis SENSOR_PIN,PIN_DATA
146
  rjmp rew2
147
  inc trt
148
  brne rew3
149
  
150
rew4:  rjmp reto    ;sensor timed out (512 ms)
151
  
152
rew2:  rcall readbyte    ;read one byte
153
154
  mov th,r16
155
156
  rcall dlow    ;acknowlegde
157
  rcall chigh
158
  rcall clow
159
  rcall dhigh  
160
  
161
  rcall readbyte    ;readbyte
162
  
163
  mov tl,r16
164
  
165
  rcall chigh    ;skip acknowlegde to end communication
166
  rcall clow
167
  
168
  ret
169
  
170
;-----------time out
171
172
reto:  movw temp1,rel
173
  inc temp1    ;increase number of timeouts
174
  movw rel,temp1
175
176
  ret
177
  
178
  
179
  
180
  
181
182
;------------  
183
  
184
readbyte:
185
  ldi temp1,8
186
  
187
ree1:  clc      ;Read bit
188
  sbic SENSOR_PIN,PIN_DATA    
189
  sec      
190
    
191
  rol temp2
192
  
193
  rcall chigh
194
  rcall clow
195
  
196
  dec temp1
197
  brne ree1
198
199
  ret
200
  
201
  
202
203
;----------
204
205
206
sendbyte:
207
  ldi temp1,8    ;send 8 bits
208
se3:  lsl temp2
209
  brcc se1
210
  rcall dhigh
211
  rjmp se2
212
se1:
213
  rcall dlow
214
se2:  
215
  rcall chigh
216
  rcall clow
217
  dec temp1
218
  brne se3
219
220
  rcall dhigh    ;release dataline
221
222
  clc      ;check ack
223
  sbic SENSOR_PORT,PIN_DATA    ;c=0: ack recieved
224
  sec      ;c=1: ack not recieved
225
  
226
  in temp2,sreg
227
  push temp2
228
  
229
  rcall chigh    ;flush ack bit
230
  rcall clow
231
  
232
  pop temp2
233
  out sreg,temp2
234
  
235
  
236
  ret

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.