www.mikrocontroller.net

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

Autor: Andre B. (andre-atmega168)
Datum: 20.07.2008 00:47

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: 20.07.2008 00:54

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: 22.07.2008 21:36

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: 22.07.2008 21:45

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: 22.07.2008 21:56

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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net