www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DS18B20 Auslesen


Autor: Fabian Oehlmann (foehlmann)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Gemeinde,

ich versuche mit folgendem Code einen DS18B20 auszulesen!
Leider erhalte ich immer eine Ausgabe von 1111 1111 1111 1111 !

Der Sensor ist per +5V, 1-Wire-Bus mit 4,7k an +5V und GND 
angeschlossen. Der 1-Wire Bus ist an PA7 angeschlossen!

uC ist ein ATmega 16, mit internem Takt 1Mhz betrieben

Wäre super wenn jemand einen Tipp hat!

Gruß
Fabian

Autor: Fabian Oehlmann (foehlmann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Echt keiner eine Idee?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es mit der lcd-routines.asm aus dem AVR-Tutorial im 
Simulator laufen lassen. Die doppelte Definition von r22/r23 habe ich 
bereinigt.

1/ Wesentlicher Bug in sensor.asm: ConT läuft in SendScratchpad weil 
ein ret fehlt. Es sieht auch so aus, als ob du an der Stelle das 
Original geändert hast.

2/ Nachsehen: Hast du die Wartezeiten selbst implementiert? Die sind 
etwas ungenau: Soll/ist 480/487 10/17 58/65 2/9.

Weiter habe ich nicht simuliert.

Autor: Fabian Oehlmann (foehlmann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, ich werde es gleich mal probieren!

Womit hast du das ganze simuliert?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Womit hast du das ganze simuliert?

AVR Studio.

Weitere siehe AVR-Simulation. Du musst es nur schaffen, dein 
Programm in den Simulator reinzuschaffen und dass es Funktionen für Step 
(Einzelschritt) und fürs bequeme Simulieren Step Over (Überspringen wg. 
der langen Wartefunktionen) dort gibt.

Autor: Fabian Oehlmann (foehlmann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal vielen Dank für die Tipps, ich kann nun den Sensor auslesen und 
den Wert Binär auf dem Display ausgeben!

Nun habe ich zum Beispiel den Wert: 0000 0010 0101 1110 - was ja 
37,875°C laut Datenblatt entspricht. Nun möchte ich eine Verzweigung 
haben, welche zwischen Über- und Unterschreitung dieser Temperatur 
entscheidet.

Kann mir da noch einmal jemand auf die Sprünge helfen?!

Wäre super!

Danke
Fabian

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry ASM debuggen OK, schreiben tue ich es nur, wenn es nicht anders 
geht :)

http://www.mikrocontroller.net/articles/AVR-Tutori...
http://www.mikrocontroller.net/articles/AVR-Tutori...

Autor: Fabian Oehlmann (foehlmann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ich habe mich damit noch mal ein wenig auseinandergesetzt!

In 8 Bit würde es dann ja ca. so Aussehen, angenommen r16 wäre der 
gelesene Wert:
loop:
cpi r16, 0b01011110
brsh heizung_aus
brlo heizung_ein
rjmp loop

heizung_aus:
ldi r21, 0b00000000
out PortC, r21
rjmp loop

heizung_ein:
ldi r21, 0b11000000
out PortC, r21
rjmp loop

allerdings habe ich ja leider einen Wert von 0000 0010 0101 1110 als 
"Soll-Wert" und den Wert vom DS18B20 aus "Ist-Wert". Wie kann ich diese 
beiden nun direkt vergleichen?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke der CPC Befehl ist dein Freund! Hier aus der Hilfe des AVR 
Studios:


Syntax:          Operands:                          Program Counter:
CPC Rd,Rr        0 ≤ d ≤ 31, 0 ≤ r ≤ 31             PC <- PC + 1

Operation:
Rd - Rr - C

Example:
; Compare r3:r2 with r1:r0

  cp r2,r0    ; Compare low byte
  cpc r3,r1   ; Compare high byte
  brne noteq  ; Branch if not equal
...
noteq: 
  nop         ; Branch destination (do nothing)

Du liest ja in r25 das Highbyte und Lowbyte des Sensors ja nacheinander 
aus. Wenn du freie Register hast, kannst du die füllen und vergleichen. 
so etwa (ohne Rücksicht auf effiziente Registernutzung!)
  ...
  rcall ReadScratchpad  ; Scratchpad Byte 2 Empfangen
  mov r3, r25           ; Highbyte retten
  rcall lcd_clear 
  rcall Binaerausgabe   ; Bildschirmausgabe
  clr r24
  rcall ReadScratchpad  ; Scratchpad Byte 1 Empfangen
  mov r2, r25           ; Lowbyte retten
  rcall Binaerausgabe   ; Bildschirmausgabe

; 16-Bit Vergleich mit Vorzeichen
  ldi r0, LOW(0b0000001001011110)
  ldi r1, HIGH(0b0000001001011110)
  cp  r2,r0
  cpc r3,r1
  brge heizung_aus
  rjmp heizung_ein 

heizung_aus:
  ldi r21, 0b00000000
  out PortC, r21
  rjmp loop

heizung_ein:
  ldi r21, 0b11000000
  out PortC, r21
  rjmp loop

Autor: Fabian Oehlmann (foehlmann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke dir, habe eben auch gerade eine funktionierende Lösung 
geschrieben!

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.