mikrocontroller.net

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


Autor: Andre B. (andre-atmega168)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nico Erfurth (masta79)
Datum:

Bewertung
0 lesenswert
nicht 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:
int16_t current_temp;
clear_bit(PORTB, PB4);

SPDR = 0;
loop_until_bit_is_set(SPSR, SPIF);
current_temp = (SPDR << 8);

SPDR = 0;
loop_until_bit_is_set(SPSR, SPIF);
current_temp |= SPDR;

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.

Autor: Andre B. (andre-atmega168)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich kann immer noch keine 16Bit empfangen. Aus r18 bekomme ich irgendein 
Datenmüll und aus r19 kriege ich nix geliefert.
receiveSPI:
  in  r16,SPSR
  sbrs  r16,SPIF  ; warte auf transmitflag
  rjmp  receiveSPI
  in  r18,spdr  ; 1.Byte wird empfangen
  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
  sbi  portb,2
  
  ret

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

Autor: Nico Erfurth (masta79)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andre B. (andre-atmega168)
Datum:

Bewertung
0 lesenswert
nicht 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

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.