Probleme mit Übertragung bei SPI

Gast #645543
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
Gast #645578
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.
Gast #645602
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
Gast #645616
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

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.