Forum: Mikrocontroller und Digitale Elektronik MAX518 keine Funktion


von Marco G. (grmg2010)


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
}

von pegel (Gast)


Lesenswert?

Wenn ich mir "Figure 6. Address Byte" im Datenblatt ansehe, fehlt wie 
meist der Linksschieber.

von Marco G. (grmg2010)


Lesenswert?

Marco G. schrieb:
> i2c_start(MAX518 + 0x00);

Das mache ich in der Zeile. Ich weiß, dass ich hier nur eine 7-Bit 
adresse habe, aber acht benötige :)

von pegel (Gast)


Lesenswert?

Marco G. schrieb:
> Das mache ich in der Zeile.

Das glaube ich nicht. Rechne mal nach.
Irgendwas + 0 = ?

von Marco G. (grmg2010)


Lesenswert?

Ist mir schon bewusst, allerdings funktioniert diese Zeile bei allen 
meinen bisherigen I2C devices einwandfrei. Ich werde jetz noch einmal 
die 8bitadresse von Hand eintragen

von pegel (Gast)


Lesenswert?

Oder

(I2C_ADDR<<1 | I2C_Write)

von Marco G. (grmg2010)


Lesenswert?

Ja so sieht es besser aus. Interessanterweise hatte es bisher auch wie 
von mir beshrieben funktioniert. Aber jetzt habe ich ja eine Lösung für 
den Chip. Vielen Dank für die Anregung noch einmal darüber nachzudenken.

von pegel (Gast)


Lesenswert?

Das liegt meist daran wie die Adresse im Datenblatt dargestellt wird,
bzw. wenn man ein Programmbeispiel verwendet haben das andere schon 
angepasst.

von Marco G. (grmg2010)


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
}

von Bastian W. (jackfrost)


Lesenswert?

Die Pins hast du initialisiert ?
Externer Pullup ?

Gruß JackFrost

von Marco G. (grmg2010)


Lesenswert?

Bastian W. schrieb:
> Die Pins hast du initialisiert ?
> Externer Pullup ?
>
> Gruß JackFrost

Als was müssen die Pins initialisiert werden? Ich hatte irgendwo 
gelesen, dass beim Einschalten die Pins selber als OC geschaltet werden. 
Externe Pullups sind vorhanden, vielleicht ein wenig klein (1k6) aber 
zum Testen sollte es gehen.

: Bearbeitet durch User
von Bastian W. (jackfrost)


Lesenswert?

Ich hab das per Hand gemacht. Ich weiß blos nicht ob es nötig ist.
Wenn ich zuhause bin kann ich dir meine I2C Routinen anhängen.
Ich nutze die bei nem xmega32e5 und xmega193a4.

Gruß JackFrost

von Marco G. (grmg2010)


Lesenswert?

Das wäre sehr freundlich, dann hätte ich ein funktionierendes Beispiel, 
welches ich ausprobieren kann.

von Bastian W. (jackfrost)


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

von Marco G. (grmg2010)


Lesenswert?

Vielen dank für den Code. Ich schaue ihn mir morgen in Rhe an. Falls ich 
Fragen habe, darf ich sie sicherlich noch stellen?

von Bastian W. (jackfrost)


Lesenswert?

Kein Problem :)

Beitrag #5200924 wurde vom Autor gelöscht.
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.