Forum: Mikrocontroller und Digitale Elektronik SPI Problem Atmega328P


von Markus (Gast)


Lesenswert?

Hallo Controllergurus,

ich hab seit einigen Wochen ein und das selbe Problem:
Ich versuche mit einem 328P einen Drucksensor via SPI aus zu lesen.
Leider liefert dieser immer nur 0b11111111 zurück und das sollte er 
nicht.
Vielleicht könnt ihr mir sagen ob ich im Code irgend was übersehen habe?

Beste Grüße

Merkus


Datenblatt Sensor

http://www.meas-spec.com/product/t_product.aspx?id=5035#

Programm
1
#include <avr/io.h>
2
#include <asf.h>
3
#include <math.h>
4
#include <stdio.h>
5
#include <stdlib.h>
6
#ifndef F_CPU
7
#define F_CPU 20000000UL
8
#endif
9
#include <util/delay.h>
10
#include <avr/interrupt.h>
11
12
13
int main (void)
14
{
15
  
16
  //PB2 SS //PB3 MOSI //PB5 SCK
17
  DDRB|=((1<<2)|(1<<3)|(1<<5));
18
  //PB4 MISO
19
  DDRB&=~(1<<4);
20
  //SPI Enable // Master enable // prescaler 128
21
  SPCR|=((1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0));
22
  //SCK 0 when IDLE //MSB first
23
  SPCR&=~((1<<CPOL)&(1<<DORD));
24
  //Slave select
25
  PORTB|=(1<<2);
26
  
27
  
28
  DDRD|=(1<<1);
29
  int data1 =0;
30
  int data = 0;
31
  uint16_t result = 0;
32
  uint16_t result1 =0 ;
33
  int L;
34
  
35
  while(1)
36
  {
37
      
38
    PORTD|=(1<<1);
39
    _delay_ms(500);
40
    PORTD&=~(1<<1);
41
    _delay_ms(500);
42
  
43
    
44
    //schicken auf erste flanke
45
    SPCR&=~(1<<CPHA);
46
    //send reset
47
    SPDR = 0b00010101;
48
    // Wait for transmission complete 
49
    while(!(SPSR & (1<<SPIF)));
50
    SPDR = 0b01010101;  
51
    while(!(SPSR & (1<<SPIF)));
52
    SPDR = 0b01000000;
53
    while(!(SPSR & (1<<SPIF)));
54
      
55
    //Send w1 sequence
56
    SPDR = 0b00001111;
57
    while(!(SPSR & (1<<SPIF)));
58
    SPDR = 0b01000000;
59
    while(!(SPSR & (1<<SPIF)));
60
    
61
    //read w1
62
    //lesen auf zweite flanke
63
    SPCR|=(1<<CPHA);
64
    SPDR = 0;
65
    while(!(SPSR & (1<<SPIF)));
66
    data=SPDR;    
67
    SPDR = 0;
68
    while(!(SPSR & (1<<SPIF)));
69
    data1=SPDR;
70
    
71
    //calculate w1
72
    result|=data;
73
    result1|=result<<8;
74
    result=result1|data1;
75
    
76
    if ((result==0)|(result==0xFFFF))    //get error LED if the bytes of the sensor are just zero or just FFFF
77
    {
78
      
79
      for(L=0;L<5;L++)
80
      {
81
        
82
        PORTD|=(1<<1);
83
        _delay_ms(100);
84
        PORTD&=~(1<<1);
85
        _delay_ms(100);
86
      }
87
      
88
    }
89
    
90
    
91
    
92
  }
93
  
94
  
95
}

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

Was ist denn das für ein Sensor, bei dem man zwischendurch den SPI-Mode 
wechseln muss? Kommt mi etwas spanisch vor.

MfG Spess

von Markus (Gast)


Lesenswert?

Das ist ein digitaler Drucksensor. Ich finds auch nicht prickelnd, aber 
ich muss genau den zum laufen bringen. Vielleicht hat ja jemand ne idee? 
Muss ich den SS irgendwann wieder abschalten? Oder sonst einen Port?

Beste Grüße

Markus

von spess53 (Gast)


Lesenswert?

Hi

