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
- Zacznij od skanera I²C – potwierdź adres PCF8574.
- Jeśli używasz Bascom-AVR – włącz
LCD_I2C_PCF8574.lib
i skróć stos:
$hwstack=24, $swstack=8, $framesize=16
.
- Kompiluj z optymalizacją ‑Os (avr-gcc) lub „Optimize for size” (Bascom).
- Wyłącz nieużywane moduły (ADC, analog comparator) dla oszczędności prądu.
- 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.
Zadaj dodatkowe pytanie Sztucznej Inteligencji
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.