Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Вопросы по С/С++ (СИ)

Сообщение HHIMERA »

БАТАРЕЙКУС писал(а):не могли б вы его переписать чтоб не было предупреждения я что то не могу понять как это сделать.
Можно... но не нужно!!! :))
ut1wpr писал(а):В исходном тексте оно может и красиво. В дизасм загляните, будете неприятно удивлены.
Применение структур вообще-то не для красоты написания.
100% !!!
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение ut1wpr »

БАТАРЕЙКУС писал(а):ut1wpr

в HI-TECH PICC это прекрасно работает, LCD.data - принадлежат младшие 4 бита порта Д. соответственно kod>>4 позволяет перекачать старший полубайт регистра kod в младший полубайт порта Д.
Вы сразу на Си начали программы ваять? Очень похоже. Врачи рекомендуют перед подходом к очередному МК хотя бы поверхностно изучить систему его команд. Особенно в части периферии и портов. Нет способа в МК "перекачать полубайт... в полубайт...". Есть всего лишь два варианта. Либо вы выводите все слово целиком (в данном случае - байт), либо обращаетесь к пинам индивидуально. НЕТ ТАКОГО способа - половинками/четвертинками. Все-таки Си - как-никак ЯВУ. Вам бы почитать литературку. Впрочем, как говорят на кухне - это по вкусу... :)
И напоследок - незнание языка не освобождает... от обязанности знания предмета. Ищите переводы. Они есть. Вроде, Евстифеев расстарался...
С уважением,
Виктор.
Реклама
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Вопросы по С/С++ (СИ)

Сообщение HHIMERA »

ut1wpr писал(а):Нет способа в МК "перекачать полубайт... в полубайт...". Есть всего лишь два варианта. Либо вы выводите все слово целиком (в данном случае - байт), либо обращаетесь к пинам индивидуально. НЕТ ТАКОГО способа - половинками/четвертинками. Все-таки Си - как-никак ЯВУ.
:))
Дык... HI-TECH и MCC18 прекрасно с "половинками" справляются... используя swapf... умные они...
А вот бездумное юзание битовых полей... а в случае с PIC и указателей, действительно... печалька... :))
"Я не даю готовых решений, я заставляю думать!"(С)
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение ut1wpr »

HHIMERA писал(а):Дык... HI-TECH и MCC18 прекрасно с "половинками" справляются... используя swapf... умные они...
А вот бездумное юзание битовых полей... а в случае с PIC и указателей, действительно... печалька... :))
А при чем тут свапирование и загрузка в пол-порта, на которую так уповает вопрошающий? :) Свапирование заменяет 4-кратный сдвиг, не более того... И не только в АСМах ПИКов сие чудо есть.
С уважением,
Виктор.
Реклама
Эиком - электронные компоненты и радиодетали
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Вопросы по С/С++ (СИ)

Сообщение HHIMERA »

ut1wpr писал(а):А при чем тут свапирование и загрузка в пол-порта, на которую так уповает вопрошающий? :)
Видать я извращённо понял мысль чужую... :))
ut1wpr писал(а):НЕТ ТАКОГО способа - половинками/четвертинками. Все-таки Си - как-никак ЯВУ...
Тогда надо признать... что даже и АСМ PIC так не умеет...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 347
Зарегистрирован: Сб фев 07, 2009 19:21:25

Re: Вопросы по С/С++ (СИ)

Сообщение БАТАРЕЙКУС »

урааа победил я эту сволоч

Код: Выделить всё

typedef struct
{

unsigned data:4;
unsigned RS:1;
unsigned RW:1;
unsigned E:1;
unsigned A:1;
}LCD_ ;

LCD_  *LCD = (LCD_*)&PORTD ;
попробую ответить всем сразу
1) пики я начал изучать с ассемблера PIC16, а вот PIC18 учу сразу на си разницы в периферии у них нет только в АЛУ.

2) зачем мне такая извращённая форма со структурой, да для удобства. дисплей WH-1602 позволяет работать с ним передовая байт за 2-а подхода с начало старший полубайт затем младший. получается что на порте Д у меня сразу и шина данных (4 бита) и 3 вывода управления. и если обращения к битам управления эффективней производить объявив их через #define ,то запись в шину данных требует геморроя, с прочтением регистра, изменением нужных бит и записью обратно в регистр,
а обращаясь LCD->data = ??. весь геморрой на себя берёт компилятор.
вообщем структура для того чтобы все выводы управляющие дисплеем были в кулаке.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

