Forum: Mikrocontroller und Digitale Elektronik MCP3208 und RPi B+


von J. G. (fragender99)


Lesenswert?

Hallo,
ich habe eine Frage,...
Ich möchte vom CH0 beim MCP3208 den Wert auslesen. Eigentlich möchte ich 
dieses "Beispiel": 
http://erik-bartmann.de/component/attachments/download/21.html 
nachmachen, aber statt mit dem MCP3008 mache ich das mit dem MCP3208. 
Ich habe die Verkabelung schon geprüft, die scheint zu stimmen. Beim 
Ausgang D_out habe ich mal den Strom gemessen, der aber meistens 60 
MikroA betrug. Ich verwende den RPi B+ und die Programmiersprache C 
sowie ein 100k Potenziometer. Nun zum Code, kann der stimmen? 
Möglicherweise liegt es nur an dem; wenn Nein, wo kann das Problem sonst 
noch liegen??
Danke im Voraus
1
#include <stdio.h>
2
#include <wiringPi.h>
3
4
#define D 10
5
6
//GPIO Pins wurden genommen, nicht die WPi-Pins!!
7
#define CSPin 8 //Chip-Select
8
#define SCLKPin 9 //Clock
9
#define DINPin 2 //Data-In
10
#define DOUTPin 0 //Data-Out
11
12
//returns 0 on error
13
int pinSetup(int cs, int sclk, int dinp, int doutp){
14
  if (wiringPiSetup() != 0){ fprintf(stderr, "Error with wiringPi"); return 0; }
15
  pinMode(cs, OUTPUT);
16
  pinMode(sclk, OUTPUT);
17
  pinMode(dinp, OUTPUT);
18
  pinMode(doutp, INPUT);
19
  digitalWrite(doutp, 0);
20
  return 1;
21
}
22
23
int getData(int CS, int SCLK, int DIN, int DOUT, int CH){
24
  int sendCMD = CH;
25
  int getData = 0;
26
  int i = 5;
27
  sendCMD |= (3 << 3);
28
29
  //CS
30
  digitalWrite(CS, 1);
31
  delay(D);
32
  digitalWrite(CS, 0);
33
  delay(D);
34
  digitalWrite(SCLK, 0);
35
  delay(D);
36
  //DIN
37
  for (; i > 0; i--){
38
    digitalWrite(SCLK, 1);
39
    delay(D);
40
    digitalWrite(SCLK, 0);
41
    delay(D);
42
  }
43
44
  for (i = 4; i <= 0; i--){
45
    digitalWrite(DIN, sendCMD & (1 << i));
46
    delay(D);
47
    digitalWrite(SCLK, 1);
48
    delay(D);
49
    digitalWrite(SCLK, 0);
50
    delay(D);
51
  }
52
  //DOUT
53
54
  digitalWrite(SCLK, 1);
55
  delay(D);
56
  digitalWrite(SCLK, 0);
57
  delay(D);
58
59
  for (i = 11; i <= 0; i--){
60
    digitalWrite(SCLK, 1);
61
    delay(D);
62
    getData |= (digitalRead(DOUT) << i);
63
    digitalWrite(SCLK, 0);
64
  }
65
  return getData;
66
}
67
68
int main(void){
69
  int a;
70
  pinSetup(CSPin, SCLKPin, DINPin, DOUTPin);
71
  a = getData(CSPin, SCLKPin, DINPin, DOUTPin, 0);
72
  printf("\n%d\n", a);
73
  return 0;
74
}

von J. G. (fragender99)


Lesenswert?

OK ich habe den Fehler gefunden...
1
int getData(int CS, int SCLK, int MOSI, int MISO, int CH){
2
  register int command = CH, i = 0, result = 0;
3
  command |= (3 << 3);
4
5
  digitalWrite(CS, 1);
6
  digitalWrite(SCLK, 0);
7
  digitalWrite(MOSI, 0);
8
  digitalWrite(CS, 0);
9
10
  //MOSI
11
  for (i = 4; i >= 0; i--){
12
    digitalWrite(SCLK, 0);
13
    digitalWrite(MOSI, command&(1 << i));
14
    digitalWrite(SCLK, 1);
15
  }
16
17
  //MISO
18
  clock(SCLK);
19
  clock(SCLK);
20
  for (i = 11; i >= 0; i--){
21
    digitalWrite(SCLK, 0);
22
    delay(D);
23
    result |= (digitalRead(MISO) << i);
24
    digitalWrite(SCLK, 1);
25
  }
26
  return result;
27
}

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.