Podłączyłem ten wyświetlacz pod atmega 128, do komunikacji z S65 wybrałem portb.0-portb.4. Używam kwarcu wewnętrznego 8Mhz jednak lcd nie daje znaków życia. Wszystko mam podłączone dobrze, bo sprawdzałem. I LCD jest sprawny, bo wcześniej działał.
Czy wolisz polską wersję strony elektroda?
Nie, dziękuję Przekieruj mnie tam
#include "common.h"
void init(void)
{
// enable peripheral clock for PIO controllers
AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_PIOA);
// enable reset-key on board
AT91C_BASE_RSTC->RSTC_RMR = (0xA5000000 | AT91C_RSTC_URSTEN);
//initialize LEDs
RESET_INIT;
RS_INIT;
}
#define SPI_PINS_MASK AT91C_PA11_NPCS0 | AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK
#define SPI_PIO AT91C_BASE_PIOA
#define SPI AT91C_BASE_SPI
#define SPI_ID AT91C_ID_SPI
const uint32_t NPCS_CODE_MASK[4] = { 0<<16, 1<<16, 3<<16, 7<<16 };
//tablica inicjalizacji
uint16_t INIT1[]= { 0xFDFD, 0xFDFD};
uint16_t INIT2[]={0xEF00, 0xEE04, 0x1B04, 0xFEFE, 0xFEFE,
0xEF90, 0x4A04, 0x7F3F, 0xEE04, 0x4306};
uint16_t INIT3[]= { 0xEF90, 0x0983, 0x0800, 0x0BAF, 0x0A00,
0x0500, 0x0600, 0x0700, 0xEF00, 0xEE0C,
0xEF90, 0x0080, 0xEFB0, 0x4902, 0xEF00,
0x7F01, 0xE181, 0xE202, 0xE276, 0xE183};
uint16_t INIT4[]= {0x8001, 0xEF90, 0x0000};
//zapis wyswietlacza
uint16_t MEMWR[]= {0xEF90, 0x0500, 0x0600, 0x0700};
int i;
uint16_t spiTransfer(uint16_t dataToSend, uint8_t channel)
{
uint16_t receivedData;
while( !( SPI->SPI_SR & AT91C_SPI_TDRE ) );
SPI->SPI_TDR = NPCS_CODE_MASK[channel] | dataToSend;
while( !( SPI->SPI_SR & AT91C_SPI_RDRF ) );
receivedData = (uint16_t)( SPI->SPI_RDR );
return(receivedData);
}
int main( void )
{
init();
//initialize SPI (common for all channels)
//disable PIO control on hardware controlled SPI pins
SPI_PIO->PIO_PDR = SPI_PINS_MASK;
//SPI pins are peripheral A
SPI_PIO->PIO_ASR = SPI_PINS_MASK;
//enable SPI clock
AT91C_BASE_PMC->PMC_PCER = ( 1 << SPI_ID );
//SPI enable and reset
SPI->SPI_CR = AT91C_SPI_SWRST;
const uint8_t DELAY_BETWEEN_CHIP_SELECTS = 0x00;
const uint32_t DLYBCS_MASK = (uint32_t)DELAY_BETWEEN_CHIP_SELECTS << 24;
//SPI Mode Register: Fault detection disable, variable periph. chip select
SPI->SPI_MR = DLYBCS_MASK | AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | AT91C_SPI_PS;
SPI->SPI_CR = AT91C_SPI_SPIEN;
const uint8_t BAUD_DIVIDER = 6;
const uint8_t DELAY_BEFORE_SPCK = 0;
const uint8_t DELAY_BETWEEN_CONSECUTIVE_TRANSFERS = 0;
//masks for SPI_CSR registers
const uint32_t SCBR_MASK = (uint32_t)BAUD_DIVIDER << 8;
const uint32_t DLYBS_MASK = (uint32_t)DELAY_BEFORE_SPCK << 16;
const uint32_t DLYBCT_MASK = (uint32_t)DELAY_BETWEEN_CONSECUTIVE_TRANSFERS << 24;
//initialize NPCS0 to "Mode 0"
SPI->SPI_CSR[0] = AT91C_SPI_BITS_8 | SCBR_MASK | DLYBS_MASK | DLYBCT_MASK | AT91C_SPI_NCPHA;
//initialize NPCS1 to "Mode 1"
//SPI->SPI_CSR[0] = AT91C_SPI_BITS_8 | SCBR_MASK | DLYBS_MASK | DLYBCT_MASK;
//initialize NPCS2 to "Mode 2"
//SPI->SPI_CSR[0] = AT91C_SPI_BITS_8 | SCBR_MASK | DLYBS_MASK | DLYBCT_MASK | AT91C_SPI_NCPHA | AT91C_SPI_CPOL;
//initialize NPCS3 to "Mode 3"
//SPI->SPI_CSR[0] = AT91C_SPI_BITS_8 | SCBR_MASK | DLYBS_MASK | DLYBCT_MASK | AT91C_SPI_CPOL;
//wlaczenie resetu (aktywny 0)
delay_ms(1000);
RESET_OFF;
delay_ms(1000);
//wylaczenie resetu
RESET_ON;
//wysylanie komend
RS_ON;
for(i=0;i<sizeof(INIT1)-1;i++)
spiTransfer(INIT1[i], 0);
delay_ms(50);
for(i=0;i<sizeof(INIT2)-1;i++)
spiTransfer(INIT2[i], 0);
delay_ms(7);
for(i=0;i<sizeof(INIT3)-1;i++)
spiTransfer(INIT3[i], 0);
delay_ms(50);
for(i=0;i<sizeof(INIT4)-1;i++)
spiTransfer(INIT4[i], 0);
delay_ms(50);
for(i=0;i<sizeof(MEMWR)-1;i++)
spiTransfer(MEMWR[i], 0);
delay_ms(50);
RS_OFF;
for(;;)
{
spiTransfer(0xFFFF,0);
}
return(0);
}
sebek_sc napisał:At91SAM7S pozwala na 4 tryby pracy sprzętowego SPI (wydaje mi się że ten wyświetlacz pracuje w trybie MODE0). Oprócz tego można ustawić prędkość transmisji oraz opóźnienie włączenia CS itp.
...
Lucas4444 napisał:Ostatnio kupiłem na allegro S65 oraz swoją pierwszą ATMEGĘ 16.
Mam wobec tego kilka pytań.
- Czy do samego wyświetlenia czegokolwiek potrzebny jest kwarc?
- W kodzie programu znajduję: .EQU XTAL=7372800 (rozumiem, że jest to częstotliwość taktowania; bliska 8MH), czy 1000000 odpowiada 1MH -> pracy bez kwarcu?
- Czy korzystanie z pinów portów B i D (RESET PD4, RS PD7, CLK PB6, DATA PB5, CS PB4) jest właściwe, jeżeli odpowiednio zmienilem piny portów w deklaracji programu?
To mój pierwszy post proszę o zwięzłą wypowiedź na temat
lcd_wrcmd16(0xEF90); //display off
lcd_wrcmd16(0x0040);
lcd_wrcmd16(0xEF90); //display on
lcd_wrcmd16(0x0000);
lcd_wrcmd16(0xEF90); //display off white
lcd_wrcmd16(0x0080);sebek_sc napisał:
...
Mnie jedyne co przychodzi na myśl to kupić jakiś złomowaty telefonik na allegro i sprawdzić czy wyświetlacze są dobre. Jaka jest szansa że kupując S65 kupię z wyświetlaczem LS020??