ATtiny1614 mit lcd 4 segment display

#7902371
Lesenswert?

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
// 1) BIAS 1/3 & 4-COM
2
sendcmd(0x852);
3
// 2) SYS EN (Oszillator AN)
4
sendcmd(0x802);
5
// 3) LCD ON (Bias-Generator AN)
6
sendcmd(0x806);
7

8
// Vorherige Segmente löschen
9
for (uint8_t a = 0; a < 31; a++) {
10
    writedata(a, 0x00);
11
}
12

13
// Segment-Mapping (anpassen für Dein Panel!)
14
const uint8_t SEG_A   = 0;
15
const uint8_t SEG_B   = 1;
16
const uint8_t SEG_C   = 2;
17
const uint8_t SEG_D   = 3;
18
const uint8_t SEG_E   = 4;
19
const uint8_t SEG_F   = 5;
20
const uint8_t SEG_G   = 13;
21
const uint8_t SEG_COL = 14;
22

23
// COM-Bits: COM0=d0=0b0001 … COM3=d3=0b1000
24
const uint8_t digit_com[4] = {0x1, 0x2, 0x4, 0x8};
25
const uint8_t segs[7] = {
26
    SEG_A, SEG_B, SEG_C, SEG_D, SEG_E, SEG_F, SEG_G
27
};
28

29
// “8” auf allen 4 Stellen zeichnen
30
for (uint8_t d = 0; d < 4; d++) {
31
    for (uint8_t s = 0; s < 7; s++) {
32
        writedata(segs[s], digit_com[d]);
33
    }
34
}
35
// Doppelpunkt zwischen Stelle 2/3
36
writedata(SEG_COL, 0x2 | 0x4);
37

38
while (1) { /* nix weiter */ }

}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren