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 | }
|