MAX518 keine Funktion

OP #5198957
Lesenswert?

Moin,

ich versuche gerade den Doppel-Dac MAX518 in Betrieb zu nehmen. Dazu 
nutze ich einen ATMEGA644 mit der I2C Bibliothek von Peter Fleury.
Die beiden Adresspins des MAX518 sind auf GND gelegt, was eine Adresse 
von
0x2C ergeben müssste (7-Bit). Als Pull-Ups sind jeweils 1k6 
angeschlossen.

Die einfachste Konfiguration ist leut Datenblatt das Commandbyte auf 
0x00 zu setzen. Damit wird der folgende Wert in den DAC0 übergeben.
Egal welchen Wert ich übermittel, der Ausgang ändert sich nicht.

Hier der kurze Codeasuschnitt:
1
#define F_CPU 8000000UL
2
#define Dev24C02  0xA0
3
#define MAX518 0x2C
4

5
#include <avr/io.h>
6
#include <avr/interrupt.h>
7
#include <stdlib.h>
8
#include <util/delay.h>
9
#include <avr/eeprom.h>
10

11

12
#include "avr.h"
13
#include "i2c.h"
14
#include "UART.h"
15

16

17
uint8_t counter_addresse = 0;
18
char Buffer[10];
19
uint8_t copy, return_;
20

21
uint8_t Test1 EEMEM = 10;
22
uint8_t Test2 EEMEM = 15;
23
uint8_t Test3 EEMEM = 20;
24
uint8_t Test4 EEMEM = 25;
25
uint8_t Test5 EEMEM = 33;
26

27
ISR(INT0_vect)
28
{
29
  return_ = read_i2c_eeprom(Dev24C02);
30
}
31

32
int main(void)
33
{
34
  i2c_init();                             // initialize I2C library
35
  sei();
36

37
    while (1) 
38
    {    
39
    
40
    i2c_start(MAX518 + 0x00);
41
    i2c_write(0x00);
42
    i2c_write(0xAA);
43
    i2c_stop();
44
    _delay_ms(500);
45
    }
46
}
OP #5199916
Lesenswert?

Da ich den Chip nun ansprechen kann, ist der nächste Schritt der Wechsel 
zu einem ATxmega32. Hier habe ich leider wieder Probleme, allerdings 
bereits beim Initialisieren des Busses. Die Clockleitung ist im 
Normalzusatnd Low, allerdings sind die Clocks zu erkennen. Heir einmal 
meine Initialisierung und die Funktionen:
1
void I2C_MasterInit(TWI_t *twi)
2
{
3
   twi -> MASTER.CTRLA = TWI_MASTER_ENABLE_bm; 
4
   twi -> MASTER.BAUD = TWI_BAUDRATE;
5
   twi -> MASTER.CTRLB = 0;
6
   twi -> MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc;
7
   twi -> MASTER.CTRLC = 0;
8
}
9

10
void I2C_Send_Adress(TWI_t *twi, char Adresse, char RW)
11
{
12
  twi -> MASTER.ADDR = (Adresse << 1) + RW;
13
}
14

15
void I2C_Send_Value(TWI_t *twi, char Adresse, char Data, char RW)
16
{
17
  I2C_Send_Adress(twi, Adresse, RW);
18
  _delay_us(500);
19
  twi -> MASTER.DATA = Data;
20
  twi -> MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
21
}
#5200243
Lesenswert?

Hi,

anbei sind meine Funktionen für das Initalisieren, das Lesen und 
Schreiben.
Ich hab bei meiner Heizungssteuerung nur ein RTC am I2C. Daher hab ich 
in die Funktion eine feste Adress gesetzt. Zudem sind die Pins für den 
Fall das die Abitration verloren wurde, auch fest gesetzt. Das musst du 
ggf noch ändern.
1
#define CPU_SPEED 32000000UL
2
#define BAUDRATE    100000UL
3
#define TWI_BAUD(F_SYS, F_TWI) ((F_SYS / (2 * F_TWI)) - 5)
4
#define TWI_BAUDSETTING TWI_BAUD(CPU_SPEED, BAUDRATE)
5

6

7
void twi_init(TWI_t * twiname){
8

9
  PORTC.PIN0CTRL = PORT_OPC_WIREDAND_gc;
10
  PORTC.PIN1CTRL = PORT_OPC_WIREDAND_gc;
11
  twiname->MASTER.CTRLB = TWI_MASTER_SMEN_bm;
12
  twiname->MASTER.BAUD = TWI_BAUDSETTING;
13
  twiname->MASTER.CTRLA = TWI_MASTER_ENABLE_bm;  
14
  twiname->MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc;
15
}
16

