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
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.
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ß
Probiere es mal mit der "1", die braucht nur zwei Segmente und ist dadurch einfacher anzusteuern.
Verstehe nicht, wieso die 1 einfacher sein soll. Ist doch nur ein anderer Wert den ich über den twi schicke.
> 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
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.
Ah sehe gerade, hatte mich verschrieben, kein Wunder das du nichts gefunden hast nicht SAA1046 sondern SAA1064.
Was dein Programm angeht... Hast du mal in Betracht gezogen, am Ende einer I2C-Übertragung auch mal eine Stop-Condition zu senden? Gruß, Magnetus
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.