Отговори на тема  [ 16 мнения ]  Отиди на страница 1, 2  Следваща
Проблем при управлението на hd44780 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Юни 19, 2008 12:22 pm
Мнения: 47
Мнение Проблем при управлението на 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
няма никаква промяна по дисплея.
Благодаря Ви предварително за отделеното време!
Малко се разместиха колоните на програмата ....


Пон Апр 06, 2009 10:49 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Юни 19, 2008 12:22 pm
Мнения: 47
Мнение 
Проблема се реши като между редовете
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


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


Пон Апр 06, 2009 8:32 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Дек 06, 2008 9:22 am
Мнения: 119
Местоположение: Пловдив
Мнение 
Пик-овете имат проблем при последователно изпълнение на инструкции в един и същи порт примерно

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

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

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

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


Вто Апр 07, 2009 7:07 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Юни 19, 2008 12:22 pm
Мнения: 47
Мнение 
Благодаря за отговора , за напред ще знам. А някои може ли да драсне едни малък код с визуализиране на символ, който предварително той е създал.
Поздрави!


Вто Апр 07, 2009 10:03 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 02, 2008 10:24 pm
Мнения: 105
Мнение 
//примерен символ за градус Целзий

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


Вто Апр 07, 2009 10:13 am
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Юни 19, 2008 12:22 pm
Мнения: 47
Мнение 
А можете ли да го напишете на asm тъй като още не съм се занимавал със C, а и да ви попитам необходимо ли е да го науча?


Вто Апр 07, 2009 10:34 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
kalinskia написа:
а и да ви попитам необходимо ли е да го науча?


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

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Вто Апр 07, 2009 11:01 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Цецо написа:
kalinskia написа:
а и да ви попитам необходимо ли е да го науча?


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


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


Вто Апр 07, 2009 11:40 am
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Юни 19, 2008 12:22 pm
Мнения: 47
Мнение 
Много благодаря за спамовете ви!


Вто Апр 07, 2009 11:48 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Окт 10, 2004 9:55 am
Мнения: 1718
Мнение 
a_stankov написа:
Пик-овете имат проблем при последователно изпълнение на инструкции в един и същи порт примерно

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

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

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

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

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

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

_________________
Избийте баламите и тарикатите сами ще умрат!
Няма невъзможни работи - има много трудни работи!
----------------------------------------------------------------------------------
"Я в Москве с киркой уран найду, при такой повышенной зарплате" !


Вто Апр 07, 2009 1:49 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Дек 06, 2008 9:22 am
Мнения: 119
Местоположение: Пловдив
Мнение 
plameniv написа:
a_stankov написа:
Пик-овете имат проблем при последователно изпълнение на инструкции в един и същи порт примерно

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

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

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

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

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

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



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


Вто Апр 07, 2009 10:21 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 13, 2007 12:12 pm
Мнения: 712
Мнение 
Виж "a_stankov", омазал си четенето - нищо повече! Причините, поради които си имал проблеми са били другаде - в периферията, която си управлявал. Нужно е, за напред да наблегнеш на четенето и практиката и по-малко на писането. Поне до тогава, докато не ти се изяснят нещата. Нищо лично, не искам да те обидя, а да те насърча да ровиш повечко! Успех.


Вто Апр 07, 2009 10:41 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Дек 06, 2008 9:22 am
Мнения: 119
Местоположение: Пловдив
Мнение 
Добре може и така да е но защо кода в първия вариан работи а във втория не , ето примери на съвсем елементарен код.

Вариант 1

Изображение

Вариант 2

Изображение


Сря Апр 08, 2009 6:51 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 13, 2007 12:12 pm
Мнения: 712
Мнение 
В какъв смисъл не работи? Не се установява PORTC,2 в единица или така примерно LCD индикацията, която управлаваш не реагира на командата? Дай повече инфо относно проблема, кой е контролера, поне началния код за инициализация на портовете и служебните регистри и т.н.


Сря Апр 08, 2009 11:00 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
До колкото разбирам :
list p=16f84a
#include <p16f84a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

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


Сря Апр 08, 2009 2:01 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 16 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни