Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблем при управлението на hd44780
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=6711
Страница 1 от 2

Автор:  kalinskia [ Пон Апр 06, 2009 10:49 am ]
Заглавие:  Проблем при управлението на hd44780

Здравейте на всички! Начинаещ съм в света на микроконтролерите и ще съм много радостен ако някои има желание да ми помогне :) .Проблемът ми е следния:
list p=16f84a
#include <p16f84a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

disp_on equ h'0c'
disp_on_c equ h'0e'
disp_on_b equ h'0f'
disp_off equ h'08'
clr_disp equ h'01'
entry_inc equ h'06'
entry_inc_s equ h'07'
entry_dec equ h'04'
entry_dec_s equ h'05'
dd_ram_addr1 equ h'80'
dd_ram_addr2 equ h'c0'

cblock h'0c'
counter
lcd_temp
bf_temp
endc

#define e PORTA,0
#define rw PORTA,1
#define rs PORTA,2
#define s STATUS,RP0
org h'0000'
goto start

start bsf s
movlw b'10010001'
movwf OPTION_REG
bcf s
clrf PORTA
clrf PORTB
bsf s
movlw b'11111000'
movwf TRISA
clrf TRISB
bcf s

goto main

init_lcd
movlw d'15'
movwf counter
call wait
movlw b'00110000'
movwf PORTB
bsf e
bcf e
movlw d'5'
movwf counter
call wait
movlw b'00110000'
movwf PORTB
bsf e
bcf e

movlw disp_off
call send_command
movlw disp_on
call send_command
movlw entry_inc
call send_command
return

wait clrf TMR0
again bcf INTCON,T0IF
loop btfss INTCON,T0IF
goto loop
decfsz counter,f
goto again
return

send_command
movwf lcd_temp
call check_bf
movf lcd_temp,w
movwf PORTB
bcf rw
bcf rs
bsf e
bcf e
return

send_char
movwf lcd_temp
call check_bf
movf lcd_temp,w
movwf PORTB
bcf rw
bsf rs
bsf e
bcf e
return

check_bf
bsf s
movlw h'ff'
movwf TRISB
bcf s
bcf rs
bsf rw
bsf e
bcf e
movf PORTB,w
movwf bf_temp
btfsc bf_temp,7
goto check_bf
bcf rw
bsf s
clrf TRISB
bcf s
return

main call init_lcd
send_message

movlw dd_ram_addr1
call send_command
movlw 'L'
call send_char
movlw 'C'
call send_char


movlw 'D'
call send_char

movlw ' '
call send_char
movlw 'T'

call send_char
movlw 'e'
call send_char
movlw 's'
call send_char
movlw 't'
call send_char

movlw ','
call send_char
movlw 'v'
call send_char
movlw 'e'
call send_char
movlw 'r'
call send_char
movlw '.'
call send_char
movlw '1'
call send_char
movlw '.'
call send_char
movlw '0'
call send_char

stop_send nop
goto stop_send
END


Когато симулирам тоя код в proteus първата буква (L) не излиза.
На какво може да се дължи това?
Също така искам да ви попитам правилно ли е инициализиран дисплея, и да ми кажете как в последствие да кажем на адрес "02" мога да запиша даден символ, без да променям останалите , тъй като след визуализиране на " CD Test, v.1.0" при въвеждане на
movlw h'82'
call send_command
movlw 'k'
call send_char
няма никаква промяна по дисплея.
Благодаря Ви предварително за отделеното време!
Малко се разместиха колоните на програмата ....

Автор:  kalinskia [ Пон Апр 06, 2009 8:32 pm ]
Заглавие: 

Проблема се реши като между редовете
bsf e
bcf e
добавих call delay
като
DELAY
MOVLW 0x32 ; 50 LOOPS
MOVWF FIXDELAY ; 50us fixed delay
NOTDONE50 DECFSZ FIXDELAY, 1 ; Decrement of FIXDELAY
GOTO NOTDONE50 ; If 50us isn't up go back to NOTDONE50
RETURN
и в крайна сметка
bsf e
call delay
bcf e


Явно продължителността на импулса е била прекалено малка.

Автор:  a_stankov [ Вто Апр 07, 2009 7:07 am ]
Заглавие: 

Пик-овете имат проблем при последователно изпълнение на инструкции в един и същи порт примерно

bcf PORT----
bcf PORT----
bsf PORT----

за това като имаш такива команди постъпи по следния начин или аз поне така правя.

bcf PORT----
nop
bcf PORT----
nop
bsf PORT----

И всичко работи без грешка.Оставяш по една празна операция имаче контролера почва да се дъни и то не всеки път. :)

Автор:  kalinskia [ Вто Апр 07, 2009 10:03 am ]
Заглавие: 

Благодаря за отговора , за напред ще знам. А някои може ли да драсне едни малък код с визуализиране на символ, който предварително той е създал.
Поздрави!

Автор:  Cino [ Вто Апр 07, 2009 10:13 am ]
Заглавие: 

//примерен символ за градус Целзий

const flash unsigned char symbol_1[8]={
0b00000010,
0b00000101,
0b00000010,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000
};




//входни данни ,
//указател към първия елемент от масива за символа
//адрес на който да се запише символа, т.е кода с който ще се вика после символа
//примерно за адрес 0x01 е символа "градус Целзий"

