www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI-Schnittstellen Programmierung


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

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

Autor: Teplotaxl X. (t3plot4x1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin leider des asm nicht mächtig, aber es dürfte leicht sein, diese 
C-Routinen nach asm zu portieren.
void spiinit(void) {

    DDRB = (1<<PB4)|(1<<PB5)|(1<<PB7);      // set PB4(SS), PB5 (MOSI) and PB7 (SCK) output, all others input

    SPCR = (1<<SPE)|(1<<MSTR);           // enable SPI, Master, set clock rate fck/4  
  
    PORTB |= (1 << PB7)|(1 << PB4);
}

unsigned char spi(unsigned char data)
{
    SPDR = data;
    loop_until_bit_is_set(SPSR, SPIF);
 
    return SPDR;
}

void select(void) {
  PORTB &= ~(1<<PB4);
}

void unselect(void) {
  PORTB |= (1<<PB4);
}
Nach dem KISS-Prinzip =)

Autor: fubu1000 (Gast)
Datum:

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

Autor: fubu1000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aso, sry
fehlt natürlich das setzen des ChipSelects, welches wahrscheinlich auf 
low gesetzt werden muss, vor meiner send_SPI !

GRUSS

Autor: Michael U. (amiga)
Datum:

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

Autor: Ralph (Gast)
Datum:

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

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.