16 Bit von Temp-Senor empfangen

#931330
Lesenswert?

Hallo

ATmega 168
Temp-Sensor: LM74

bisher kriege ich ein 8 bit Wert vom Temp-Sensor über SPI. Würde wegen 
höehere Genauikeit aber 16 Bit empfangen. Der Senor kann das auch. Nur 
wie setze ich das im Programm um.


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  tempout,spdr  ; 1.Byte wird empfangen
  ret
#931337
Lesenswert?

Einfach zwei mal Dein receiveSPI aufrufen während Du das CS des LM74 auf 
low hälst. Und dann halt entsprechend in die variablen packen.

In C sieht das ganze bei mir so aus:
1
int16_t current_temp;
2
clear_bit(PORTB, PB4);
3

4
SPDR = 0;
5
loop_until_bit_is_set(SPSR, SPIF);
6
current_temp = (SPDR << 8);
7

8
SPDR = 0;
9
loop_until_bit_is_set(SPSR, SPIF);
10
current_temp |= SPDR;
11

12
set_bit(PORTB, PB4);

Nachtrag:
Weil ich es grad sehe, der LM74 sendet mit den ersten 2 Byte direkt den 
aktuellen Wert, du brauchst ihn nicht extra via Kommando abfragen.
#934177
Lesenswert?

Hi,
ich kann immer noch keine 16Bit empfangen. Aus r18 bekomme ich irgendein 
Datenmüll und aus r19 kriege ich nix geliefert.
1
receiveSPI:
2
  in  r16,SPSR
3
  sbrs  r16,SPIF  ; warte auf transmitflag
4
  rjmp  receiveSPI
5
  in  r18,spdr  ; 1.Byte wird empfangen
6
  ret
7

8
receiveSPI2:
9
  in  r16,SPSR
10
  sbrs  r16,SPIF  ; warte auf transmitflag
11
  rjmp  receiveSPI2
12
  ;sbi  portb,2  ; cs auf high
13
  in  r19,spdr  ; 2.Byte wird empfangen
14
  sbi  portb,2
15
  
16
  ret

Kann ich r18 und r19 dann in das X register schreiben, so dass in einem 
Register einen 16 Bit Wert habe.

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