Witam!
Krótko:
- przepisałem kod z kursu C w EdW do obsługi LCD
- na płytce prototypowej (firmowa, nie zawiera błędów) połączyłem procek z lcd
- sprawdziłem czy jest przejście między nóżkami procka a LCD - jest
- podczas programowania zapisałem fusebity na LOW:C3, HIGH:99, odpowiadające za wewnętrzny oscylator 4MHz
- nie działa
Efekt taki, że na wszystkich wyjściach non stop stan wysoki (widać po podłączeniu do ledów). Sytuacja jest o tyle dziwna, że przy takim podłączeniu programator nie wykrywa procesora... dopiero gdy odłączę port B6 można zaprogramować...
Kod programu:
Jakaś sugestia?
Krótko:
- przepisałem kod z kursu C w EdW do obsługi LCD
- na płytce prototypowej (firmowa, nie zawiera błędów) połączyłem procek z lcd
- sprawdziłem czy jest przejście między nóżkami procka a LCD - jest
- podczas programowania zapisałem fusebity na LOW:C3, HIGH:99, odpowiadające za wewnętrzny oscylator 4MHz
- nie działa
Efekt taki, że na wszystkich wyjściach non stop stan wysoki (widać po podłączeniu do ledów). Sytuacja jest o tyle dziwna, że przy takim podłączeniu programator nie wykrywa procesora... dopiero gdy odłączę port B6 można zaprogramować...
Kod programu:
#include <avr/io.h>
#include <inttypes.h>
#define OSC 4
#define PORT(X) XPORT(X)
#define XPORT(X) (PORT##X)
#define PIN(X) XPIN(X)
#define XPIN(X) (PIN##X)
#define DDR(X) XDDR(X)
#define XDDR(X) (DDR##X)
#define LCD_RSPORT B
#define LCD_RS 2
#define LCD_EPORT B
#define LCD_E 1
#define LCD_DPORT B
#define LCD_D4 4
#define LCD_D5 5
#define LCD_D6 6
#define LCD_D7 7
#define LCDC_CLS 0x01
#define LCDC_HOME 0x02
#define LCDC_MODE 0x04
#define LCDC_MODER 0x02
#define LCDC_MODEL 0
#define LCDC_MODEMOVE 0x01
#define LCDC_ON 0x08
#define LCDC_ONDISPLAY 0x04
#define LCDC_ONCURSOR 0x02
#define LCDC_ONBLINK 0x01
#define LCDC_SHIFT 0x10
#define LCDC_SHIFTDISP 0x08
#define LCDC_SHIFTR 0x04
#define LCDC_SHIFTL 0
#define LCDC_FUNC 0x20
#define LCDC_FUNC8b 0x10
#define LCDC_FUNC4b 0
#define LCDC_FUNC2L 0x08
#define LCDC_FUNC1L 0
#define LCDC_FUNC5x10 0x4
#define LCDC_FUNC5x7 0
#define LCDC_CGA 0x40
#define LCDC_DDA 0x80
#define delay250ns() {asm volatile("nop"::);}
#define delayus8(t)\
{asm volatile( \
"delayus8_loop%=: \n\t"\
"nop \n\t"\
"dec %[ticks] \n\t"\
"brne delayus8_loop%= \n\t"\
::[ticks]"r"(t) );}
void delay100us8(uint8_t t)
{
while(t>0)
{
delayus8(100);
--t;
}
}
#define LCD_EPULSE() \
{PORT(LCD_EPORT) |= 1<<LCD_E; \
delay250ns(); \
PORTB &= ~(1<<LCD_E);}
void LCDsendHalf(uint8_t data)
{
data = (data & 0x0F) << LCD_D4;
PORT(LCD_DPORT) = (PORT(LCD_DPORT) & ~(0x0F<<LCD_D4)) | data;
LCD_EPULSE();
}
void LCDsend(uint8_t data)
{
LCDsendHalf(data>>4);
LCDsendHalf(data);
delayus8(120);
}
void LCDcommand(uint8_t command)
{
PORT(LCD_RSPORT) &= ~(1<<LCD_RS);
LCDsend(command);
}
void LCDdata(uint8_t data)
{
PORT(LCD_RSPORT) |= 1<<LCD_RS;
LCDsend(data);
}
void LCDcls(void)
{
LCDcommand(LCDC_CLS);
delay100us8(48);
}
void LCDhome(void)
{
LCDcommand(LCDC_HOME);
delay100us8(48);
}
void LCDinit(void)
{
delay100us8(150);
PORT(LCD_RSPORT) &= ~(1<<LCD_RS);
LCDsendHalf(LCDC_FUNC|LCDC_FUNC8b);
delay100us8(41);
LCDsendHalf(LCDC_FUNC|LCDC_FUNC8b);
delay100us8(2);
LCDsendHalf(LCDC_FUNC|LCDC_FUNC4b);
delay100us8(2);
LCDcommand(LCDC_FUNC|LCDC_FUNC4b|LCDC_FUNC2L|LCDC_FUNC5x7);
LCDcommand(LCDC_ON);
LCDcls();
LCDcommand(LCDC_MODE|LCDC_MODER);
LCDcommand(LCDC_ON|LCDC_ONDISPLAY|LCDC_ONCURSOR);
}
int main(void)
{
DDR(LCD_DPORT) = 1<<LCD_E | 1<<LCD_RS | 0X0F<<LCD_D4;
LCDinit();
LCDcls();
LCDdata('W'); LCDdata('I'); LCDdata('T'); LCDdata('A'); LCDdata('J');
return 0;
}
Jakaś sugestia?