void send_CGRAM ( unsigned char flash *p,unsigned char addr ) //addr от 0 до 7 само
{
unsigned char i;

delay_us(LCD_CHAR_SPEED);

SEND_CMD ( CG_RAM_ADDR+addr*8 );
delay_ms(1);


for(i=0;i<8;i++)
{
delay_us(LCD_CHAR_SPEED);

SET_LCD_DATA_PORT( p[i] );
RS=1;
R_W=0;
_E();

SET_LCD_DATA_PORT( (p[i])<<4 );
RS=1;
R_W=0;
_E();
}
}


//комуникацията е 4-битова
// а контролера е Atmega

Автор:  kalinskia [ Вто Апр 07, 2009 10:34 am ]
Заглавие: 

А можете ли да го напишете на asm тъй като още не съм се занимавал със C, а и да ви попитам необходимо ли е да го науча?

Автор:  Цецо [ Вто Апр 07, 2009 11:01 am ]
Заглавие: 

kalinskia написа:
а и да ви попитам необходимо ли е да го науча?


Не. Никъде в конституцията не пише, че си длъжен да го учиш.

Автор:  bateAz [ Вто Апр 07, 2009 11:40 am ]
Заглавие: 

Цецо написа:
kalinskia написа:
а и да ви попитам необходимо ли е да го науча?


Не. Никъде в конституцията не пише, че си длъжен да го учиш.


Да де, ама при изострен мазохизъм, представляващ опастност за живота му или за живота на околните, могат да го приберат в някое специализирано лечебно заведение.

Автор:  kalinskia [ Вто Апр 07, 2009 11:48 am ]
Заглавие: 

Много благодаря за спамовете ви!

Автор:  plameniv [ Вто Апр 07, 2009 1:49 pm ]
Заглавие: 

a_stankov написа:
Пик-овете имат проблем при последователно изпълнение на инструкции в един и същи порт примерно

bcf PORT----
bcf PORT----
bsf PORT----

за това като имаш такива команди постъпи по следния начин или аз поне така правя.

bcf PORT----
nop
bcf PORT----
nop
bsf PORT----

И всичко работи без грешка.Оставяш по една празна операция имаче контролера почва да се дъни и то не всеки път. :)

Що за глупости ?
Изобщо не е вярно твърдението ти, със сигурно проблема ти е другаде, тези команди изобще не си влияят една друга и това не е нужно да го правиш.
Ако искаш да буташ наведнъж няколко пина защо не ползваш movwf PORT.. , дори и в такъв случай няма проблем ?

По принцип този дисплей не е много бърз и иска време особенно при инициализация , след това си е ОК.

Автор:  a_stankov [ Вто Апр 07, 2009 10:21 pm ]
Заглавие: 

plameniv написа:
a_stankov написа:
Пик-овете имат проблем при последователно изпълнение на инструкции в един и същи порт примерно

bcf PORT----
bcf PORT----
bsf PORT----

за това като имаш такива команди постъпи по следния начин или аз поне така правя.

bcf PORT----
nop
bcf PORT----
nop
bsf PORT----

И всичко работи без грешка.Оставяш по една празна операция имаче контролера почва да се дъни и то не всеки път. :)

Що за глупости ?
Изобщо не е вярно твърдението ти, със сигурно проблема ти е другаде, тези команди изобще не си влияят една друга и това не е нужно да го правиш.
Ако искаш да буташ наведнъж няколко пина защо не ползваш movwf PORT.. , дори и в такъв случай няма проблем ?

По принцип този дисплей не е много бърз и иска време особенно при инициализация , след това си е ОК.



Ако използваш movwf PORT... наистина няма проблем,но понякога не ми е удобно,а иначе това съм го установил за себе си опитно и не претендирам ,че съм прав просто доста пъти съм попадал на ситуация в която няколко nop-a оправят тотално нещата.Някъде бях чел за това ,че нали ПИК-овете извличат следващата инструкция по време на цикъла на изпълнение на текущата и се получавало някакво омазване което можело и да стане можело и да не стане,тогава в конкретния случай ми помогна и от тогава си имам едно на ум, но пак казвам това са лично наблюдения не претендирам непременно ,че са абсолютно верни.

Автор:  fan [ Вто Апр 07, 2009 10:41 pm ]
Заглавие: 

Виж "a_stankov", омазал си четенето - нищо повече! Причините, поради които си имал проблеми са били другаде - в периферията, която си управлявал. Нужно е, за напред да наблегнеш на четенето и практиката и по-малко на писането. Поне до тогава, докато не ти се изяснят нещата. Нищо лично, не искам да те обидя, а да те насърча да ровиш повечко! Успех.

Автор:  a_stankov [ Сря Апр 08, 2009 6:51 am ]
Заглавие: 

Добре може и така да е но защо кода в първия вариан работи а във втория не , ето примери на съвсем елементарен код.

Вариант 1

Изображение

Вариант 2

Изображение

Автор:  fan [ Сря Апр 08, 2009 11:00 am ]
Заглавие: 

В какъв смисъл не работи? Не се установява PORTC,2 в единица или така примерно LCD индикацията, която управлаваш не реагира на командата? Дай повече инфо относно проблема, кой е контролера, поне началния код за инициализация на портовете и служебните регистри и т.н.

Автор:  Ки4о [ Сря Апр 08, 2009 2:01 pm ]
Заглавие: 

До колкото разбирам :
list p=16f84a
#include <p16f84a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

Пишеш на 16F84A. Къде го този PORTC ? Не видях да ползваш банките ( на 16 серия това е от значение).
Я уточни за какъв контролер иде реч,че такива общи въпроси.....

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/