Ответ: Там все в порядке, процедура работает, но иногда попадает на выполнение условия DDR_LCD != 0x4f
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено bookevg 30 апреля 2004 г. 17:05
В ответ на: И ещё надо посмотреть ассемблерный код. Возможно if ( DDR_LCD_DATA != 0x4f ) (+) отправлено Mebius 30 апреля 2004 г. 16:52

224 /*-------------------------------------------------------------------------------
225 Wait as long as the LCD is busy
226 LcdWaitBusy();
227 -------------------------------------------------------------------------------*/

\ In segment CODE, align 2, keep-with-next
228 void LcdWaitBusy (void)
\ LcdWaitBusy:
229 {
230 __disable_interrupt();
\ 00000000 94F8 CLI
231 PORT_LCD_DATA = 0xB0; /* set LCD_DATA port in input mode */
\ 00000002 EB00 LDI R16,176
\ 00000004 BB0B OUT 0x1B,R16
232 DDR_LCD_DATA = 0x4F; /* set LCD_DATA port in input and output mode */
\ 00000006 E40F LDI R16,79
\ 00000008 BB0A OUT 0x1A,R16
233 LCD_DI = 0; /* Instruction mode */
\ 0000000A 98AA CBI 0x15,0x02
234 LCD_RW = 1; /* Read mode */
\ 0000000C 9AA9 SBI 0x15,0x01
235 LCD_E = 0; /* strobe */
\ 0000000E 98A8 CBI 0x15,0x00
236 __no_operation();
\ 00000010 0000 NOP
237 __no_operation();
\ 00000012 0000 NOP
238 __no_operation();
\ 00000014 0000 NOP
239 __no_operation();
\ 00000016 0000 NOP
240 LCD_E = 1;
\ 00000018 9AA8 SBI 0x15,0x00
241 __no_operation();
\ 0000001A 0000 NOP
242 __no_operation();
\ 0000001C 0000 NOP
243 __no_operation();
\ 0000001E 0000 NOP
244 __no_operation();
\ 00000020 0000 NOP
245 while ( tstBit(PIN_LCD_DATA,7 ))//; /* mask the other status bits and test the BUSY bit */
\ ??LcdWaitBusy_0:
\ 00000022 9BCF SBIS 0x19,0x07
\ 00000024 C007 RJMP ??LcdWaitBusy_1
246 {
247 if ( DDR_LCD_DATA != 0x4f )
\ 00000026 B30A IN R16,0x1A
\ 00000028 340F CPI R16,79
\ 0000002A F3D9 BREQ ??LcdWaitBusy_0
248 {
249 __no_operation(); попадаю иногда сюда, хотя не должен
\ 0000002C 0000 NOP
250 DDR_LCD_DATA = 0x4F;
\ 0000002E E40F LDI R16,79
\ 00000030 BB0A OUT 0x1A,R16
\ 00000032 CFF7 RJMP ??LcdWaitBusy_0
251 }
252 }
253 LCD_E = 0;
\ ??LcdWaitBusy_1:
\ 00000034 98A8 CBI 0x15,0x00
254 PORT_LCD_DATA = 0x00; /* set LCD_DATA port in input mode */
\ 00000036 E000 LDI R16,0
\ 00000038 BB0B OUT 0x1B,R16
255 DDR_LCD_DATA = 0xFF; /* set LCD_DATA port in output mode */
\ 0000003A EF0F LDI R16,255
\ 0000003C BB0A OUT 0x1A,R16
256 __enable_interrupt();
\ 0000003E 9478 SEI
257 }
\ 00000040 9508 RET

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru