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
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.