Forum: Mikrocontroller und Digitale Elektronik 7Segment über I2C an ATMEga128


von Steffan (Gast)


Lesenswert?

Hallo, ich habe ein Problem, ich weiß allerdings nicht, ob es an der 
hardware liegt oder am C-Code. Vielleicht kann mir ja jemand helfen.

Beim ATMEGA128 ist noch der interne ozi aktiviert Pullups habe ich 10k

hier der Code:

#include <avr/io.h>
#include "7segment.h"
#define TAKT 1000000UL
#define FAKTOR 41
#define TEILER 1



void init(unsigned char faktor, unsigned char teiler)
{
  TWBR = faktor;
  TWSR = teiler;
}

void send_7segment(unsigned char adresse, unsigned char subadresse, 
unsigned char controlbits,
      unsigned char Daten_Digti1, unsigned char Daten_Digti2, unsigned 
char Daten_Digti3, unsigned char Daten_Digti4 )


{
  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);    // Startbedingung

  loop_until_bit_is_set(TWCR,TWINT);        // warte bis fertig
  TWDR = adresse;                  // Adresse
  TWCR = (1<<TWINT) | (1<<TWEN);          // senden
  loop_until_bit_is_set(TWCR,TWINT);        // warte bis fertig

  TWDR = subadresse;                // Subadresse
  TWCR = (1<<TWINT) | (1<<TWEN);          // senden
  loop_until_bit_is_set(TWCR,TWINT);        // warte bis fertig

  TWDR = controlbits;                // Controlbits
  TWCR = (1<<TWINT) | (1<<TWEN);          // senden
  loop_until_bit_is_set(TWCR,TWINT);        // warte bis fertig

  TWDR = Daten_Digti1;                // DIGIT1
  TWCR = (1<<TWINT) | (1<<TWEN);          // senden
  loop_until_bit_is_set(TWCR,TWINT);        // warte bis fertig

  TWDR = Daten_Digti2;                // DIGTI2
  TWCR = (1<<TWINT) | (1<<TWEN);          // senden
  loop_until_bit_is_set(TWCR,TWINT);        // warte bis fertig

  TWDR = Daten_Digti3;                // DIGIT3
  TWCR = (1<<TWINT) | (1<<TWEN);          // senden
  loop_until_bit_is_set(TWCR,TWINT);        // warte bis fertig

  TWDR = Daten_Digti4;                // DIGIT3
  TWCR = (1<<TWINT) | (1<<TWEN);          // senden
  loop_until_bit_is_set(TWCR,TWINT);        // warte bis fertig

  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
}


void segment_init(unsigned char adresse, unsigned char subadresse, 
unsigned char controlbits)
{
  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);    // Startbedingung

  loop_until_bit_is_set(TWCR,TWINT);        // warte bis fertig
  TWDR = adresse;                  // Adresse
  TWCR = (1<<TWINT) | (1<<TWEN);          // senden
  loop_until_bit_is_set(TWCR,TWINT);        // warte bis fertig

  TWDR = subadresse;                // Subadresse
  TWCR = (1<<TWINT) | (1<<TWEN);          // senden
  loop_until_bit_is_set(TWCR,TWINT);        // warte bis fertig

  TWDR = controlbits;                // Controlbits
  TWCR = (1<<TWINT) | (1<<TWEN);          // senden
  loop_until_bit_is_set(TWCR,TWINT);        // warte bis fertig

  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
}



void main (void)
{
  init (FAKTOR, TEILER);
  while (1){
  segment_init (ADRESSE_7SEGMENT_SCHREIBEN, CONTROL_REGISTER_LED, 
DYN_B13_B24_12mA);
  send_7segment (ADRESSE_7SEGMENT_SCHREIBEN, DIGIT1, DYN_B13_B24_12mA, 
acht, acht, acht ,acht);
  }
}


und die 7segment.h