С этим подходом есть небольшой минус - все выводы дисплея должны висеть на одном порте. С дефайнами и небольшим шаманством можно этот минус убрать. Просто сделайте для себя модуль, и пусть компилятор всегда на себя всё берёт. Ведь надо то всего 1 раз написать. Дальше просто меняем несколько строк, и всё...

PS: Ну а то, что получается через указатель, так это не так уж и страшно - на пару тактов дольше получится запись в порт.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Вопросы по С/С++ (СИ)

Сообщение HHIMERA »

Аlex писал(а):Ну а то, что получается через указатель, так это не так уж и страшно - на пару тактов дольше получится запись в порт.
Пара тактов... :))
Language tool versions: mpasmwin.exe v5.37, mplink.exe v4.37, mcc18.exe v3.36, mplib.exe v4.37
Полная оптимизация без Dead-code removal...

Код: Выделить всё

60:                LCD->RS = 0             ; //
  00DE    D811     RCALL __pa_0
  00E0    98EF     BCF INDF0, 0x4, ACCESS
61:                LCD->data = kod>>4    ; // передача старшего полубайта.
  00E2    0100     MOVLB 0
  00E4    396C     SWAPF kod, W, BANKED
  00E6    0B0F     ANDLW 0xf
  00E8    6E02     MOVWF __tmp_0, ACCESS
  00EA    D80B     RCALL __pa_0
  00EC    50E8     MOVF WREG, W, ACCESS
  00EE    D80E     RCALL __pa_1
  010C    0B0F     ANDLW 0xf
  010E    6EF3     MOVWF PRODL, ACCESS
  0110    0EF0     MOVLW 0xf0
  0112    14EF     ANDWF INDF0, W, ACCESS
  0114    10F3     IORWF PRODL, W, ACCESS
  0116    6EEF     MOVWF INDF0, ACCESS
62:                LCD->E = 1               ; //

Код: Выделить всё

   130   0102    C06A __pa_0        MOVFF LCD, FSR0   
   131   0104    FFE9               NOP               
   132   0106    C06B               MOVFF 0x6b, FSR0H 
   133   0108    FFEA               NOP               
   134   010A    0012               RETURN 0          
   135   010C    0B0F __pa_1        ANDLW 0xf         
   136   010E    6EF3               MOVWF PRODL, ACCESS
   137   0110    0EF0               MOVLW 0xf0        
   138   0112    14EF               ANDWF INDF0, W, ACCESS
   139   0114    10F3               IORWF PRODL, W, ACCESS
   140   0116    6EEF               MOVWF INDF0, ACCESS
   141   0118    DFF4               RCALL __pa_0      
   142   011A    8CEF               BSF INDF0, 0x6, ACCESS
   143   011C    DFF2               RCALL __pa_0      
   144   011E    9CEF               BCF INDF0, 0x6, ACCESS
   145   0120    0012               RETURN 0          
   146   0122    6EEF __pa_2        MOVWF INDF0, ACCESS
   147   0124    DFEE               RCALL __pa_0      
   148   0126    0EF0               MOVLW 0xf0        
   149   0128    14EF               ANDWF INDF0, W, ACCESS
   150   012A    0012               RETURN 0          
При полной оптимизации с Dead-code removal вся эта хрень просто сносится компилятором вчистую... :))

При отключенной оптимизации...

Код: Выделить всё

60:                LCD->RS = 0             ; //
  0076    C06A     MOVFF LCD, FSR0
  0078    FFE9     NOP
  007A    C06B     MOVFF 0x6b, FSR0H
  007C    FFEA     NOP
  007E    98EF     BCF INDF0, 0x4, ACCESS
61:                LCD->data = kod>>4    ; // передача старшего полубайта.
  0080    0100     MOVLB 0
  0082    396C     SWAPF kod, W, BANKED
  0084    0B0F     ANDLW 0xf
  0086    6E02     MOVWF __tmp_0, ACCESS
  0088    C06A     MOVFF LCD, FSR0
  008A    FFE9     NOP
  008C    C06B     MOVFF 0x6b, FSR0H
  008E    FFEA     NOP
  0090    5002     MOVF __tmp_0, W, ACCESS
  0092    0B0F     ANDLW 0xf
  0094    6EF3     MOVWF PRODL, ACCESS
  0096    0EF0     MOVLW 0xf0
  0098    14EF     ANDWF INDF0, W, ACCESS
  009A    10F3     IORWF PRODL, W, ACCESS
  009C    6EEF     MOVWF INDF0, ACCESS
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

