| Автор |
Съобщение |
|
kalinskia
Ранг: Минаващ
Регистриран на: Чет Юни 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 |
|
 |
|
kalinskia
Ранг: Минаващ
Регистриран на: Чет Юни 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 |
|
 |
|
a_stankov
Ранг: Новодошъл
Регистриран на: Съб Дек 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 |
|
 |
|
kalinskia
Ранг: Минаващ
Регистриран на: Чет Юни 19, 2008 12:22 pm Мнения: 47
|
Благодаря за отговора , за напред ще знам. А някои може ли да драсне едни малък код с визуализиране на символ, който предварително той е създал.
Поздрави!
|
| Вто Апр 07, 2009 10:03 am |
|
 |
|
Cino
Ранг: Новодошъл
Регистриран на: Чет Окт 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 |
|
 |
|
kalinskia
Ранг: Минаващ
Регистриран на: Чет Юни 19, 2008 12:22 pm Мнения: 47
|
А можете ли да го напишете на asm тъй като още не съм се занимавал със C, а и да ви попитам необходимо ли е да го науча?
|
| Вто Апр 07, 2009 10:34 am |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Не. Никъде в конституцията не пише, че си длъжен да го учиш.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Вто Апр 07, 2009 11:01 am |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Да де, ама при изострен мазохизъм, представляващ опастност за живота му или за живота на околните, могат да го приберат в някое специализирано лечебно заведение.
|
| Вто Апр 07, 2009 11:40 am |
|
 |
|
kalinskia
Ранг: Минаващ
Регистриран на: Чет Юни 19, 2008 12:22 pm Мнения: 47
|
Много благодаря за спамовете ви!
|
| Вто Апр 07, 2009 11:48 am |
|
 |
|
plameniv
Ранг: Форумен бог
Регистриран на: Нед Окт 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 |
|
 |
|
a_stankov
Ранг: Новодошъл
Регистриран на: Съб Дек 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 |
|
 |
|
fan
Ранг: Почетен член
Регистриран на: Съб Окт 13, 2007 12:12 pm Мнения: 712
|
Виж "a_stankov", омазал си четенето - нищо повече! Причините, поради които си имал проблеми са били другаде - в периферията, която си управлявал. Нужно е, за напред да наблегнеш на четенето и практиката и по-малко на писането. Поне до тогава, докато не ти се изяснят нещата. Нищо лично, не искам да те обидя, а да те насърча да ровиш повечко! Успех.
|
| Вто Апр 07, 2009 10:41 pm |
|
 |
|
a_stankov
Ранг: Новодошъл
Регистриран на: Съб Дек 06, 2008 9:22 am Мнения: 119 Местоположение: Пловдив
|
Добре може и така да е но защо кода в първия вариан работи а във втория не , ето примери на съвсем елементарен код.
Вариант 1
Вариант 2

|
| Сря Апр 08, 2009 6:51 am |
|
 |
|
fan
Ранг: Почетен член
Регистриран на: Съб Окт 13, 2007 12:12 pm Мнения: 712
|
В какъв смисъл не работи? Не се установява PORTC,2 в единица или така примерно LCD индикацията, която управлаваш не реагира на командата? Дай повече инфо относно проблема, кой е контролера, поне началния код за инициализация на портовете и служебните регистри и т.н.
|
| Сря Апр 08, 2009 11:00 am |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 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 |
|
|