ATtiny25 sterowanie LCD HD44780 przez I2C z PCF8574 – minimalny kod, podłączenie, ograniczenia

Pytanie

Czy nA attiny25 mogę sterować LCD po i2c z pomocą pcf8574

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

  • Tak, ATtiny25 może sterować wyświetlaczem LCD (HD44780 / kompatybilnym) przez magistralę I²C za pośrednictwem ekspandera PCF8574.
  • Wymaga to implementacji programowego (lub USI-bazowanego) sterownika I²C oraz minimalistycznej biblioteki LCD, ponieważ ATtiny25 ma tylko 2 kB Flash i 128 B SRAM.

Kluczowe punkty
• Linie SDA → PB0, SCL → PB2 (lub dowolne inne piny przy bit-bang).
• Pull-upy 4 kΩ – 10 kΩ na SDA i SCL.
• Adres PCF8574: 0x20–0x27 (lub 0x38–0x3F dla PCF8574A).
• Kod należy maksymalnie okroić lub skorzystać z TinyWireM / własnego sterownika.

Szczegółowa analiza problemu

1. Zasoby mikrokontrolera ATtiny25

  • Flash = 2 kB, SRAM = 128 B, EEPROM = 128 B.
  • Brak sprzętowego TWI; zamiast tego:
    • USI (Universal Serial Interface) – można skonfigurować jako Master I²C (najmniej kodu, wymaga przerwań).
    • Bit-bang na dowolnych pinach – najprostsze, ale wolniejsze.

2. Rola PCF8574

  • 8-bitowy ekspander I/O open-drain.
  • Pozwala obsłużyć LCD w trybie 4-bitowym: RS, E, D4–D7, opcjonalnie podświetlenie.
  • Transakcja: Master wysyła jeden bajt sterujący, którym ustawia stany linii LCD.

3. Minimalna sekwencja inicjalizacyjna LCD przez PCF8574

1. Opóźnienie >40 ms od zasilania LCD
2. Trzykrotne wysłanie 0b0011xxxx (E-puls) → tryb 8-bit
3. Wysłanie 0b0010xxxx           → przejście na 4-bit
4. Funkcja 0x28 (4-bit, 2 wiersze)
5. Display ON 0x0C
6. Entry mode 0x06
7. Clear 0x01

Każdy „nibble” wysyłamy:
a) zapal RS zgodnie z komendą/danymi, ustaw cztery bity danych, E=1
b) krótka zwłoka ≥450 ns
c) E=0, zwłoka ≥37 µs (komenda) lub ≥1,52 ms (Clear / Home).

4. Analiza zużycia pamięci

  • Programowe I²C + pełna biblioteka LCD z łańcuchami TEXT potrafi zająć 1,2–1,6 kB.
  • Zostaje 400–800 B Flash na logikę aplikacji i ~80 B wolnej RAM.
  • Jeżeli potrzebujesz czegoś więcej niż statyczny tekst – rozważ ATtiny45/85 (8 kB Flash, 512 B SRAM) lub ATmega328P.

5. Implementacja – przykładowy szkic (AVR-GCC + TinyWireM)

#include <avr/io.h>
#include "TinyWireM.h"
#define PCF_ADDR 0x27  // dopasuj do zworki A0..A2
void pcfWrite(uint8_t data)
{
    TinyWireM.beginTransmission(PCF_ADDR);
    TinyWireM.write(data);
    TinyWireM.endTransmission();
}
void lcdNibble(uint8_t nib, uint8_t rs)
{
    uint8_t d = (nib << 4) | (rs?0x01:0x00);      // RS=D0
    pcfWrite(d | 0x04);        // E=1
    _delay_us(1);
    pcfWrite(d);               // E=0
    _delay_us(50);
}
void lcdCmd(uint8_t c) { lcdNibble(c>>4,0); lcdNibble(c&0x0F,0); }
void lcdChr(uint8_t c) { lcdNibble(c>>4,1); lcdNibble(c&0x0F,1); }
void lcdInit(void)
{
    _delay_ms(50);
    for(uint8_t i=0;i<3;i++){ lcdNibble(0x3,0); _delay_ms(5); }
    lcdNibble(0x2,0);          // 4-bit
    lcdCmd(0x28);              // 2-line
    lcdCmd(0x0C);              // display on
    lcdCmd(0x06);              // entry mode
    lcdCmd(0x01); _delay_ms(2);
}
int main(void)
{
    TinyWireM.begin();         // SCL=PB2, SDA=PB0
    lcdInit();
    const char txt[] = "Hello!";
    for(uint8_t i=0; txt[i]; ++i) lcdChr(txt[i]);
    for(;;);
}

Rozmiar .hex ~1200 B, SRAM ~40 B.

Aktualne informacje i trendy

  • Biblioteki TinyWireM, MicroCore oraz minified LiquidCrystal_I2C są utrzymywane (2024) i wspierają ATtiny25/45/85.
  • Pojawiają się gotowe „lite” forki LiquidCrystal_PCF8574 (<4 kB) przygotowane specjalnie pod mikrokontrolery z małą Flash.
  • Coraz częściej stosuje się alternatywne ekspandery (MCP23008 / MCP23017) oferujące przerwania i wyższe prądy wyjściowe.

Wspierające wyjaśnienia i detale

  • Pull-up 4k7 wystarcza przy 100 kHz; dla 400 kHz na krótkich przewodach można zejść do 2k2.
  • PCF8574 ma otwarte dreny; linie LCD są więc pseudo-dwustanowe – napięcie HIGH zależy od rezystorów i prądu LCD.
  • Podświetlenie LED zwykle steruje się oddzielnie; mostek tranzystorowy lub MOSFET pozwoli zdjąć ten prąd z PCF8574.

Aspekty etyczne i prawne

  • Brak szczególnych wymogów licencyjnych; TinyWireM i LiquidCrystal_I2C są LGPL / MIT.
  • Zadbaj o zgodność EMC: długość przewodów I²C < 20 cm przy 400 kHz lub redukcja prędkości.
  • Przy produktach komercyjnych należy spełnić Dyrektywę RoHS oraz oznaczyć urządzenie CE.

Praktyczne wskazówki

  1. Zacznij od skanera I²C – potwierdź adres PCF8574.
  2. Jeśli używasz Bascom-AVR – włącz LCD_I2C_PCF8574.lib i skróć stos:
    $hwstack=24, $swstack=8, $framesize=16.
  3. Kompiluj z optymalizacją ‑Os (avr-gcc) lub „Optimize for size” (Bascom).
  4. Wyłącz nieużywane moduły (ADC, analog comparator) dla oszczędności prądu.
  5. Gdy pojawią się dziwne znaki – sprawdź timing E (≥450 ns) oraz poziom kontrastu V0 (zwykle 10 kΩ potencjometr do GND).

Ewentualne zastrzeżenia lub uwagi dodatkowe

  • 2 kB Flash to absolutne minimum; każdy dodatkowy feature (pomiar ADC, komunikacja UART-to-USB) wymaga dalszych optymalizacji.
  • PCF8574 dostarcza jedynie ~0,8 mA w stanie wysokim; przy zbyt długich taśmach / niskim napięciu pojawia się problem z czasem narastania – wtedy obniż takt I²C.
  • Jeśli potrzebujesz regulować podświetlenie PWM – użyj wolnego pinu ATtiny zamiast PCF8574.

Sugestie dalszych badań

  • Sprawdź biblioteki „hd44780-lite” lub „MinimalHD44780” pisane w czystym C dla AVR <2 kB.
  • Test alternatywnego interfejsu SPI (np. układ 74HC595) – szybszy i bez ograniczeń open-drain.
  • Porównaj wydajność USI vs bit-bang przy 1 MHz i 8 MHz system clock.
  • Zbadaj wpływ różnych rezystancji pull-up na integralność sygnału przy 5 V i 3,3 V.

Krótkie podsumowanie

ATtiny25 potrafi obsłużyć LCD przez I²C z ekspanderem PCF8574, lecz zasoby pamięci i słabe wyjścia PCF narzucają minimalistyczny, dobrze zoptymalizowany kod. Dla projektów bardziej złożonych rozważ ATtiny45/85 lub ATmega z pełnym sprzętowym TWI. Jeśli jednak zależy Ci na dwóch wolnych liniach i mikroskopijnym układzie ‑ powyższy schemat i kod startowy pozwolą bezproblemowo uruchomić wyświetlacz.

Oceń odpowiedź:

Zadaj dodatkowe pytanie Sztucznej Inteligencji

Czekaj (1min)...
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.