замечательно, Химера. Никакого желания повторять эти телодвижения, А теперь на 24 пик - там все будет гораздо веселее с указателями, я уверен. Лет 5 назад проверял.... На хрена я это пишу...
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Вопросы по С/С++ (СИ)

Сообщение HHIMERA »

То что на PIC24 всё будет гораздо лучше я и не сомневаюсь... там многое, что намного лучше... :))
Я 24-ми игрался как только они появились...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

"Оркестр имени Пятницкого по этому поводу именно ?" (с) Жванецкий.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Вопросы по С/С++ (СИ)

Сообщение HHIMERA »

Оркестр по поводу того, что нефиг бездумно тыкать что попало куда попало... особенно в МК с недоразвитой индексацией... и только...
Есть и обратные примеры... когда унылые решения 8-ми битников тупо перетягиваются на STM32 и LPC1XXX... без учёта архитектуры... печальное зрелище...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

аж задумался, что там можно так печально перетянуть...
ну не единственная особенность архитектуры тех же стм - ок - с точки зрения с - но сцуко важная -
нет возможности физически запихнуть константу в регистр, все нужно делать через указатели, так как фон неймановская архитектура... и регистры находятся не знамо где, далеко в адресном пространстве в смысле...
вопрос второй - с прерываниями, вернее, с наложением оных, но можно пока тупо не обращать внимание, и так будет работать.
===
Мы, конечно, привыкли, но молодежь пугается чертей, которые водятся у нас на складе готовой продукции. (с)
===
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Вопросы по С/С++ (СИ)

Сообщение HHIMERA »

urry писал(а): На хрена я это пишу...
Как и нахрена я это выкладываю...

Код: Выделить всё

330:               LCD->RS = 0;
  0410  A14410     bclr [w0],#4
331:               LCD->data = kod>>4;
  0412  2081A1     mov.w #0x81a,w1
  0414  784091     mov.b [w1],w1
  0416  FB8081     ze w1,w1
  0418  DE08C4     lsr w1,#4,w1
  041A  614810     and.b w2,[w0],[w0]
  041C  70C810     ior.b w1,[w0],[w0]
urry писал(а):можно пока тупо не обращать внимание, и так будет работать.
Дык... так можно вообще ни на что не обращать внимания...
===
Мы, конечно, привыкли, но молодежь пугается чертей, которые водятся у нас на складе готовой продукции. (с)
===
Вот заведут своих чертей... тоже привыкнут...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

HHIMERA писал(а):Пара тактов... :))
...
:))
Я имел ввиду разницу между прямой и косвенной адресацией. А то что там куча всякой хрени со свапами, в этом никто и не сомневался. Это будет и без всяких указателей :)) В принципе, о чём и разговор - применение структур, в данном случае, неоправданно.
Александр 2677
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн фев 22, 2010 11:16:00

Re: CodeVision AVR в вопросах и ответах

Сообщение Александр 2677 »

Добрый день коллеги, помогите пожалуйста с кодом.
Не могу сообразить как выводить символ на LCD из UART.

Код: Выделить всё

TEST = getchar();
       sprintf(lcd_buffer, "%d", TEST);
       lcd_clear();
       lcd_gotoxy( 0,0 );
       lcd_puts(lcd_buffer); //выводим масив на LCD 
У меня получается только вывести его код из таблицы символов в десятичном виде :?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Код: Выделить всё

sprintf(lcd_buffer, "%c", TEST);
Думаю, что как-то так...
Александр 2677
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн фев 22, 2010 11:16:00

Re: Вопросы по С/С++ (СИ)

Сообщение Александр 2677 »

Большое спасибо, я сразу не заметил что получил ответ на вопрос. Всё работает. :))
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Только, для вывода однго символа, жирновато будет юзать sprintf, лучше выводить этот символ напрямую, если конечно имеется такая ф-ия.
Александр 2677
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн фев 22, 2010 11:16:00

Re: Вопросы по С/С++ (СИ)

Сообщение Александр 2677 »

Это как?
Я пока только разбираюсь как что делается, но ближайшая цель вывести данные из GPS модуля EB-500 на LCD.
Последний раз редактировалось Александр 2677 Сб ноя 10, 2012 14:00:33, всего редактировалось 1 раз.
Ответить

Вернуться в «Разные вопросы по МК»