MCP3551 mit PIC16F877

Gast #4009627
Lesenswert?

Guten Tag

Ich versuche schon seit Tagen den MCP3551 mit dem PIC16F877 und HI Tech 
C compiler zum Laufen zu bringen, doch bisher erfolglos. Das Programm 
bleibt bei "while(!SSPIF);" hangen. Also wird das SSPIF bit nie gesetzt. 
Der MCP3551 scheint nicht viel zu machen. Hat jemand einen Tipp?

Hier mein code:
1
#include "..\Include\HTC_pbainc.h"
2

3

4
void isp_wait_if(void)
5
{
6
  while(!SSPIF);              //Warten bis ISP-IF gesetzt (MSSP action done)
7
  SSPIF=0;                //Interrupt-Flag rücksetzen  
8
}
9

10
void isp_init(void)
11
{
12
  TRISC3 = 0;                //SCL=output
13
  TRISC4 = 1;                //SDI=input
14
  TRISD0 = 0;                //SS=outpur
15
  SSPSTAT = 0b01000000;          //CKE=1
16
  SSPCON = 0b00110001;          //SSPEN=1, CKP=1, master mode, clock=Fosc/16
17
  SSPEN=1;                //MSSP-Modul eingeschalten (SSP-Enable)
18
  RD0=1;
19
}
20

21
unsigned char isp_read()
22
{
23
  
24
  RD0=0;                  //SS low
25
  delay_ms(80);
26
  isp_wait_if();              
27
  RD0=1;                  //SS high
28
  return SSPBUF;
29
}
30

31
void main(void)
32
{    
33
  init_pba();              //Initialisierungen
34
  isp_init();
35
  while(1)
36
  {
37
    unsigned char data;
38

39
    data=isp_read();
40
    printf("%u",data);
41
    lcd_gotoxy(0,0);
42
    delay_ms(10);
43
    
44

45
  }
46

47

48
}
#4009650
Lesenswert?

adi schrieb:
> Guten Tag
>
> Ich versuche schon seit Tagen den MCP3551 mit dem PIC16F877 und HI Tech
> C compiler zum Laufen zu bringen, doch bisher erfolglos. Das Programm
> bleibt bei "while(!SSPIF);" hangen. Also wird das SSPIF bit nie gesetzt.
> Der MCP3551 scheint nicht viel zu machen. Hat jemand einen Tipp?
>
>> [/c]

Ja, weil um von SPI etwas zu lesen, muss man auch etwas Senden.
Also würde ich am Anfang der der <isp_read()> Funktion irgendeinen Wert 
in das SSPBUF Register schreiben damit der Sende/Empfangsvorgang 
ausgelöst wird.
#4009745
Lesenswert?

adi schrieb:
> Hat jemand einen Tipp?
Versuchs mal so:
1
unsigned char isp_read()
2
{
3
  RD0=0;                  //SS low
4
  SSPBUF = 0xFF;
5
  isp_wait_if();            
6
  RD0=1;                  //SS high
7
  return SSPBUF;
8
}
Das SS low/high würde ich weglassen, da du um die 22bit einzulesen 3 
Bytes während SS auf low ist einlesen musst. Siehe Seite 17 unten:
http://ww1.microchip.com/downloads/en/devicedoc/21950c.pdf

Ich habe letztes Jahr einen MCP3550 mit dem PIC16F1825 angesteuert, wenn 
du willst kannst du heute Abend die Sources haben.


BTW: Die Schnittstelle heißt SPI und nicht isp.
Gast #4009831
Lesenswert?

Harald schrieb:
> Vielleicht das Publikum mal aufklären, was das überhaupt ist. Die
> wenigsten werden Lust haben, erstmal Datenblätter zu saugen.

Der MCP3551 ist ein Sigma/Delta ADC, welcher einen PT100 auswerten soll.

Chris B. schrieb:
> Ja, weil um von SPI etwas zu lesen, muss man auch etwas Senden.
> Also würde ich am Anfang der der <isp_read()> Funktion irgendeinen Wert
> in das SSPBUF Register schreiben damit der Sende/Empfangsvorgang
> ausgelöst wird.

Harald schrieb:
> Egal, das Problem dürfte sein, dass keiner den Clock erzeugt. Du musst
> doch Dummy-Bytes senden, damit Clocks entstehen. Kenne diesen PIC nicht
> im Detail, wird hier aber ähnlich sein.

Max H. schrieb:
> Das SS low/high würde ich weglassen, da du um die 22bit einzulesen 3
> Bytes während SS auf low ist einlesen musst. Siehe Seite 17 unten:
> http://ww1.microchip.com/downloads/en/devicedoc/21950c.pdf

Danke! Jetzt geht etwas und der Wert ändert wenn der PT100 
erwärmt/abgekühlt wird.

Max H. schrieb:
> Ich habe letztes Jahr einen MCP3550 mit dem PIC16F1825 angesteuert, wenn
> du willst kannst du heute Abend die Sources haben.

Ja gerne, das wäre eine grosse Hilfe.

Der Code sieht jetzt so aus:
1
#include "..\Include\HTC_pbainc.h"
2

3

4
void spi_wait_if(void)
5
{
6
  while(!SSPIF);              //Warten bis ISP-IF gesetzt (MSSP action done)
7
  SSPIF=0;                //Interrupt-Flag rücksetzen  
8
}
9

10
void spi_init(void)
11
{
12
  TRISC3 = 0;                //SCL=output
13
  TRISC4 = 1;                //SDI=input
14
  TRISD0 = 0;                //SS=outpur
15
  SSPSTAT = 0b01000000;          //CKE=1
16
  SSPCON = 0b00110001;          //SSPEN=1, CKP=1, master mode, clock=Fosc/16
17
  SSPEN=1;                //MSSP-Modul eingeschalten (SSP-Enable)
18
  RD0=1;
19
}
20

21
unsigned char spi_read()
22
{                  
23
  SSPBUF=0xFF;              //Dummy byte                                    
24
  spi_wait_if();                                
25
  return SSPBUF;
26
}
27

28
void main(void)
29
{    
30
  init_pba();              //Initialisierungen
31
  spi_init();
32
  while(1)
33
  {
34
    unsigned char byte1;
35
    unsigned char byte2;
36
    unsigned char byte3;
37
    unsigned long data;
38
    RD0=0;
39
    byte1=spi_read();  
40
    byte2=spi_read();  
41
    byte3=spi_read();  
42
    RD0=1;
43
    data=((byte1<<16)+(byte2<<8)+byte3);
44
    data=data&0x1FFFFF;
45
    
46
    printf("%lu",data);
47
    lcd_gotoxy(0,0);
48
    delay_ms(10);
49
  }
50
}

Max H. schrieb:
> BTW: Die Schnittstelle heißt SPI und nicht isp.

Ups logisch, korrigiert :D

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren