www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem SPI bei PIC


Autor: Thomas S. (spom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich benutze einen Luftblasensensor und habe ein Problem mit SPI.
Ich verwende einen PIC18F2480 
(http://ww1.microchip.com/downloads/en/DeviceDoc/39637a.pdf) und 
verbinde über die SPI Schnittstelle den uC mit den AD-Wandler AD7790 
(http://www.analog.com/UploadedFiles/Data_Sheets/AD7790.pdf).
Ich habe PIN 1 (SCLK) des AD7790 mit PIN 14 (RC3/SCK/SCL) des PIC, PIN 2 
(CS) mit PIN 13 (RC2/CCP1), PIN 9 (DOUT) mit PIN 16 (RC5/SDO) und PIN 10 
(DIN) mit PIN 15 (RC4/SDI/SDA) direkt verbunden. Die anderen erklären 
sich von selbst.

Als Compiler benutze ich CCS C. Mein Code sieht wie folgt aus:
#include <18f2480.h>
#device *=16
#device ADC=10

#use delay(clock=8000000)

#fuses NOWDT,HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP


#define SPI_MODE_0_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_0_1 (SPI_L_TO_H)
#define SPI_MODE_1_0 (SPI_H_TO_L)
#define SPI_MODE_1_1 (SPI_H_TO_L | SPI_XMIT_L_TO_H) 

#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,BRGH1OK,stream=debug)

#define SPANNUNG_REF 4
#define KOMPERATOR_REF  0
#define LUFTBLASENSENSOR 1

#define CS PIN_C2

#define CREAD 0b00111100    // continous read


void main()
{

  int8 ad_in1;
  int8 ad_in2;
  int8 ad_in3;


  setup_spi(SPI_MASTER | SPI_MODE_1_1 | SPI_CLK_DIV_16);
  setup_adc(adc_off);


  SET_TRIS_C( 0b00001000 );  

  output_high(CS);

  delay_ms(100);

  puts("\nLuftblase;Referenzspannung;Komparator_Ref;Luftblasensensor\n");


  while (TRUE)    
  {
    
    delay_ms(20);
    output_low(CS);  
    

    if (input(PIN_B0))
      {
      printf("Ja;");
      }
    else
      {
      printf("Nein;");
      }
    
    spi_write(CREAD);
    
    ad_in1 = spi_read(0);
    ad_in2 = spi_read(0);
    ad_in3 = spi_read(0);
    output_high(CS);

    fprintf(debug,"%u %u %u;\n", ad_in1, ad_in2, ad_in3);
  }
}

Wenn ich das Programm nun ausführe, erscheint am Computer (sende Daten 
über RS232 und sehe sie mir über Docklight an) noch ein "Ja" und dann 
kommt nichts mehr. Wo liegt der Fehler?

Ich bin um jede Hilfe dankbar.

Autor: Dieter Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> PIN 9 (DOUT) mit PIN 16 (RC5/SDO) und
> PIN 10 (DIN) mit PIN 15 (RC4/SDI/SDA)

Falls das wirklich so sein sollte ist es falsch.

DOUT(put) muss natürlich SDI(nput) verbunden werden und entsprechend
DIN(put) mit SDO(utput).


Und was ist bitteschön input(PIN_B0)?

Autor: Gerhard. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thomas,

von wo stammt das: "SPI_MODE_1_1" - Gibt es so viel wie ich weiss nicht.

Das verwende ich z.B. bei mir mit Erfolg:

...
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_XMIT_L_TO_H  | SPI_CLK_DIV_4);
...
output_low(SPI_STROBE);

    for (j = 0; j < (max_loop) ; j++){
        spi_write(MAX7301_buffer[j]);
    }

output_high(SPI_STROBE);
...

Gerhard

Autor: Thomas S. (spom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
entschuldigt bitte, das

> PIN 9 (DOUT) mit PIN 16 (RC5/SDO) und
> PIN 10 (DIN) mit PIN 15 (RC4/SDI/SDA)

habe ich natürlich falschrum geschrieben. Also PIN 9 auf PIN 15 und PIN 
10 auf PIN 16.

"SPI_MODE_1_1" habe ich oben definiert als
#define SPI_MODE_1_1 (SPI_H_TO_L | SPI_XMIT_L_TO_H)

Was ist mit "SPI_STROBE" gemeint bzw. wie ist es definiert??


Ich habe mir mal die einzelnen Pins näher angeschaut, ob sie high oder 
low sind. Dabei habe ich festgestellt, dass DOUT und DIN vor und nach 
dem spi_write Befehl immer low sind. Als nächstes kommt dann der 
spi_read Befehl und dann bleibt das Programm "hängen". Ist evtl. an 
diesem Befehl was falsch?

Zusätzlich habe ich versucht, die Clockleitung mit einem Oszi zu messen. 
Wie sollte das Signal aussehen?

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.