#define ADRESSE_7SEGMENT_SCHREIBEN 0x70
#define ADRESSE_7SEGMENT_LESEN 0x71

#define CONTROL_REGISTER_LED 0x00
#define DIGIT1 0x01
#define DIGIT2 0x02
#define DIGIT3 0x03
#define DIGIT4 0x04

#define eins 0x06
#define zwei 0x5B
#define drei 0x4F
#define vier 0x66
#define fuenf 0x6D
#define sechs 0x7D
#define sieben 0x07
#define acht 0x7F
#define neun 0x6F


// following is for static mode
#define STA_B13_B24_12mA 0x40  // blanked 1+3 and blanked 2+4 and 
current 12mA
#define STA_B13_B24_06mA 0x20  // blanked 1+3 and blanked 2+4 and 
current 06mA
#define STA_B13_B24_03mA 0x10  // blanked 1+3 and blanked 2+4 and 
current 03mA

#define STA_NB13_B24_12mA 0x42  // not blanked 1+3 and blanked 2+4 and 
current 12mA
#define STA_NB13_B24_06mA 0x22  // not blanked 1+3 and blanked 2+4 and 
current 06mA
#define STA_NB13_B24_03mA 0x12  // not blanked 1+3 and blanked 2+4 and 
current 03mA

#define STA_B13_NB24_12mA 0x44  // blanked 1+3 and not blanked 2+4 and 
current 12mA
#define STA_B13_NB24_06mA 0x24  // blanked 1+3 and not blanked 2+4 and 
current 06mA
#define STA_B13_NB24_03mA 0x14  // blanked 1+3 and not blanked 2+4 and 
current 03mA

#define STA_12mA 0x46  // nothing blanked current 12mA
#define STA_06mA 0x26  // nothing blanked current 06mA
#define STA_03mA 0x16  // nothing blanked current 03mA

// following is for dynamic mode
#define DYN_B13_B24_12mA 0x41  // blanked 1+3 and blanked 2+4 and 
current 12mA
#define DYN_B13_B24_06mA 0x21  // blanked 1+3 and blanked 2+4 and 
current 06mA
#define DYN_B13_B24_03mA 0x11  // blanked 1+3 and blanked 2+4 and 
current 03mA

#define DYN_NB13_B24_12mA 0x43  // not blanked 1+3 and blanked 2+4 and 
current 12mA
#define DYN_NB13_B24_06mA 0x23  // not blanked 1+3 and blanked 2+4 and 
current 06mA
#define DYN_NB13_B24_03mA 0x13  // not blanked 1+3 and blanked 2+4 and 
current 03mA

#define DYN_B13_NB24_12mA 0x45  // blanked 1+3 and not blanked 2+4 and 
current 12mA
#define DYN_B13_NB24_06mA 0x25  // blanked 1+3 and not blanked 2+4 and 
current 06mA
#define DYN_B13_NB24_03mA 0x15  // blanked 1+3 and not blanked 2+4 and 
current 03mA

#define DYN_12mA 0x47  // nothing blanked current 12mA
#define DYN_06mA 0x27  // nothing blanked current 06mA
#define DYN_03mA 0x17  // nothing blanked current 03mA

von Magnus Müller (Gast)


Lesenswert?

Steffan wrote:
> Hallo, ich habe ein Problem, ich weiß allerdings nicht, ob es an der
> hardware liegt oder am C-Code. Vielleicht kann mir ja jemand helfen.
>
> Beim ATMEGA128 ist noch der interne ozi aktiviert Pullups habe ich 10k
>
> hier der Code:
>
>    ( ... )

Witzbold!

Was ist das Problem?
Wie äussert es sich?

Gruß,
Magnetus

P.S.:  Bitte nimm mir den "Witzbold" nicht übel, aber ein klein wenig
       konkreter müsste die Frage schon sein.

von Steffan (Gast)


Lesenswert?

Ja sorry,

