Hallo zusammen Ich habe folgendes Problem. Ich nutze einen ATtiny1614, mit dem ich einen 12PIN LCD Tn Positive 4-stelliges Segment display betreiben will. Allerdings bekomme ich bisher überhaupt nicht auf den Display. Vielleicht findet jemand ein Fehler den ich nicht sehe? Den Display habe ich mit einem TM1621C zusammengehängt und den TM1621C mit dem ATtiny1614. Folgende pins: ATtiny1614 - TM1621C PA1 - CS PA2 - WR PA3 - Data Gnd - VSS VDD - VDD TM1621c - Display COM0 - COM1 (Pin1) COM1 - COM2 (Pin2) COM2 - COM3 (Pin3) COM3 - COM4 (Pin4) SEG0 - Pin5 SEG1 - Pin6 SEG2 - Pin7 SEG3 - Pin8 SEG4 - Pin9 SEG5 - Pin10 SEG13 - Pin11 SEG14 - Pin12 Zudem nutze ich folgenden code, damit möchte ich simpel 88:88 darstellen: /** * ATtiny1614 → TM1621C: Zeigt 88:88 * PA1 = CS, PA2 = WR, PA3 = DATA */ #include <avr/io.h> #include <util/delay.h> #define CS_PIN PIN1_bm // PA1 #define WR_PIN PIN2_bm // PA2 #define DAT_PIN PIN3_bm // PA3 // ~2 µs Setup/hold static inline void tpd(void) { _delay_us(2); } // Ein Bit senden (MSB-first), CPOL=1/CPHA=1 static void sendbit(uint8_t bit) { if (bit) PORTA.OUTSET = DAT_PIN; else PORTA.OUTCLR = DAT_PIN; tpd(); PORTA.OUTCLR = WR_PIN; tpd(); PORTA.OUTSET = WR_PIN; tpd(); } // Mehrere Bits MSB-first static void sendbits(uint32_t data, uint8_t bits) { for (int i = bits - 1; i >= 0; i--) sendbit((data >> i) & 1); } // 12-Bit-Kommando senden static void sendcmd(uint16_t cmd) { PORTA.OUTCLR = CS_PIN; tpd(); sendbits(cmd, 12); tpd(); PORTA.OUTSET = CS_PIN; tpd(); } // 13-Bit-Datenpaket: 101 + addr[5:0] + data[3:0] static void writedata(uint8_t addr, uint8_t data4) { uint16_t packet = (0b101u << 10) | ((addr & 0x3F) << 4) | (data4 & 0x0F); PORTA.OUTCLR = CS_PIN; tpd(); sendbits(packet, 13); tpd(); PORTA.OUTSET = CS_PIN; tpd(); } int main(void) { // I/O → output, idles: CS=1, WR=1 PORTA.DIRSET = CS_PIN | WR_PIN | DAT_PIN; PORTA.OUTSET = CS_PIN | WR_PIN; _delay_ms(10); // POR-Delay // 1) BIAS 1/3 & 4-COM sendcmd(0x852); // 2) SYS EN (Oszillator AN) sendcmd(0x802); // 3) LCD ON (Bias-Generator AN) sendcmd(0x806); // Vorherige Segmente löschen for (uint8_t a = 0; a < 31; a++) { writedata(a, 0x00); } // Segment-Mapping (anpassen für Dein Panel!) const uint8_t SEG_A = 0; const uint8_t SEG_B = 1; const uint8_t SEG_C = 2; const uint8_t SEG_D = 3; const uint8_t SEG_E = 4; const uint8_t SEG_F = 5; const uint8_t SEG_G = 13; const uint8_t SEG_COL = 14; // COM-Bits: COM0=d0=0b0001 … COM3=d3=0b1000 const uint8_t digit_com[4] = {0x1, 0x2, 0x4, 0x8}; const uint8_t segs[7] = { SEG_A, SEG_B, SEG_C, SEG_D, SEG_E, SEG_F, SEG_G }; // “8” auf allen 4 Stellen zeichnen for (uint8_t d = 0; d < 4; d++) { for (uint8_t s = 0; s < 7; s++) { writedata(segs[s], digit_com[d]); } } // Doppelpunkt zwischen Stelle 2/3 writedata(SEG_COL, 0x2 | 0x4); while (1) { /* nix weiter */ } }
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
Paul schrieb: > H. H. schrieb: >> Wie stets um V_LCD des 1621? > > Den V_LCD habe ich über einen 1µF mit GND verbunden. Hättest mal ins Datenblatt sehen sollen, der gehört über einige kOhm an Vdd. Nimm mal einen 10kOhm Trimmer.
:
Bearbeitet durch User
ja du hast recht, das hab ich falsch entnommen. Jetzt blink schonmal was auf dem Bildschirm. Läuft nocht nicht perfekt, aber immerhin tut sich etwas. Danke
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.