Forum: Mikrocontroller und Digitale Elektronik I²C-Schnittstelle Frage zum Programm


von Tim (Gast)


Lesenswert?

Hallo zusammen!

Ich habe mit Anleitung und nach Studium der Datenblätter einige 
Funktionen programmiert, mit denen ich ich via I²C Schnittstelle den 
Segmenttreiber SAA1064 ansteuern will.

Trotz der Mühen habe ich keinerlei Reaktion auf meinem Steckbrett...

Vorerst zu den Randbedingungen:
- ATmega8
- SAA1064 Chip in Referenzbeschaltung(Quelle: Datenblatt Phillips)
- Die I²C Pins (C4,C5) habe ich sowohl als Ein- als auch Ausgang 
versucht zu deklarieren.. kein Unterschied.
- der Compiler zeigt keine Fehler! Ich habe ebenfalls überprüft dass 
sowohl I²C als auch CPU-Frequenz bekannt, richtig und deklariert sind!

Nun der Code der Funktion, welche die eig. Kommunikation via I²C 
umsetzen soll:
1
void write_screen_output()
2
{
3
  unsigned int digits[9];
4
  unsigned int h_zehner, h_einer, min_zehner, min_einer;
5
  
6
  h_zehner = 1;
7
  h_einer = 2;
8
  min_zehner = 3;
9
  min_einer = 4;
10
  
11
  digits[0] = 0x3F;
12
  digits[1] = 0x06;
13
  digits[2] = 0x5B;
14
  digits[3] = 0x4F;
15
  digits[4] = 0x66;
16
  digits[5] = 0x6D;
17
  digits[6] = 0x7D;
18
  digits[7] = 0x07;
19
  digits[8] = 0x7F;
20
  digits[9] = 0x6F;
21
  
22
  
23
  //Ausgabe der Werte
24
  i2c_start();
25
  i2c_send_adr(0x70);
26
  i2c_send_instruction();
27
  i2c_send_control();
28
  i2c_send_data(digits[h_zehner]);
29
  i2c_send_data(digits[h_einer]);
30
  i2c_send_data(digits[min_zehner]);
31
  i2c_send_data(digits[min_einer]);
32
  i2c_send_stop();  
33
}

Die abgearbeiteten Funktionen stehen in einem (selbstverständlich 
eingebundenem) Header-File:
1
#include <util/twi.h>
2
3
#ifndef scl_frequency
4
#error SCL_Frequency nicht definiert!
5
#endif
6
7
void i2c_start()
8
{
9
  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
10
   while (!(TWCR & (1<<TWINT)));
11
  
12
  if ((TWSR & 0xF8) != TW_START)
13
  {  
14
    //Fehler beim übermitteln des Startbits
15
  }
16
}
17
18
void i2c_send_adr(unsigned char sla_w)
19
{
20
  //Senden der Adresse
21
  TWDR = sla_w;            // slave_write Adresse ins TwoWireDataRegister laden
22
  TWCR = (1<<TWINT) | (1<<TWEN);    // TWINT setzen und somit senden
23
  while(!(TWCR & (1<<TWINT)));    // warten bis Übermittlung abgeschlossen
24
  
25
  if((TWSR & 0xF8) != TW_MT_SLA_ACK)  // Überprüfen ob initialwert (0xF8) ungleich Prüffolge
26
  {
27
    //Fehler beim Ansprechen des Slaves
28
  }
29
}
30
31
void i2c_send_data(unsigned char data)
32
{
33
  //Senden von Daten
34
  TWDR = data;
35
  TWCR = (1<<TWINT) | (1<<TWEN);
36
  while(!(TWCR & (1<<TWINT)));
37
  
38
  if ((TWSR & 0xF8) != TW_MT_DATA_ACK)
39
  {
40
    //Fehler beim senden der Daten
41
  }
42
}
43
44
void i2c_send_instruction()
45
{
46
  //Senden des Instruction Bytes
47
  TWDR = 0x00;  //schreiben des Controllbytes jedes mal aufs Neue
48
  TWCR = (1<<TWINT) | (1<<TWEN);
49
  while(!(TWCR & (1<<TWINT)));
50
  
51
  if ((TWSR & 0xF8) != TW_MT_DATA_ACK)
52
  {
53
    //Fehler beim senden der Daten
54
  }
55
}
56
57
void i2c_send_control()
58
{
59
  //Senden des Controllbytes
60
  
61
  /*C0 = 0 static mode, i.e. continuous display of digits 1 and 2
62
  C0 = 1 dynamic mode, i.e. alternating display of digit 1 + 3 and 2 + 4
63
  C1 = 0/1 digits 1 + 3 are blanked/not blanked
64
  C2 = 0/1 digits 2 + 4 are blanked/not blanked
65
  C3 = 1 all segment outputs are switched-on for segment test(1)
66
  C4 = 1 adds 3 mA to segment output current
67
  C5 = 1 adds 6 mA to segment output current
68
  C6 = 1 adds 12 mA to segment output current*/
69
  
70
  TWDR = 0b01111111;
71
  TWCR = (1<<TWINT) | (1<<TWEN);
72
  while(!(TWCR & (1<<TWINT)));
73
  
74
  if ((TWSR & 0xF8) != TW_MT_DATA_ACK)
75
  {
76
    //Fehler beim senden der Daten
77
  }
78
}
79
80
void i2c_send_stop()
81
{
82
  //Senden der Stopbedingung
83
  TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
84
}

Ich habe die Pins PC4 und PC5 des µC auf dem Oszischirm... Beide 
kontinuierlich 5V (da PullUp Beschaltung). Scheint also nicht mal an dem 
SAA zu liegen.

Was ist hier noch Falsch bzw. fehlerhaft?

Vielen Dank und angenehmen Abend!
Danke vielmals.

von steffen (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Tim,

hab dir mal meinen SAA Code dran gehangen. War mal ein Test für einen 
Atmega8. Ist aber schon paar Tage her dass ich den in Gebrauch hatte.

Gruß Steffen

von Tim (Gast)


Lesenswert?

Hallo,

danke erstmal für die Dateien! Ich hab sie mal durchgeschaut und weiter 
probiert... ich hab mittlerweile herausgefunden, dass sich das Programm 
beim Senden abschiest,...

Scheinbar wird vom Chip das Flag, welches das Ende der Übertragung 
signalisiert nicht korrekt gesetzt.. in der While-Schleife
1
while(!(TWCR & (1<<TWINT)));

..fängt sich das Programm und dann ist Feierabend.

Muss das jetzt zwingend am IC liegen? Ich habe vergleichsweise viel für 
diesen IC bezahlt und extra eine Platine angefertigt um das SMD-Package 
verwenden zu können... wäre super mies wenn das Modul defekt wäre!

Gibt es Möglichkeiten die Kommunikation zu testen?

Viele Grüße!

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.