Forum: Mikrocontroller und Digitale Elektronik 16 Bit von Temp-Senor empfangen


von Andre B. (andre-atmega168)


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

von Nico E. (masta79)


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.

von Andre B. (andre-atmega168)


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.

von Nico E. (masta79)


Lesenswert?

Das ist ja anscheinend nicht die komplette Funktion. Da fehlt das 
Slave-Select und natürlich musst du SPDR auch noch beschreiben (vor 
jedem einzelnen receive), damit die SPI überhaupt losrennt.

von Andre B. (andre-atmega168)


Lesenswert?

chips select ist drinne. Das Sende an den SPI habe ich nicht nochmal 
geschrieben, habe ich ganz oben schon reingestellt.
allerdings habe ich nur einmal spi senden und dann zweimal spi empfangen 
programmiert

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.