www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Temperaturfehler


Autor: Andre B. (andre-atmega168)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

MySmartControlM168
Temp-Sensor: LM74

ich lese über Labview(Visa-Schnittstelle) die Temperatur ein. Diesen 
Sensor habe ich an Controller MySmartUSBM168 angeschlossen.
Zum Problem:
Bei 20°C ist immer ein Sprung, der sich bei über oder unterschreiten der 
kritischen Temp wieder normaliesiert. die ersten bytes sind dann auch 
auf high gesetzt, was eigentlich nur bei negativen Temperaturen 
vorkommt. Hat jemand ne Idee, woher dieser Sprung kommt?


sendSPI:
  ldi  r20,0b00101110  ; master [clk(5) mosi(3)  ss(2)]=outp
  out  DDRB,r20
  in  r16,SPSR  ; dummy read
  ldi  r20,0b11111111  ; Befehl[FF] für Temp-Sensor(Temp senden)
  cbi  portb,2  ; bit 2 von portb auf 0 = cs low
  out  spdr,r20  ; 1.byte senden
  ret

receiveSPI:
  in  r16,SPSR
  sbrs  r16,SPIF  ; warte auf transmitflag
  rjmp  receiveSPI
  ;sbi  portb,2  ; cs auf high
  in  r18,spdr  ; 1.Byte wird empfangen
  out  spdr,r20  ; 2.Byte senden
  ret
receiveSPI2:
  in  r16,SPSR
  sbrs  r16,SPIF  ; warte auf transmitflag
  rjmp  receiveSPI2
  sbi  portb,2  ; cs auf high
  in  r19,spdr  ; 2.Byte wird empfangen

  ret

;--------------------------------------------------------------


getPWM:
  lds  r16,UCSR0A
  sbrs  r16,7  ; Alle Daten im UDR-Register...
  ret    ; ... wenn nicht, dann Rücksprung
  lds  serdatin,UDR0  ; ... wenn doch,  dann Zeichen abholen
  sts  OCR1AL,serdatin  ; PWM bedienen
  

putTemp:

  lds  r16,UCSR0A
  sbrs  r16,5  ; Senderegister nicht leer?
  ret    ; ... dann Rücksprung
  ;rjmp  putTemp    ;anstatt ret
  sts  UDR0,r18

  ;lds  r16,UCSR0A
  ;sbrs  r16,5  ; Senderegister nicht leer?
  ;ret    ; ... dann Rücksprung
  sts  UDR0,r19

  



  ret    ; nächstes Zeichen


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

Bewertung
0 lesenswert
nicht lesenswert
Ein paar Fragen hätte ich noch:
Wie ist der Sensor beschaltet (uC<->LM74)?
Was passiert, wenn du den Sensor langsam abkühlst?
Wie werden die Subroutinen aufgerufen (receiveSPI,receiveSPI2)?
Welchen SPI-Mode verwendest du?

Autor: Andre-Atmega168 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

1.
Der I/O Kanal ist auf MISO(PB4), die CLK auf SCK(PB5), der CS aus 
SS(PB2).
Der Sensor hat nur einen Kanal für den Ein- und Ausgang.

2.
Wenn der Sensor lamgsam abgekühlt wird, dann ist der Fehler auch da, 
allerdings tritt er dann auch wesentlich länger auf, da die kritische 
Temepratur länger gehlaten wird,

3.
mainloop:
wdr 
ldi r16,0
ldi r17,0

loop:
add r1,r2
dec r17
brne loop
dec r16
brne loop
rcall sendSPI
rcall sendSPI2
rcall getPWM

rjmp mainloop

4.
im SPI Control Register habe ich SPI Enable, Master SPI Modus auf high 
gestellt. Den prescaler habe ich auf f(osc)/64 gestellt.

Autor: Andre-Atmega168 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mir ist noch etwas aufgefallen, bei der kritischen Temperatur von 20°C 
kommt ein Dreher in der Byte-Reihenfolge. Bei der Temperatur kommt 
zuerst das 2.Byte und dann das 1.Byte. Ich vermute das der Controller 
die Visa schnittstelle überlädt. Ich weiss aber nicht warum das nur bei 
20-21°C ist. Kann ich mein Assembler Programm, siehe unten, etwas 
schlauer machen. Ich habe keine Idee mehr.

 
sendSPI:
  ldi  r20,0b00101110  ; master [clk(5) mosi(3)  ss(2)]=outp
  out  DDRB,r20
  in  r16,SPSR  ; dummy read
  ldi  r20,0b11111111  ; Befehl[FF] für Temp-Sensor(Temp senden)
  cbi  portb,2  ; bit 2 von portb auf 0 = cs low
  out  spdr,r20  ; 1.byte senden
  ret

receiveSPI:
  in  r16,SPSR
  sbrs  r16,SPIF  ; warte auf transmitflag
  rjmp  receiveSPI
  ;sbi  portb,2  ; cs auf high
  in  r18,spdr  ; 1.Byte wird empfangen
  out  spdr,r20  ; 2.Byte senden
  ret
receiveSPI2:
  in  r16,SPSR
  sbrs  r16,SPIF  ; warte auf transmitflag
  rjmp  receiveSPI2
  sbi  portb,2  ; cs auf high
  in  r19,spdr  ; 2.Byte wird empfangen

  ret


putTemp:

  lds  r16,UCSR0A
  sbrs  r16,5  ; Senderegister nicht leer?
  ret    ; ... dann Rücksprung
  ;rjmp  putTemp    ;anstatt ret
  sts  UDR0,r18

  ;lds  r16,UCSR0A
  ;sbrs  r16,5  ; Senderegister nicht leer?
  ;ret    ; ... dann Rücksprung
  sts  UDR0,r19

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.