Forum: Mikrocontroller und Digitale Elektronik MAX517 will nicht


von Jens K. (mister232)


Lesenswert?

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

von Jens K. (mister232)


Lesenswert?

Es hat sich erledigt. Der Ausgang brauchte nur etwas Last

von Route_66 H. (route_66)


Lesenswert?

Jens K. schrieb:
> uint8_t set_voltage_MAX517(float set_voltage)

Warum hier float??? wenn du u_int8 übergibst!

Jens K. schrieb:
> if(volt > 0xFF)

Den Test kannst du dir verkneifen bei einem u_int8, der Wert wird nie 
größer 0xFF.

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.