| Микроконтролери и електроника 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 ] | |||||||||
| Заглавие: | ||||||||||
Не. Никъде в конституцията не пише, че си длъжен да го учиш. |
||||||||||
| Автор: | bateAz [ Вто Апр 07, 2009 11:40 am ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Да де, ама при изострен мазохизъм, представляващ опастност за живота му или за живота на околните, могат да го приберат в някое специализирано лечебно заведение. |
|||||||||||||||||||
| Автор: | kalinskia [ Вто Апр 07, 2009 11:48 am ] |
| Заглавие: | |
Много благодаря за спамовете ви! |
|
| Автор: | plameniv [ Вто Апр 07, 2009 1:49 pm ] | |||||||||
| Заглавие: | ||||||||||
Що за глупости ? Изобщо не е вярно твърдението ти, със сигурно проблема ти е другаде, тези команди изобще не си влияят една друга и това не е нужно да го правиш. Ако искаш да буташ наведнъж няколко пина защо не ползваш movwf PORT.. , дори и в такъв случай няма проблем ? По принцип този дисплей не е много бърз и иска време особенно при инициализация , след това си е ОК. |
||||||||||
| Автор: | a_stankov [ Вто Апр 07, 2009 10:21 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Ако използваш 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/ |
|