mikrocontroller.net

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


Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht 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:
.equ SENSOR_PORT = PORTC
.equ SENSOR_DDR  = DDRC
.equ PIN_DATA   = 4
.equ PIN_CLK    = 3

.ifndef XTAL
.equ XTAL = 4000000
.endif

;Kurze Pause        
shortbreak:                            ; 50us Pause
        ldi  temp1, ( XTAL * 50 / 3 ) / 1000000
shortbreak_:
        dec  temp1
        brne shortbreak_
        ret                         ; wieder zurück

set_Data:
        cbi    SENSOR_DDR,    PIN_DATA
        ret

clear_Data:
        sbi SENSOR_DDR,    PIN_DATA
        ret

set_Clock:
        cbi SENSOR_PORT, PIN_CLK
        ret

clear_Clock:
        sbi SENSOR_PORT, PIN_CLK
        ret
              
;Startsequenz einer Übertragung von SHT71
sensor_transmission_start:
        
        rcall set_Data                ; Data auf HIGH
        rcall clear_Clock            ; Clock auf LOW
        rcall shortbreak            ; Kurze Pause
        rcall set_Clock                 ; Clock HIGH
        rcall shortbreak            ; Kurze Pause
        rcall clear_Data            ; Data auf LOW
        rcall shortbreak            ; Kurze Pause
        rcall clear_Clock            ; Clock LOW
        rcall shortbreak            ; Kurze Pause
        rcall set_Clock                ; Clock HIGH
        rcall shortbreak            ; Kurze Pause
        rcall set_Data                ; Data auf HIGH
        rcall shortbreak            ; Kurze Pause
        rcall clear_Clock            ; Clock auf LOW
        ret
;Resetsequenz
sensor_reset:
        clr      temp3
        rcall clear_Clock
        rcall set_Data                ;Data auf HIGH
        ldi      temp1, 9             ;Counter für Schleife
reset_loop:
        dec   temp1
        rcall set_Clock               ;Toggeln des SCK
        rcall clear_Clock
        brne  reset_loop
        ret

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir da niemand helfen?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: spess53 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht 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):
.equ SENSOR_PORT = PORTC
.equ SENSOR_DDR  = DDRC
.equ SENSOR_PIN  = PINC
.equ PIN_DATA   = 4
.equ PIN_CLK    = 3

.def  rhl=r8
.def  rhh=r9

.def  tl=r10
.def  th=r11

.def  rel=r12
.def  reh=r13

.def  trt=r14

.def  rhrt=r15

.ifndef XTAL
.equ XTAL = 4000000
.endif

;Kurze Pause        
shortbreak:                            ; 50us Pause
        ldi  temp1, ( XTAL * 50 / 3 ) / 1000000
shortbreak_:
        dec  temp1
        brne shortbreak_
        ret                         ; wieder zurück

dlow:  sbi SENSOR_DDR,PIN_DATA    ;set data low
  rjmp rdelay
  
dhigh:  cbi SENSOR_DDR,PIN_DATA    ;set data high
  rjmp rdelay
  

clow:  cbi SENSOR_PORT,PIN_CLk    ;set clock low
  rjmp rdelay
  
chigh:  sbi SENSOR_PORT,PIN_CLK    ;set clock high

rdelay:  push temp1      ;1 msek delay to allow the lines to settle
  push temp2
  ldi temp1,1
  rcall g_wms
  pop temp2
  pop temp1
  ret

;-------PAUSE----------
g_wms:  ldi temp2,250  ;wait zl msec  (at 4MHz clock)
g_wmsa:  rcall g_wmsb
  nop
  nop
  nop
  nop
  nop
  dec temp2
  brne g_wmsa
  dec temp1
  brne g_wms
g_wmsb:  ret  



readsh11:
  clr trt
  
  clr rhrt
  
  cbi SENSOR_PORT,PIN_CLK    ;init clock line
  sbi SENSOR_DDR,PIN_CLK
  
  cbi SENSOR_PORT,PIN_DATA    ;init data line
  cbi SENSOR_DDR,PIN_DATA
  
  rcall rdelay
  
  
  ldi temp1 ,10    ;connection reset sequence
  
re1:  rcall chigh
  rcall clow
  dec temp1
  brne re1


  rcall chigh    ;transmission start
  rcall dlow
  rcall clow
  rcall chigh
  rcall dhigh
  rcall clow
    
    
  ldi temp1,0b00000101  ;send byte: command for 'check RH'
  rcall sendbyte
;---------  
        ;wait for sensor ready 
re3:  ldi temp1,2
  rcall g_wms
  sbis SENSOR_PIN,PIN_DATA
  rjmp re2
  inc rhrt
  brne re3
  
re4:  rjmp reto    ;sensor timed out (512 ms)
  
re2:  rcall readbyte    ;read one byte

  mov rhh,temp2

  rcall dlow    ;acknowlegde
  rcall chigh
  rcall clow
  rcall dhigh  
  
  rcall readbyte    ;readbyte
  
  mov rhl,temp2
  
  rcall chigh    ;skip acknowlegde to end communication
  rcall clow
  
  
        ;--------read temperature
        

  rcall chigh    ;transmission start
  rcall dlow
  rcall clow
  rcall chigh
  rcall dhigh
  rcall clow
    
    
  ldi temp1,0b00000011  ;send byte: command for 'check temp'
  rcall sendbyte
  
        ;wait for sensor ready 
rew3:  ldi zl,2
  rcall g_wms
  sbis SENSOR_PIN,PIN_DATA
  rjmp rew2
  inc trt
  brne rew3
  
rew4:  rjmp reto    ;sensor timed out (512 ms)
  
rew2:  rcall readbyte    ;read one byte

  mov th,r16

  rcall dlow    ;acknowlegde
  rcall chigh
  rcall clow
  rcall dhigh  
  
  rcall readbyte    ;readbyte
  
  mov tl,r16
  
  rcall chigh    ;skip acknowlegde to end communication
  rcall clow
  
  ret
  
;-----------time out

reto:  movw temp1,rel
  inc temp1    ;increase number of timeouts
  movw rel,temp1

  ret
  
  
  
  

;------------  
  
readbyte:
  ldi temp1,8
  
ree1:  clc      ;Read bit
  sbic SENSOR_PIN,PIN_DATA    
  sec      
    
  rol temp2
  
  rcall chigh
  rcall clow
  
  dec temp1
  brne ree1

  ret
  
  

;----------


sendbyte:
  ldi temp1,8    ;send 8 bits
se3:  lsl temp2
  brcc se1
  rcall dhigh
  rjmp se2
se1:
  rcall dlow
se2:  
  rcall chigh
  rcall clow
  dec temp1
  brne se3

  rcall dhigh    ;release dataline

  clc      ;check ack
  sbic SENSOR_PORT,PIN_DATA    ;c=0: ack recieved
  sec      ;c=1: ack not recieved
  
  in temp2,sreg
  push temp2
  
  rcall chigh    ;flush ack bit
  rcall clow
  
  pop temp2
  out sreg,temp2
  
  
  ret

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.