17
void twi_write(TWI_t *twiname, uint8_t *writeData,uint8_t Adress, uint8_t bytes,bool fixed){
18

19
  uint8_t i;
20
  uint8_t address = 0xD0;
21
  TWIC_MASTER_CTRLC &= ~((1<<TWI_MASTER_ACKACT_bp));
22
  twiname->MASTER.ADDR = 0xD0;
23
  while (!(TWIC.MASTER.STATUS & TWI_MASTER_WIF_bm));
24
  if(TWIC_MASTER_STATUS & (1<<TWI_MASTER_ARBLOST_bp))
25
  {
26
    twiname->MASTER.CTRLA = 0;
27
    PORTC.DIRSET = PIN1_bm;
28
    for(uint8_t i=0;i<9;i++)
29
    {
30
      PORTC.OUTSET = PIN1_bm;
31
      _delay_us(20);
32
      PORTC.OUTCLR = PIN1_bm;
33
      _delay_us(20);
34
    }
35
    PORTC.DIRCLR = PIN1_bm;
36
    twiname->MASTER.CTRLA = TWI_MASTER_ENABLE_bm;
37
    twiname->MASTER.STATUS = TWI_MASTER_ARBLOST_bm | TWI_MASTER_BUSERR_bm;
38
    twiname->MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc;
39
    TWIC.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
40
    twiname->MASTER.ADDR = 0xD0;
41
    if(TWIC_MASTER_STATUS & (1<<TWI_MASTER_ARBLOST_bp));
42
    
43
  }
44
  twiname->MASTER.DATA = Adress;       // write word addr
45
  while(!(twiname->MASTER.STATUS&TWI_MASTER_WIF_bm));
46
  for(i=0;i<bytes;i++){     
47
    if(!fixed)             // write date and time
48
      twiname->MASTER.DATA =writeData[i];
49
    else
50
      twiname->MASTER.DATA =writeData[0];
51
    while(!(twiname->MASTER.STATUS&TWI_MASTER_WIF_bm));
52
  }
53
  TWIC.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
54
}
55

56
void twi_read(TWI_t *twiname, uint8_t *readData, uint8_t Adress, uint8_t bytes){
57
  uint8_t address = 0xD0;
58
  address |= 0x01;
59
  TWIC_MASTER_CTRLC &= ~((1<<TWI_MASTER_ACKACT_bp));
60
  twiname->MASTER.ADDR = 0xD0;
61
  while (!(TWIC.MASTER.STATUS & TWI_MASTER_WIF_bm));
62
  if(TWIC_MASTER_STATUS & (1<<TWI_MASTER_ARBLOST_bp))
63
  {
64
    twiname->MASTER.CTRLA = 0;
65
    PORTC.DIRSET = PIN1_bm;
66
    for(uint8_t i=0;i<9;i++)
67
    {
68
      PORTC.OUTSET = PIN1_bm;
69
      _delay_us(20);
70
      PORTC.OUTCLR = PIN1_bm;
71
      _delay_us(20);
72
    }
73
    PORTC.DIRCLR = PIN1_bm;
74
    twiname->MASTER.CTRLA = TWI_MASTER_ENABLE_bm;  
75
    twiname->MASTER.STATUS = TWI_MASTER_ARBLOST_bm | TWI_MASTER_BUSERR_bm;
76
    twiname->MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc;    
77
    TWIC.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
78
    twiname->MASTER.ADDR = 0xD0;
79
    while (!(TWIC.MASTER.STATUS & TWI_MASTER_WIF_bm));
80
    
81
  }
82
  TWIC.MASTER.DATA = Adress;
83
  while (!(TWIC.MASTER.STATUS & TWI_MASTER_WIF_bm));
84
  twiname->MASTER.ADDR = 0xD1;
85
  for(volatile uint8_t j=0 ;j<bytes ;j++){                  
86
    
87
    while(!(twiname->MASTER.STATUS&TWI_MASTER_RIF_bm));
88
    if(j == (bytes-1))
89
    {      
90
      TWIC_MASTER_CTRLC = (1<<TWI_MASTER_ACKACT_bp) | TWI_MASTER_CMD_STOP_gc;
91
    }
92
      readData[j] = twiname->MASTER.DATA;
93
  }
94
  //_delay_us(100);
95
  //TWIC.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
96
  
97
  
98

99
  
100

101
}

Gruß JackFrost
Beitrag #5200924 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren