Temperaturfehler

OP #959419
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
Angehängte Dateien:
Gast #959613
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.
Gast #961059
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren