ATmega32 und MCP4151, digital Poti via SPI ansteuern

Gast #3552865
Lesenswert?
• ▲
▼
Hallo zusammen,

im Rahmen eines Projekts möchte ich ein Poti verwenden, der digital 
angesteuert wird. Dabei habe ich folgende Vorgaben:
- Master: ATmega32
- Slave: MCP4151-104 E/P Single Volatile 8bit Potentiometer
- SPI Programmierung
- 5 Volt Versorgung

Voerst habe ich versucht einen fixen Widerstandswert (~30 kOhm) zu 
erreichen. Später möchte ich den Widerstandswert sinusförmig variieren. 
Habe 3 Funktionen: SPI Initialisierung, Übertragungsfunktion für 16bit 
Command bzw. für 8bit Commands (siehe Code unten).

Die SPI Initialisierung scheint zu passen, MOSI SCK und CS Signale sind 
wie erwartet. Stehe bei der Fehlersuche nun ziemlich an, da ich entweder 
keinen Widerstandswert messe oder der Wiper mittig ausgerichtet ist 
(default).

Muss zB das TCON Register des MCP4151 noch extra angesprochen werden 
oder passiert das im Command-Byte? Bin hier mit meinem Latein am Ende.. 
daher meine Bitte um Hilfe :-)

Danke im Voraus!
Lg.

1
#include <avr/io.h>
2

3
int main(void)
4
{
5
    SPI_MasterInit();
6
    
7
  while(1)
8
    {    
9
    SPI_MasterTransmit_16bit(64, 77);    
10
    
11
    // AAAA CCDD  DDDD DDDD
12
    // 0100 0000  0100 1101
13
    // 64      77 (30,2 kOhm)
14
    
15
    // SPI_MasterTransmit_8bit(4);      // 0000 0100, Increment Wiper
16
    // SPI_MasterTransmit_8bit(8);      // 0000 1000, Decrement Wiper
17
    }
18
}
19

20
void SPI_MasterInit (void)
21
{
22
  // SS, MOSI und SCK Ausgang
23
  DDRB |= (1<<PD4) | (1<<PD5) | (1<<PD7);
24
  
25
  // SPI enable, master mode, clock rate f/16, sample bei steigender Flanke
26
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
27
}
28

29
void SPI_MasterTransmit_16bit (uint8_t command_16bit, uint8_t data_16bit)
30
{
31
  // SS am Slave Low -> Beginn der Übertragung
32
  PORTB &=~ (1<<PB4);
33
    
34
  SPDR = command_16bit;
35
  while(!(SPSR & (1<<SPIF)));
36
  
37
  SPDR = data_16bit;
38
  while(!(SPSR & (1<<SPIF)));
39
  
40
  // SS am Slave High -> Ende der Übertragung
41
  PORTB |= (1<<PB4);
42
}
43

44
void SPI_MasterTransmit_8bit (uint8_t command_8bit)
45
{
46
  // SS am Slave Low -> Beginn der Übertragung
47
  PORTB &=~ (1<<PB4);
48
  
49
  SPDR = command_8bit;
50
  while(!(SPSR & (1<<SPIF)));
51
  
52
  // SS am Slave High -> Ende der Übertragung
53
  PORTB |= (1<<PB4);
54
}
Angehängte Dateien:

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.