Forum: Mikrocontroller und Digitale Elektronik ATmega32 und MCP4151, digital Poti via SPI ansteuern


von doho (Gast)


Angehängte Dateien:

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
}

von Sascha (Gast)


Lesenswert?

Hallo,

ich bekomme mein MCP4151 leider nicht zum Laufen....

Hast du oder jemand anders funktionsfähigen Code?

Beste Grüße,
Sascha

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.