>Das ist ein digitaler Drucksensor.

Das man für einen analogen Sensor kein SPI braucht ist mir schon klar. 
Hast du mal einen Link zum Datenblatt?

MfG Spess

von Markus (Gast)


Lesenswert?


von der alte Hanns (Gast)


Lesenswert?

Das hatten Sie bereits geschrieben - also ich bin zu doof, das 
herunterzuladen.

von der alte Hanns (Gast)


Lesenswert?

Aha, man muss Javascript eingeschaltet haben.
Also doch 'präseniler Postselene'.

von Karl H. (kbuchegg)


Lesenswert?

Hier ist der Link zum Datenblatt
http://www.meas-spec.com/downloads/MS5541C.pdf

Auf Seite 14 ist der interessante Teil: wie funktioniert der technische 
Teil der Datenübertragung. WEnn ich den lese und auch wenn ich die 
Diagramme dazu mir ansehe, dann komme ich zu dem Schluss, dass man da 
mit der Hardware SPI sowieso nicht weiter kommt. Ich denke, das muss in 
Software realisiert werden. Schon alleine deshalb, weil das komplette 
Protokoll nicht auf 8-Bit Einheiten aufbaut.

von Karl H. (kbuchegg)


Lesenswert?

Bei SCLK ist keine untere Grenze angegeben. Das heisst für mich, man 
kann den Transfer beliebig langsam machen.
Und genau das würde ich benutzen: Transfer in Software und nicht SPI, 
ein paar LED an die Daten und Clock-Leitungen und dann den ganzen 
Transfer mal soweit verzögert ablaufen lassen, dass man an den LED 
mitverfolgen kann, was sich tut.

Das wäre mein Vorgehen.

von Markus (Gast)


Lesenswert?

Ich hatte das glück zugriff auf ein speicher oszi zu haben und hab 
gesehen, dass alles perfekt funktionniert, solange ich nichts anderes 
mache als zu senden und zu empfangen. Sobald ich eine LED blinken lasse 
(PORTD1) macht der sensor nix mehr, obwohl ich das nicht in der sequenz 
tue. Außerdem hab ich wohl starke induktionen an den Kabeln oder der 
Steckplatine, da sobald ich mit der Hand an den MOSI gehe der Sensor 
total verrückt spielt. Kann das sein?

Beste Grüße

Markus

von Markus (Gast)


Lesenswert?

Danke für den Tipp Karl Heinz.
Wenn ich ihn so auslese, gibt der sensor auf jeden fall daten von sich. 
sie werden also vom controller nicht gelesen. hat jemand eine ahnung 
warum?

von Markus (Gast)


Lesenswert?

Karl Heinz schrieb:
> Hier ist der Link zum Datenblatt
> http://www.meas-spec.com/downloads/MS5541C.pdf
>
> Auf Seite 14 ist der interessante Teil: wie funktioniert der technische
> Teil der Datenübertragung. WEnn ich den lese und auch wenn ich die
> Diagramme dazu mir ansehe, dann komme ich zu dem Schluss, dass man da
> mit der Hardware SPI sowieso nicht weiter kommt. Ich denke, das muss in
> Software realisiert werden. Schon alleine deshalb, weil das komplette
> Protokoll nicht auf 8-Bit Einheiten aufbaut.

Entschuldigung, den Text habe ich vorher nciht gesehen. Laut einiger 
Internetquellen und einem Typen auf den Phillipinen, der das ding 
schonmal verbaut hat kann man vor den Startsewuenzen machen was man 
will... also kann man einfach nullen vor die sequenz schreiben, ohne 
dass diese einfluss nehmen. Allerdings, seit ich das so durchgemessen 
habe kommen mir da auch zweifel. Zur not mach ichs doch "zu Fuß".
Vielen dank schonmal

von Karl H. (kbuchegg)


Lesenswert?

Markus schrieb:

> habe kommen mir da auch zweifel. Zur not mach ichs doch "zu Fuß".

Würd ich tun.
So gross ist der Aufwand auch wieder nicht. Wesentlich schneller gehts 
auch nicht und mit dem Hintergrund ...
> ich hab seit einigen Wochen
... erst recht.

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.