подключение tft 2.4
- Войдите на сайт для отправки комментариев
здраствуйте, пологаю я успел надоесть
есть вот такой дисплей http://www.mikrocontroller.net/attachment/230681/display_2.jpg на ili9325 подключил его к самодельной ардуине на Atmega128 немного танца с бубно и библиотеки от суда https://alselectro.wordpress.com/2014/11/28/touch-screen-tft-shield-for-... удалось его запустить, всё отлично
но вовпрос заключается в следующим, можно ли за местли в место
// #define LCD_CS A3 // Chip Select goes to Analog 3
// #define LCD_CD A2 // Command/Data goes to Analog 2
// #define LCD_WR A1 // LCD Write goes to Analog 1
// #define LCD_RD A0 // LCD Read goes to Analog 0
// #define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin
использовать цифровые пины ?
простите за откровенно глупый вопрос хотель бы спросить мнение знающих людей прежде чем куралесить
да) они кстати все цифровые
так у тебя все цифровые заняты же
нет, у atmega128 42цифровых пина
http://www.automation-drive.com/EX/05-15-01/AVR-H128-sch.gif
для подключения пришлось подправить файл uno_24_shield.h
#ifndef _UNO_24_SHIELD_
#define _UNO_24_SHIELD_
// Code provided by Smoke And Wires
// http://www.smokeandwires.co.nz
// This code has been taken from the Adafruit TFT Library and modified
// by us for use with our TFT Shields / Modules
// For original code / licensing please refer to
// https://github.com/adafruit/TFTLCD-Library
// This header file serves two purposes:
//
// 1) Isolate non-portable MCU port- and pin-specific identifiers and
// operations so the library code itself remains somewhat agnostic
// (PORTs and pin numbers are always referenced through macros).
//
// 2) GCC doesn't always respect the "inline" keyword, so this is a
// ham-fisted manner of forcing the issue to minimize function calls.
// This sometimes makes the library a bit bigger than before, but fast++.
// However, because they're macros, we need to be SUPER CAREFUL about
// parameters -- for example, write8(x) may expand to multiple PORT
// writes that all refer to x, so it needs to be a constant or fixed
// variable and not something like *ptr++ (which, after macro
// expansion, may increment the pointer repeatedly and run off into
// la-la land). Macros also give us fine-grained control over which
// operations are inlined on which boards (balancing speed against
// available program space).
// Smoke And Wires 2.4 Shield pin usage:
// LCD Data Bit : 7 6 5 4 3 2 1 0
// Digital pin #: 7 6 5 4 3 2 9 8
// Uno port/pin : PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin
// Pixel read operations require a minimum 400 nS delay from RD_ACTIVE
// to polling the input pins. At 16 MHz, one machine cycle is 62.5 nS.
// This code burns 7 cycles (437.5 nS) doing nothing; the RJMPs are
// equivalent to two NOPs each, final NOP burns the 7th cycle, and the
// last line is a radioactive mutant emoticon.
#define DELAY7 \
asm volatile( \
"rjmp .+0" "\n\t" \
"rjmp .+0" "\n\t" \
"rjmp .+0" "\n\t" \
"nop" "\n" \
::);
// // These set the PORT directions as required before the write and read
// // operations. Because write operations are much more common than reads,
// // the data-reading functions in the library code set the PORT(s) to
// // input before a read, and restore them back to the write state before
// // returning. This avoids having to set it for output inside every
// // drawing method. The default state has them initialized for writes.
// #define setWriteDirInline() { DDRD |= B11010000; DDRB |= B00101111; }
// #define setReadDirInline() { DDRD &= ~B11010000; DDRB &= ~B00101111; }
//
#define write8inline(d) { \
PORTD = (PORTD & B00000000) | ((d) & B11111111); \
WR_STROBE; }
#define read8inline(result) { \
RD_ACTIVE; \
DELAY7; \
result = (PIND & B11111111); \
RD_IDLE; }
#define setWriteDirInline() { DDRD |= B11111111;}
#define setReadDirInline() { DDRD &= ~B11111111;}
// As part of the inline control, macros reference other macros...if any
// of these are left undefined, an equivalent function version (non-inline)
// is declared later. The Uno has a moderate amount of program space, so
// only write8() is inlined -- that one provides the most performance
// benefit, but unfortunately also generates the most bloat. This is
// why only certain cases are inlined for each board.
#define write8 write8inline
// When using the TFT breakout board, control pins are configurable.
#define RD_ACTIVE *rdPort &= rdPinUnset
#define RD_IDLE *rdPort |= rdPinSet
#define WR_ACTIVE *wrPort &= wrPinUnset
#define WR_IDLE *wrPort |= wrPinSet
#define CD_COMMAND *cdPort &= cdPinUnset
#define CD_DATA *cdPort |= cdPinSet
#define CS_ACTIVE *csPort &= csPinUnset
#define CS_IDLE *csPort |= csPinSet
// #endif
// #endif
// Data write strobe, ~2 instructions and always inline
#define WR_STROBE { WR_ACTIVE; WR_IDLE; }
// These higher-level operations are usually functionalized,
// except on Mega where's there's gobs and gobs of program space.
// Set value of TFT register: 8-bit address, 8-bit value
#define writeRegister8inline(a, d) { \
CD_COMMAND; write8(a); CD_DATA; write8(d); }
// Set value of TFT register: 16-bit address, 16-bit value
// See notes at top about macro expansion, hence hi & lo temp vars
#define writeRegister16inline(a, d) { \
uint8_t hi, lo; \
hi = (a) >> 8; lo = (a); CD_COMMAND; write8(hi); write8(lo); \
hi = (d) >> 8; lo = (d); CD_DATA ; write8(hi); write8(lo); }
// Set value of 2 TFT registers: Two 8-bit addresses (hi & lo), 16-bit value
#define writeRegisterPairInline(aH, aL, d) { \
uint8_t hi = (d) >> 8, lo = (d); \
CD_COMMAND; write8(aH); CD_DATA; write8(hi); \
CD_COMMAND; write8(aL); CD_DATA; write8(lo); }
#endif // _UUNO_24_SHIELD_
так я получил возможность использовать всю линейку PD0-PD7
библиотеки от суда
да не всё так просто поменяь аналоговые пины на цифровые, похоже придётся опять лесть во внутрь, библиотеки
// Constructor for breakout board (configurable LCD control lines).
// Can still use this w/shield, but parameters are ignored.
SWTFT::SWTFT() : Adafruit_GFX(TFTWIDTH, TFTHEIGHT) {
// Convert pin numbers to registers and bitmasks
_reset = LCD_RESET;
csPort = portOutputRegister(digitalPinToPort(LCD_CS));
cdPort = portOutputRegister(digitalPinToPort(LCD_CD));
wrPort = portOutputRegister(digitalPinToPort(LCD_WR));
rdPort = portOutputRegister(digitalPinToPort(LCD_RD));
csPinSet = digitalPinToBitMask(LCD_CS);
cdPinSet = digitalPinToBitMask(LCD_CD);
wrPinSet = digitalPinToBitMask(LCD_WR);
rdPinSet = digitalPinToBitMask(LCD_RD);
csPinUnset = ~csPinSet;
cdPinUnset = ~cdPinSet;
wrPinUnset = ~wrPinSet;
rdPinUnset = ~rdPinSet;
*csPort |= csPinSet; // Set all control bits to HIGH (idle)
*cdPort |= cdPinSet; // Signals are ACTIVE LOW
*wrPort |= wrPinSet;
*rdPort |= rdPinSet;
pinMode(LCD_CS, OUTPUT); // Enable outputs
pinMode(LCD_CD, OUTPUT);
pinMode(LCD_WR, OUTPUT);
pinMode(LCD_RD, OUTPUT);
// if(reset) {
digitalWrite(LCD_RESET, HIGH);
pinMode(LCD_RESET, OUTPUT);
// }
пологаю это гдето сдесь, сам я не программист, это можно сказать хобби
посоветует может кто, как это поправить или где ещё порыть
Библиотеки лучше от прокуратуры брать.
Лесть тоже не поможет. Только бабки. %)
[quote=exolon]
здраствуйте, пологаю я успел надоесть
есть вот такой дисплей http://www.mikrocontroller.net/attachment/230681/display_2.jpg на ili9325 подключил его к самодельной ардуине на Atmega128 немного танца с бубно и библиотеки от суда https://alselectro.wordpress.com/2014/11/28/touch-screen-tft-shield-for-... удалось его запустить, всё отлично
А мне почему то даже танцы с бубном не помогают :(
Что я делаю не так? Или может чего то не делаю. Сделал как указанно. Скачал библиотеки. Установил прошиваю а толку нет......
возможно 2 ньюанса вымогли ошибиться с распиновкой её можно посмотреть в файле hardware\arduino\variants\crumbuino128\plus_arduino.h
библиотека довольно старая без излишиств и расчитана на atmega238 дисплей подключен к #define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4 // Can alternately just connect to RESET
и
// LCD Data Bit : 7 6 5 4 3 2 1 0
// Digital pin #: 7 6 5 4 3 2 9 8
// Uno port/pin : PD7 PD6 PD5 PD4 PD3 PD2 PB1 PB0
что соответствует лапам МК А0-61/А1-60/А2-59/А3-58/А4-57/
PD7-LСD_D7-32
PD-6-LCD_D6-31
PD5-LCD_D5-30
PD4-LCD_D4-29
PD3-LCD_D3-28
PD2-LCD_D2-27
PB1-LCD_D1-11
PB0-LCD_D0-10
так он подключается стандартно, но меня не устроил такой расклад, вот и подправил файл библиотеки.
попробуйте подключить именно так без правки файла
а если подключат с исправленным файлом
PD7-LСD_D7-32
PD-6-LCD_D6-31
PD5-LCD_D5-30
PD4-LCD_D4-29
PD3-LCD_D3-28
PD2-LCD_D2-27
PD1-LCD_D1-26
PD0-LCD_D0-25
проверте всё внимательно
Здравствуйте. А кто-нибудь добивался работы Atmega128 и дисплея tft 2.4 на ili9341? Библиотека "SPFD5408-master" c гит хаба. https://github.com/JoaoLopesF/SPFD5408 ( Кстати, на 328 атмеге все чудесно работает с этой библиотекой, но свободных пинов почти не остается.). Ковырял ее долго. Но опыта маловато. Исправлял файлы библиотеки и "pin_magic.h" и "SPFD5408_Adafruit_TFTLCD.cpp". Не помогло. Может кто подскажет как Atmega128 с TFT 2.4 на ili9341 поженить. На данный момент при загрузке график теста из примеров экран мерцает и видно, что процесс идет. Но, похоже, не происходит инициализации дисплея и картинки нет, только мерцание. В Atmega128 загрузчик MegaCore с гит хаба (https://github.com/MCUdude/MegaCore). Исправленная мной библиотека здесь https://yadi.sk/d/HlwgoRtS3HYgNZ .
Хоть тема и древняя, но может кто откликнется.:)