Forum: Mikrocontroller und Digitale Elektronik MCP3551 mit PIC16F877


von adi (Gast)


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
}

von Chris B. (dekatz)


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.

: Bearbeitet durch User
von Harald (Gast)


Lesenswert?

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

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.

von Max H. (hartl192)


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.

: Bearbeitet durch User
von adi (Gast)


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

von Max H. (hartl192)


Angehängte Dateien:

Lesenswert?

adi schrieb:
> Ja gerne, das wäre eine grosse Hilfe.
In Anhang der Code, ich hoffe ich habe nichts relevantes aus der Main 
gelöscht.

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