Hans-J. A. schrieb:
> Die Frage ist, gilt diese Abfolge für jeden Kanal einzeln,
> oder darf man irgendwie erst beide Kanäle senden/bestücken
> und dann erst mit LDAC übernehmen?
Hallo,
LDAC ist gerade dafür gedacht, um die Werte von A und B gleichzeitig zu
OUT gingen. Wird das nicht benötigt, kann LDAC auf Null bleiben. Dann
wird neue Wert immer nach CS=1 erneuert.
Du kannst also Wert für A übertragen, dann Impuls auf LDAC geben, so
wird A neu und B wiederholt alten Wert, d.h. ohne sich zu ändern. Du
kannst ebenso nur B ändern...
Ich habe bischer LDAC ummer auf GND geschaltet, da ich A und B unahängig
nutze.
Z.B.so:
1 | #define MCP4921_KANA 0
|
2 | #define MCP4921_KANB 0x8000
|
3 | #define MCP4921_SHDN 0x1000
|
4 | #define PORT_CS0 PORTC
|
5 | #define CS0 PC0
|
6 |
|
7 | static unsigned int form_puffer_a = MCP4811_KANA | MCP4811_SHDN | 0x0400;
|
8 | static unsigned int form_puffer_b = MCP4811_KANB | MCP4811_SHDN | 0x0400;
|
9 |
|
10 | /*** Kanal A ***/
|
11 | // Wert für A berechnen und in form_puffer_a speichern
|
12 | form_puffer_a = (unsigned int)(tonform[phase_index_a] + 2048) | MCP4811_KANA | MCP4811_SHDN;
|
13 |
|
14 |
|
15 | PORT_CS0 &= ~(1<<CS0);
|
16 | SPDR = (unsigned char)(form_puffer_a >> 8);
|
17 | while(!(SPSR & (1<<SPIF)));
|
18 | SPDR = (unsigned char)form_puffer_a;
|
19 | while(!(SPSR & (1<<SPIF)));
|
20 | PORT_CS0 |= (1<<CS0);
|
21 |
|
22 | /*** Kanal B ***/
|
23 | // Wert für B berechnen und in form_puffer_b speichern
|
24 | form_puffer_b = (unsigned int)(tonform[phase_index_b] + 2048) | MCP4811_KANB | MCP4811_SHDN;
|
25 |
|
26 | PORT_CS0 &= ~(1<<CS0);
|
27 | SPDR = (unsigned char)(form_puffer_b >> 8);
|
28 | while(!(SPSR & (1<<SPIF)));
|
29 | SPDR = (unsigned char)form_puffer_b;
|
30 | while(!(SPSR & (1<<SPIF)));
|
31 | PORT_CS0 |= (1<<CS0);
|