Hallo Leute,
ich experimentiere gerade mit einem MAX517 DAC. Dazu habe ich folgenden
COde verfasst
1 | /*
|
2 | * DAC_Test.c
|
3 | *
|
4 | * Created: 20.01.2016 10:38:21
|
5 | * Author : Jens
|
6 | */
|
7 |
|
8 | #include <avr/io.h>
|
9 | #include <util/twi.h>
|
10 | #include <inttypes.h>
|
11 | #include <stdio.h>
|
12 | #include <stdlib.h>
|
13 | #include <util/delay.h>
|
14 |
|
15 | #define F_CPU 8000000UL
|
16 | #define TWI_SLA_ADDRESS 0x58 // Address of DAC is 0101 1000 -> 0x58
|
17 | #define WAIT_ITERATIONS 200 // Max. iterations while waiting for slave
|
18 | #define DATA_SIZE 8 // Max. data bits to transfer
|
19 |
|
20 | // Initialize I2C-Interface for the DAC
|
21 | void init_I2C(void)
|
22 | {
|
23 | // Set SCL to 400 kHz
|
24 | TWSR = 0x00;
|
25 | TWBR = 0x0C;
|
26 |
|
27 | // Enable TWI
|
28 | TWCR = (1<<TWEN);
|
29 | }
|
30 |
|
31 | // Function which generates the start signal for I2C-Communication
|
32 | void TWIStart(void)
|
33 | {
|
34 | TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
|
35 | while ((TWCR & (1<<TWINT)) == 0);
|
36 | }
|
37 |
|
38 | // Function which generates the stop signal for I2C-Communication
|
39 | void TWIStop(void)
|
40 | {
|
41 | TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
|
42 | }
|
43 |
|
44 | // Function to transmit data via I2C
|
45 | void TWIWrite(uint8_t u8data)
|
46 | {
|
47 | TWDR = u8data;
|
48 | TWCR = (1<<TWINT)|(1<<TWEN);
|
49 | while ((TWCR & (1<<TWINT)) == 0);
|
50 | }
|
51 |
|
52 | // Function that reads data via I2C and transmits an ACK when its done
|
53 | uint8_t TWIReadACK(void)
|
54 | {
|
55 | TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
|
56 | while ((TWCR & (1<<TWINT)) == 0);
|
57 | return TWDR;
|
58 | }
|
59 |
|
60 | // Function which return the TWI status
|
61 | uint8_t TWIGetStatus(void)
|
62 | {
|
63 | uint8_t status;
|
64 | //mask status
|
65 | status = TWSR & 0xF8;
|
66 | return status;
|
67 | }
|
68 |
|
69 | // Set new voltage value to DAC
|
70 | uint8_t set_voltage_MAX517(float set_voltage)
|
71 | {
|
72 | uint8_t dac_value = 0;
|
73 |
|
74 | // Transmit start-bit
|
75 | TWIStart();
|
76 |
|
77 | // Transmit Slave-Address
|
78 | TWIWrite(TWI_SLA_ADDRESS);
|
79 |
|
80 | // Transmit command byte to DAC
|
81 | TWIWrite(0x00);
|
82 |
|
83 | // Transmit new voltage value to DAC
|
84 | TWIWrite(set_voltage);
|
85 |
|
86 | // Transmit Stop-bit
|
87 | TWIStop();
|
88 |
|
89 | return 0;
|
90 | }
|
91 |
|
92 | int main(void)
|
93 | {
|
94 | uint8_t volt = 0x00;
|
95 |
|
96 | init_I2C();
|
97 |
|
98 | while (1)
|
99 | {
|
100 | set_voltage_MAX517(volt);
|
101 | volt++;
|
102 |
|
103 | if(volt > 0xFF)
|
104 | {
|
105 | volt = 0x00;
|
106 | }
|
107 |
|
108 | _delay_ms(5000);
|
109 | }
|
110 | }
|
Die Daten scheinen korrekt übertragen zu werden, hatte vorher noch
Debug-Meldungen für jede Übertragung drin und es gab keine Fehler.
Das Problem ist nun, setzte ich den Wert auf 0xFF, so geht der Ausgang
des DAC auf die 5V-Referenzspannung. Bei 0x00 geht der Ausgang aber
leider nur auf 1,52V. Zähle ich den Wert im Programm langsam von 0x00
bis 0xFF hoch, dann gibt es immer Schwankungen am Ausgang und
merkwürdige riesige Sprünge. SDA und SCL liegen mit 2K an VCC