Forum: Mikrocontroller und Digitale Elektronik Temperaturfehler


von Andre B. (andre-atmega168)


Angehängte Dateien:

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?


1
sendSPI:
2
  ldi  r20,0b00101110  ; master [clk(5) mosi(3)  ss(2)]=outp
3
  out  DDRB,r20
4
  in  r16,SPSR  ; dummy read
5
  ldi  r20,0b11111111  ; Befehl[FF] für Temp-Sensor(Temp senden)
6
  cbi  portb,2  ; bit 2 von portb auf 0 = cs low
7
  out  spdr,r20  ; 1.byte senden
8
  ret
9
10
receiveSPI:
11
  in  r16,SPSR
12
  sbrs  r16,SPIF  ; warte auf transmitflag
13
  rjmp  receiveSPI
14
  ;sbi  portb,2  ; cs auf high
15
  in  r18,spdr  ; 1.Byte wird empfangen
16
  out  spdr,r20  ; 2.Byte senden
17
  ret
18
receiveSPI2:
19
  in  r16,SPSR
20
  sbrs  r16,SPIF  ; warte auf transmitflag
21
  rjmp  receiveSPI2
22
  sbi  portb,2  ; cs auf high
23
  in  r19,spdr  ; 2.Byte wird empfangen
24
25
  ret
26
27
;--------------------------------------------------------------
28
29
30
getPWM:
31
  lds  r16,UCSR0A
32
  sbrs  r16,7  ; Alle Daten im UDR-Register...
33
  ret    ; ... wenn nicht, dann Rücksprung
34
  lds  serdatin,UDR0  ; ... wenn doch,  dann Zeichen abholen
35
  sts  OCR1AL,serdatin  ; PWM bedienen
36
  
37
38
putTemp:
39
40
  lds  r16,UCSR0A
41
  sbrs  r16,5  ; Senderegister nicht leer?
42
  ret    ; ... dann Rücksprung
43
  ;rjmp  putTemp    ;anstatt ret
44
  sts  UDR0,r18
45
46
  ;lds  r16,UCSR0A
47
  ;sbrs  r16,5  ; Senderegister nicht leer?
48
  ;ret    ; ... dann Rücksprung
49
  sts  UDR0,r19
50
51
  
52
53
54
55
  ret    ; nächstes Zeichen

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


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?

von Andre-Atmega168 (Gast)


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:
1
wdr 
2
ldi r16,0
3
ldi r17,0
4
5
loop:
6
add r1,r2
7
dec r17
8
brne loop
9
dec r16
10
brne loop
11
rcall sendSPI
12
rcall sendSPI2
13
rcall getPWM
14
15
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.

von Andre-Atmega168 (Gast)


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.

1
 
2
sendSPI:
3
  ldi  r20,0b00101110  ; master [clk(5) mosi(3)  ss(2)]=outp
4
  out  DDRB,r20
5
  in  r16,SPSR  ; dummy read
6
  ldi  r20,0b11111111  ; Befehl[FF] für Temp-Sensor(Temp senden)
7
  cbi  portb,2  ; bit 2 von portb auf 0 = cs low
8
  out  spdr,r20  ; 1.byte senden
9
  ret
10
11
receiveSPI:
12
  in  r16,SPSR
13
  sbrs  r16,SPIF  ; warte auf transmitflag
14
  rjmp  receiveSPI
15
  ;sbi  portb,2  ; cs auf high
16
  in  r18,spdr  ; 1.Byte wird empfangen
17
  out  spdr,r20  ; 2.Byte senden
18
  ret
19
receiveSPI2:
20
  in  r16,SPSR
21
  sbrs  r16,SPIF  ; warte auf transmitflag
22
  rjmp  receiveSPI2
23
  sbi  portb,2  ; cs auf high
24
  in  r19,spdr  ; 2.Byte wird empfangen
25
26
  ret
27
28
29
putTemp:
30
31
  lds  r16,UCSR0A
32
  sbrs  r16,5  ; Senderegister nicht leer?
33
  ret    ; ... dann Rücksprung
34
  ;rjmp  putTemp    ;anstatt ret
35
  sts  UDR0,r18
36
37
  ;lds  r16,UCSR0A
38
  ;sbrs  r16,5  ; Senderegister nicht leer?
39
  ;ret    ; ... dann Rücksprung
40
  sts  UDR0,r19

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.