|
Оператор "printf" и функция "putchar" для работы с символьным LCD |
|
|
|
Mar 19 2010, 11:47
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
не понимаю, что за беда с выводом. Прописал "putchar" в виде: Код void putchar( char c ) { if ( !c ) return( 0 ); Transmit_Byte( c ); /*функция отправки сообщения в последовательный порт*/ } LCD оснащен контроллером, который принимает данные по последовательному порту и выводит на экран дисплея 16*02 Не могу разобраться почему: printf("%a", 30.0) выводит "???" printf("%.2A", 30.0) выводит "???" printf("%c", 'a') ничего выводит printf("<%3c|%-3c>", 'a', 'b') выводит "< крокозябра >" и т.д. совсем другими словами не то что я ожидаю. printf("Hello World!") выводит "Hello World!", но если использовать длинную строку или несколько операторов "printf" со строками, то выводятся куски строк в хаотичном порядке. размер Data Stack в компиляторе IAR установил в 0x300. Мне нужно выводить на экран простые конструкции состоящие из текста и числовых данных, что делать?
Сообщение отредактировал Буратино - Mar 19 2010, 12:46
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
 |
Ответов
|
Mar 20 2010, 12:57
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Кстати, можно вопрос по поводу UARTов микроконтроллеров? Мне пока доводилось поработать с двумя реализациями их передатчиков: 1. как только сдвиговый регистр передатчика становится пуст - устанавливается соответствующее прерывание. Сбросить его невозможно до тех пор, пока передатчик пуст. Тут получается весьма простой обработчик - надо передавать данные - разрешаем прерывания и в обработчике происходит загрузка. Данные закончились - запрещаем прерывание. 2. в LPC1768 другая система (так называемый 550-ый?) - триггер прерывания "передатчик пуст" устанавливается только после завершения передачи данных (а не присутствует постоянно). То есть изначально его нет (хотя передачтик пуст!), и после вызова обработчика он сбрасывается. Здесь уже погеморройнее - загрузку FIFO приходится делать как в обработчике прерывания, так и снаружи (для инициирования передачи). Причём дополнительно есть какой-то механизм откладывания прерывания: The UARTn THRE interrupt (UnIIR[3:1] = 001) is a third level interrupt and is activated when the UARTn THR FIFO is empty provided certain initialization conditions have been met. These initialization conditions are intended to give the UARTn THR FIFO a chance to fill up with data to eliminate many THRE interrupts from occurring at system start-up. The initialization conditions implement a one character delay minus the stop bit whenever THRE = 1 and there have not been at least two characters in the UnTHR at one time since the last THRE = 1 event. This delay is provided to give the CPU time to write data to UnTHR without a THRE interrupt to decode and service. A THRE interrupt is set immediately if the UARTn THR FIFO has held two or more characters at one time and currently, the UnTHR is empty. The THRE interrupt is reset when a UnTHR write occurs or a read of the UnIIR occurs and the THRE is the highest interrupt (UnIIR[3:1] = 001).Здесь я до конца не понял конкретику, лишь то, что флаг THRE может устанавливаться не сразу по опустошению передатчика, а спустя какое-то время. То есть проанализировав в регистре статуса бит Transmitter Empty (TEMT), в случае, если он установлен, нельзя однозначно понять, был ли уже вызов прерывания, или только ещё будет - из-за one character delay? В общем, некоторый гиморрой получается  Может, кто нибудь более популярно разъяснит механику работы LPCшного UART?
|
|
|
|
|
Mar 20 2010, 13:10
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(sonycman @ Mar 20 2010, 15:57)  В общем, некоторый гиморрой получается  Пальцем покажите: Код //---------------------------------------------------------------------------- void boutchar( char ch ) { if( status_word & STW_THR_BUSY ) { tbuf.buf[tbuf.tail & TBUF_SIZE_MSK] = ch; tbuf.tail++; } else { status_word |= STW_THR_BUSY; U0THR = ch; } } //---------------------------------------------------------------------------- __irq __arm void uart_isr(void) { bint ch;
while( !((ch = (U0IIR&IIR_MASK)) & IIR_IP) ) // Check Pending Bit { // What caused the interrupt? switch( ch ) {
case IIR_THRE: // The THRE+TEMPT+FIFO is empty. If there is another // characters in the TX buffer, load its now to FIFO->THRE. if( tbuf.tail != tbuf.head ) { for( int ii=0; ( tbuf.tail != tbuf.head )&&( ii < TR_FIFO_SIZE ); ii++ ) U0THR = tbuf.buf[(tbuf.head++) & TBUF_SIZE_MSK]; } else status_word &= (~STW_THR_BUSY); break;
....... Цитата Тут получается весьма простой обработчик - надо передавать данные - разрешаем прерывания и в обработчике происходит загрузка. Данные закончились - запрещаем прерывание. Если выкинуть работу с FIFO отсутствующим у AVR, то получаем вот такой "сложный" обработчик прерывания для LPC: Код if( tbuf.tail != tbuf.head ) U0THR = tbuf.buf[(tbuf.head++) & TBUF_SIZE_MSK]; else status_word &= (~STW_THR_BUSY); И такой "простой" ( © Сергея ) для AVR: Код uint8_t Tmp = TxTail; UDR = TxBuffer[ Tmp++ & (UART_TX_BUFF_SIZE - 1) ]; TxTail = Tmp; if(Tmp == TxHead) UCSRB &= ~(1<<UDRIE);
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 20 2010, 14:00
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(zltigo @ Mar 20 2010, 17:10)  Пальцем покажите: Спасибо за пример. У Вас используется софтовый флаг (STW_THR_BUSY) для исключения коллизии при загрузке данных. На AVR, благодаря "упрощённому" железу он совсем не нужен. Наверное, тоже введу такой флаг, вместо принудительного вызова прерывания установкой pending бита... Цитата(zltigo @ Mar 20 2010, 17:10)  void boutchar( char ch ) { if( status_word & STW_THR_BUSY ) { tbuf.buf[tbuf.tail & TBUF_SIZE_MSK] = ch; tbuf.tail++; } else { status_word |= STW_THR_BUSY; U0THR = ch; } } Кстати, у Вас в этой функции потенциальная проблема с опросом флага status_word. Для корректной работы необходимо запрещать прерывание THRE перед обращением к status_word. Жаль, не хотелось бы этого...
|
|
|
|
Сообщений в этой теме
Буратино Оператор "printf" и функция "putchar" для работы с символьным LCD Mar 19 2010, 11:47 barabek Цитата(Буратино @ Mar 19 2010, 21:47) pri... Mar 19 2010, 12:09 Буратино printf("%f", 30.0); выводит "0.0000... Mar 19 2010, 12:12 zltigo Цитата(Буратино @ Mar 19 2010, 14:47) Про... Mar 19 2010, 12:34 Буратино А почему эта функция не putchar()?
---
Буратино ... Mar 19 2010, 12:43 zltigo Цитата(Буратино @ Mar 19 2010, 15:43) А п... Mar 19 2010, 12:46  Буратино Цитата(zltigo @ Mar 19 2010, 15:46) А вот... Mar 19 2010, 12:51 Буратино Пересмотрел форум, и понял ,что функция printf() ... Mar 19 2010, 15:36 zltigo Цитата(Буратино @ Mar 19 2010, 18:36) Я у... Mar 19 2010, 15:49 one_eight_seven А в контроллер уже зашиты ASCII коды?
Может, я не... Mar 19 2010, 15:49 Буратино zltigo ,почему Вы такой злой? Ну нет желания помоч... Mar 19 2010, 15:59 zltigo Цитата(Буратино @ Mar 19 2010, 18:59) zlt... Mar 19 2010, 16:34 Буратино Все, разобрался (хотя и остались некоторые непонят... Mar 19 2010, 18:20 zltigo Цитата(Буратино @ Mar 19 2010, 21:20) Все... Mar 19 2010, 18:37  Буратино Цитата(zltigo @ Mar 19 2010, 21:37) Некош... Mar 19 2010, 18:45   zltigo Цитата(Буратино @ Mar 19 2010, 21:45) Что... Mar 19 2010, 18:52  Сергей Борщ Цитата(zltigo @ Mar 19 2010, 20:37) Некош... Mar 19 2010, 21:20   zltigo Цитата(Сергей Борщ @ Mar 20 2010, 00:20) ... Mar 19 2010, 21:53    Сергей Борщ Цитата(zltigo @ Mar 19 2010, 23:53) Свобо... Mar 20 2010, 09:54     zltigo Цитата(Сергей Борщ @ Mar 20 2010, 12:54) ... Mar 20 2010, 10:34      Сергей Борщ Цитата(zltigo @ Mar 20 2010, 12:34) Очень... Mar 20 2010, 11:11       zltigo Цитата(Сергей Борщ @ Mar 20 2010, 14:08) ... Mar 20 2010, 11:14        Сергей Борщ Цитата(zltigo @ Mar 20 2010, 13:14) При н... Mar 20 2010, 15:08         zltigo Цитата(Сергей Борщ @ Mar 20 2010, 18:08) ... Mar 20 2010, 15:35       ReAl Цитата(Сергей Борщ @ Mar 20 2010, 13:11) ... Mar 20 2010, 18:38       zltigo Цитата(Сергей Борщ @ Mar 20 2010, 14:11) ... Mar 20 2010, 18:51    Сергей Борщ Цитата(zltigo @ Mar 20 2010, 01:08) Абсол... Apr 20 2010, 21:59     zltigo Цитата(Сергей Борщ @ Apr 21 2010, 00:00) ... Apr 20 2010, 22:13      Сергей Борщ Цитата(zltigo @ Apr 21 2010, 01:28) Это п... Apr 21 2010, 07:31      ReAl Цитата(zltigo @ Apr 21 2010, 01:28) Это п... Apr 24 2010, 21:28     zltigo Цитата(Сергей Борщ @ Apr 21 2010, 00:14) ... Apr 24 2010, 22:39   zltigo Цитата(sonycman @ Mar 20 2010, 17:00) У В... Mar 20 2010, 14:41 Буратино RE: Оператор "printf" и функция "putchar" для работы с символьным LCD Mar 20 2010, 16:49 zltigo Цитата(Буратино @ Mar 20 2010, 19:49)
А ... Mar 20 2010, 17:01
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|