Forum: Mikrocontroller und Digitale Elektronik ATtiny1614 mit lcd 4 segment display


von Paul (paul-h)


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) 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 */ }
}

von Ulf P. (bastler2004)


Lesenswert?

Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

von H. H. (hhinz)


Lesenswert?

Wie stets um V_LCD des 1621?

von Thilo L. (bc107)


Lesenswert?

H. H. schrieb:
> Wie stets um V_LCD des 1621?

Er meint:

Wie steht's um V_LCD des 1621?

von Paul (paul-h)


Lesenswert?

H. H. schrieb:
> Wie stets um V_LCD des 1621?

Den V_LCD habe ich über einen 1µF mit GND verbunden.

von H. H. (hhinz)


Lesenswert?

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
von Paul (paul-h)


Lesenswert?

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
Noch kein Account? Hier anmelden.