habe auch vergessen zu erwähnen, das ich einen 4digit LED driver nutze 
den SAA1046.

Mein Problem ist, das ich eigentlich auf den Anzeigen eine "8" 
darstellen wollte, aber die Anzeige bleibt dunkel bzw es passiert 
nichts.

Gruß

von Galle (Gast)


Lesenswert?

Probiere es mal mit der "1", die braucht nur zwei Segmente und ist 
dadurch einfacher anzusteuern.

von Steffan (Gast)


Lesenswert?

Verstehe nicht, wieso die 1 einfacher sein soll. Ist doch nur ein 
anderer Wert den ich über den twi schicke.

von Magnus Müller (Gast)


Lesenswert?

> habe auch vergessen zu erwähnen, das ich einen 4digit LED driver nutze
> den SAA1046.

Puuuh... ob du es mir glaubst, oder nicht: ich finde auf die schnelle 
kein Datenblatt für den Keks. Hast du eins?

> Mein Problem ist, das ich eigentlich auf den Anzeigen eine "8"
> darstellen wollte, aber die Anzeige bleibt dunkel bzw es passiert
> nichts.

- Ist die Hardware richtig verstrippt?
- Passen die Displays auch zum Treiber? (Common Anode / Cathode)

Gruß,
Magnetus

von Steffan (Gast)


Angehängte Dateien:

Lesenswert?

Hier das Datenblatt von dem Treiber.
Der Treiber sollte für common Anode sein.
Ich habe die Segmente bei Reichelt bestellt
Kingbrigth SA08 11SRWA im Datenblatt steht auch common Anode, sollte 
also stimmen

Ich hoffe zumindestens das die Leitungen richtg angeschlossen sind.

von Steffan (Gast)


Angehängte Dateien:

Lesenswert?

Und hier nochmal der Schaltplan in eagle

von Steffan (Gast)


Lesenswert?

Ah sehe gerade, hatte mich verschrieben, kein Wunder das du nichts 
gefunden hast nicht SAA1046 sondern SAA1064.

von Magnus Müller (Gast)


Lesenswert?

Was dein Programm angeht... Hast du mal in Betracht gezogen, am Ende 
einer I2C-Übertragung auch mal eine Stop-Condition zu senden?

Gruß,
Magnetus

von Steffan (Gast)


Lesenswert?

Ok das stimmt, das kommt davon wenn man copy und paste macht und dan 
vergist nen Buchstaben zu ändern. Nun sieht die Stopbedingung so aus :

TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);

Aber leider hat das auch nicht zum Erfolg geholfen.
Irgendwo ist da also noch der Wurm drin.

von Steffan (Gast)


Lesenswert?

So, nun funktioniert es.
Habe nochmal in die Datenblätter geschaut uns siehe da was sehe ich, die 
LEDs bruachen ja 20mA, und ich sage dem treiber die ganze zeit er soll 
nur 12mA nutzen... so wird das natrülich nichts ;) aber nun klappt es, 
danke für die Hilfe

von Steffan (Gast)


Lesenswert?

Ich bin es nochmal, so wie es aussieht habe ich mich zu früh gefreut.
Scheinbar habe ich auch noch einen Hardware Fehler.
Nur Segment 3 wird korrekt angesteuert.
Segment 1 zeigt ständig ein A
Segment 2 kann teilweise einige zahlen nicht darstellen und liefert 
irgendetwas
und wenn ich im dynamic mode bin flackern ständig segment 1+3 und 2 
abwechselnt.

Jemand ne Idee? Schaltplan ist etwas weiter oben.

von Steffan (Gast)


Lesenswert?

Ok, habe noch ein Fehler im Code gefunden.
nunr werden alles zaheln dargestellt bis auf die 2, 3 und vier

schienbar haben die segmente  a und f kontakt, aber ich habe noch keine 
brücke gefunden. Muss ich mir also nochmal ansehen.

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.