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.
Gast #4009652
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.
#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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.