Forum: Mikrocontroller und Digitale Elektronik MCP3551 mit PIC16F877


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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.

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]
  • [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.