Forum: Mikrocontroller und Digitale Elektronik Probleme mit Übertragung bei SPI


von Gast (Gast)


Lesenswert?

Hallo,

ich plage mich seit ein paar Tagen mit einer Schaltung herum, aber 
irgendwie wills nicht so klappen ich hoffe ihr könnt mir weiterhelfen...
Folgendes:
ich habe einen ATmega48 und möchte über SPI einen Digi Poti(AD5231) 
programmieren.
Das mit dem senden klappt auch schon ganz gut(Signal an clock messbar), 
aber der Widerstand des Potis ändert sich nur leider nie.
Hoffentlich habt ihr ein paar hilfreiche Ideen.

Hier der Programmcode:
long int data = 0xB003FF;
unsigned char clear = 0;

void SPI_MasterInit(void)
{
  DDRB |= (1<<DDD3)|(1<<DDD5)|(1<<DDD2);      //MOSI,SCK und SS output
  DDRB &= ~(1<<DDD4);                         //MISO input
  SPCR = 0x00;                                //alle Register auf 0,
  SPCR |= (1<<SPE)| (1<<MSTR) | (1<<SPR0);    //ausser SPE, MSTR und 
SPR0
  PORTB |= (1<<SS) | (1<<SCK);                //SS und SCK auf HIGH
  clear = SPSR;                               //read SPSR & SPDR -> 
clear SPIF
  clear = SPDR;
}

void SPI_MasterTransmit(void)
{
      SPDR = data;                            //send Data
      while(!(SPSR & (1<<SPIF)))              //wait until transmission 
complete
      {
      }
}

void main(void)
{
  SPI_MasterInit();
  SPI_MasterTransmit();
  while(1)
  {
  }
}

Vielen Dank schon einmal im Vorraus für alle Beiträge!
Grüße

Daniel

von crazy horse (Gast)


Lesenswert?

long int data = 0xB003FF;
SPDR = data;                            //send Data

das geht natürlich gar nicht. Die SPI kann immer nur ein Byte senden. In 
deinem Fall dürfte immer 0xFF gesendet werden.
Die Senderoutine sollte mit Parameter aufgerufen werden:

void SPI_MasterTransmit(unsigned char data)
{
      SPDR = data;                        //send Data
      while(!(SPSR & (1<<SPIF)))          //wait until transmission 
complete
      {
      }
}

Und wenn du eine long-Zahl senden willst, bastelst du dir eine weitere 
Routine, die dann SPI_Transmit 4 mal aufruft, jedesmal mit dem 
entsprechenden Teilbyte der long-Zahl.
Ob noch andere Fehler drin sind, weiss ich ohne genauere Prüfung auch 
nicht.

von Gast (Gast)


Lesenswert?

Dankeschön, habs geändert jetzt klappts zumindest schon mal mit dem 
einstellen des Widerstands. Aber jetzt hab ich schon wieder ein neues 
Problem,
am Anfang(bei niedrigem Widerstand) ist der Widerstand immer um ca. 50 
ohm größer als er eigentlich sein sollte, je höher ich den Widerstand 
einstelle, desto höher wird auch die Abweichung aber nach unten. Sprich 
am höchsten Punkt beträgt die Abweichung -1.9kohm.
Hast du vielleicht eine Idee woran das liegen könnte??

Danke
Daniel

von Olaf (Gast)


Lesenswert?

> Hast du vielleicht eine Idee woran das liegen könnte??

Ohne Schaltbild koennen wir natuerlich nur den Kaffesatz lesen. Bei mir 
steht da "User liesst Datenblatt nicht"-Error und vermutlich Poti zu 
stark belastet.

Olaf

von Branko Golubovic (Gast)


Lesenswert?

> Hast du vielleicht eine Idee woran das liegen könnte??

Datenblatt, Seite 2:
Nominal Resistor Tolerance -40...+20% !

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.