Hallo, ATmega 168 MYSmartControl Standard Temp-Sensor: LM74 möchte über SPI mit einem ditgialen Temp-Sensor kommunizieren. Senden kann ich schon, allerdings wird der Befehl fortwährend aus dem SPDR geschrieben. Jetzt komme ich nicht weiter. Wie kann ich über SPI den Temp-Sensor auslesen. Schickt der mir automatisch die Temperatur die ich dann einfach im SPDR speicher? und ich vorher den Port von MOSI auf MISO schlaten muss? ;spi_ini: ; Set MOSI and SCK in, miso out ,all others input ldi r17,0b00101110 ; master ;ldi r17,0b00101100 out DDRB,r17 ; Enable SPI, Master, set clock rate ldi r17,0b01010011 ;(1<<SPE)|(1<<MSTR)|(1<<SPR0) out SPCR,r17 sendSPI: ldi r20,0b00101110 ; master [clk(5) mosi(3) ss(2)]=outp out DDRB,r20 in r16,SPSR ; dummy read ldi r20,0b10101010 ; Befehl[FF] für Temp-Sensor(Temp senden) cbi portb,2 ; bit 2 von portb auf 0 = cs low out spdr,r20 ;rjmp SEND_SPI ;sbi portb, 2 ret
Ich bin leider des asm nicht mächtig, aber es dürfte leicht sein, diese C-Routinen nach asm zu portieren.
1 | void spiinit(void) { |
2 | |
3 | DDRB = (1<<PB4)|(1<<PB5)|(1<<PB7); // set PB4(SS), PB5 (MOSI) and PB7 (SCK) output, all others input |
4 | |
5 | SPCR = (1<<SPE)|(1<<MSTR); // enable SPI, Master, set clock rate fck/4 |
6 | |
7 | PORTB |= (1 << PB7)|(1 << PB4); |
8 | }
|
9 | |
10 | unsigned char spi(unsigned char data) |
11 | {
|
12 | SPDR = data; |
13 | loop_until_bit_is_set(SPSR, SPIF); |
14 | |
15 | return SPDR; |
16 | }
|
17 | |
18 | void select(void) { |
19 | PORTB &= ~(1<<PB4); |
20 | }
|
21 | |
22 | void unselect(void) { |
23 | PORTB |= (1<<PB4); |
24 | }
|
Nach dem KISS-Prinzip =)
Hallo und guten morgen kann eh nicht schlafen ;-( Deine Spi_ini sieht aufm ersten Blick ok aus. send _SPI würde ich so machen. send_SPI: out SPDR, temp1 //in temp1 sind Daten lp7: sbis SPSR, SPIF rjmp lp7 ret GRUSS
Aso, sry fehlt natürlich das setzen des ChipSelects, welches wahrscheinlich auf low gesetzt werden muss, vor meiner send_SPI ! GRUSS
Hallo, send_SPI: lp7: sbis SPSR, SPIF rjmp lp7 out SPDR, temp1 //in temp1 sind Daten ret ist merklich sinnvoller. Warum soll der AVR beim Senden warten, bis der Hardware-SPI fertig ist? Der kann inzwischen was sinnvolleres machen, deshalb ja Hardware-SPI. Gruß aus Berlin Michael
Warum immer dieses Assembler ???? zum Debuggen ist es Ok wenn man es kann, aber zum Programmieren geht das in Richtung SadoMaso. C ist wesentlich flexibler, und es kann (fast) jeder lesen und interpretieren. Bei Assembler geht das nicht. Aber jetzt zur Frage: MOSI , MISO und CLOCK werden fest verdrahtet und NIEMALS umgeschaltet. Der µC ist der Master ( das ist das M in MISO und MOSI ) Dein Sensor der Slave ( das ist das S in MISO und MOSI ) 1. Zuerst wird der Chipselect Pin des Slave(Sensor) auf Aktiv gesetzt ( Blick ins Datenblatt ob High oder Low Aktiv) ; gibt es nur eine Slave kann der Pin eventuell auch hart verdrahtet auf aktiv stehen, es sei denn das hier ein Flankenwechsel erkannt werden muss (Datenblatt ) 2. Datenbyte in das SPI Register des Masters legen ; Normalerweise startet das SPI interface jetzt die Übertragung ( im Datenblatt nachsehen ob dieser µC dazu eine zusätzliche Aktion benötigt oder nicht) 3. Das SPI interface taktet nun das Datenbyte zum Slave und mit dem gleichen Takt gelangt das Datenbyte des Sensors zum Master. 4. Empfangenes Byte aus dem SPI Register des µC auslesen.( das erste empfangene Byte ist meistens zum wegwerfen, Dummybyte des Slave) 5a. werden weitere Bytes benötigt Sprung zu Punkt 2. 5b. nach dem letzten Byte Chipselect Pin des Slave auf nicht aktiv setzen. Bei vielen Sensoren ist es so, das im ersten übertragenen Byte das Kommando steht was der Sensor an Daten liefern soll. Danach muss dann eine entsprechenden Anzahl an "dummy" bytes gesendet werden. Beispiel: Der Sensor soll die Temperatur liefern, ein 16 bit wert 1. Byte von µC zu Sensor ist das Kommandobyte für "Temperaturausgabe" (Datenblatt) 2. Byte von µC zu Sensor ist ein Dummybyte, der Sensor liefert jetzt die ersten 8 bit der Temperatur 3. Byte von µC zu Sensor ist ein Dummybyte, der Sensor liefert jetzt die restlichen 8 bit der Temperatur Zusammengefasst : Datenblätter lesen !!!!!!!!! Dann erübrigen sich viele der hier im Forum gestellten Fragen. ( bitte nicht persönlich nehmen, so ist es nicht gemeint )
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.