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

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

а потом постоянно надо возвращаться в начало программы и смотреть чему равен define...
бред полный !
:facepalm:

по нормальному объявляешь переменную по имени которой понятно за что отвечает эта переменная.

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

unsigned char port_B = 0;
а потом записывает в переменную состояние порта "B"

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

port_B = PINB;
далее... в программе мы знаем что в переменно "port_B" записано состояние порта "B".
это понятно по имени переменной.
и далее спокойно работаем с переменно "port_B".
без всяких define...
:tea:

кому-то точно надо пойти дальше учиться))
:facepalm:

Устал я от тебя.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 5751
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж

Сообщение >TEHb< »

roman.com писал(а):а потом постоянно надо возвращаться в начало программы и смотреть чему равен define...
Зачем? В самом дефайне отражено его предназначение. Конструкция типа if (VHODNOY_SIGNAL_PRIYOMNIKA == 1 ) {...} недостаточно отражает логику происходящего? Какая разница к какой конкретно ножке там за кулисами подключен этот сигнал?
Усложнять просто. Упрощать сложно.
Контактная информация:
Реклама
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

разница в читаемости кода...

в переменной "port_B" записано состояние порта "B".
больше ничего не надо.

всё ясно.
:facepalm:
если кому надо раздуть код своей программы до немыслимых размеров... обращайтесь к OKF и >TEHb< ))
:tea:
OKF
Это не хвост, это антенна
Сообщения: 1407
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Тяжелый случай.(
Изменил ты подключение. И что будешь переписывать везде port_b на port_d?
Даже, если ничего не меняешь, get_dtmf() уже говорит сам за себя. И даже комментарии излишни.
И неважно как ты его получишь, какие биты к каким портам подключены.
Это же не ассемблер. И даже там стараются отделять подключение и логику.
Рома, удачи!
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 5751
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж

Сообщение >TEHb< »

Ну классно. А если часть сигналов заведены на порт Б, а часть на порт А? Всё, переменную никак не назвать.
Если ноги-порты задавать дефайнами, то можно сразу и их настройку проводить. То есть программа настраивается в одной точке.
Усложнять просто. Упрощать сложно.
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 437
Зарегистрирован: Ср сен 02, 2015 07:47:20

Сообщение HardWareMan »

[uquote="roman.com",url="/forum/viewtopic.php?p=4750681#p4750681"]а потом постоянно надо возвращаться в начало программы и смотреть чему равен define...
бред полный ![/uquote]
Зачем? Все современные IDE выводят значения констант в контекстной подсказке просто после наведения на имя константы. А в режиме отладки так же можно смотреть и значения переменных...
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 604
Зарегистрирован: Пн июн 03, 2024 22:29:24

Сообщение Thinnnfor »

Добрый вечер уважаемые ! Как в программе организовать рестарт МК ? Ну например в PIC CCS есть команда restart ( cpu ) точно не помню как она пишется но она есть. А в CV AVR такой нет как я понял.
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

asm("jmp 0"); или аналогично в выбранном компиляторе (периферия не сбрасывается),
но лучше с WDT: wdt_enable(WDTO_15MS); и какая-то пауза или бесконечный цикл до перезапуска.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 604
Зарегистрирован: Пн июн 03, 2024 22:29:24

Сообщение Thinnnfor »

Ну то есть заставить собачий таймер отработать ? ...

Добавлено after 3 hours 15 minutes 49 seconds:
Да ! Там одна кнопка , краткое нажатие меняет параметры отображения , длинное - процедура изменения параметров ... Всё на динамической индикации , и в ней же сброс сторожевого таймера ... Можно ещё сделать более длинное нажатие на кнопку , и тогда сделать бесконечный цикл без входа в индикацию , конечно тогда WDT сбросит МК.
Вымогатель припоя
Аватара пользователя
Сообщения: 604
Зарегистрирован: Пн июн 03, 2024 22:29:24

Сообщение Thinnnfor »

Как в CV AVR реализовать передачу строки ( не строчной переменной ) в функцию или процедуру ?
Такой код не работает , хотя вроде всё логично ...

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

const unsigned char sim[33]=
{65,160,66,161,224,69,163,164,165,166,75,167,77,72,79,168,80,67,84,169,170,88,225,171,172,226,196,174,173,175,176,177}; //коды Кириллицы для китайских LCD 

const  char sim1[33]=
{'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ш','Щ','Ь','Ы','Ъ','Э','Ю','Я'}; //коды Кириллицы винды 

void pint_rus (char str[])
{
  unsigned char j,j1,size ;
  
  size=sizeof(str)-1; // определяем длинну строки
  for(j=0;j<size;j++); // начинаем перекодировку символов из виндовых в китайские LCD
            {
              for(j1=0;j1<33;j1++) 
              if (sim1[j1]==str[j]) 
              lcd_putchar(sim[j1]); // выводим на LCD РУССКИЙ текст
  
            }
}

while (1)
          {
              lcd_gotoxy(0,3);
              pint_rus("ПРЕВЕД МЕДВЕД");

          }
Мучитель микросхем
Сообщения: 467
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

В Си нет такого типа - "строка". Поэтому строка - это обычный массив элементов типа char. А передача массива в функцию - по указателю.

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

void Print(const char *str, unsigned int len)
{
    while(len--)
    {
          ....
    }
}

ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

sizeof не определяет размер строки! Размер строки определяет strlen
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 604
Зарегистрирован: Пн июн 03, 2024 22:29:24

Сообщение Thinnnfor »

Ну как бы размер строчной переменной прекрасно как раз таки определяет.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Определяет, говорите? И даже по передаваемому в параметре функции указателю тоже определяет?

sizeof может определить только размер константной строки.

Но вообще говоря, для перекодировки строк не надо знать их длины, достаточно брать по одному символу, пока не возьмется 0.

Добавлено after 3 minutes 21 second:
Как-то так:

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

 char c;
while(c=*str++) {
   encode_char(c); // обработка очередного символа строки str
} 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Thinnnfor писал(а):хотя вроде всё логично ...
Где Вы видите логику в :

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

char str[]

sizeof(str)
?

Что ожидаете в этом случае от sizeof ? И почему именно такие ожидания ?
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 604
Зарегистрирован: Пн июн 03, 2024 22:29:24

Сообщение Thinnnfor »

Ну вот кусок программы для часов-термометра которых уже несколько штук и работают 5 лет.
Реализация бегущей строки для светодиодных матриц 8х8 , выкладывать коды функций нет смысла они работают. Ну и sizeof вполне работает .

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


char unsigned str2[]="   ТЕМПЕРАТУРА ВОЗДУХА ";// глобальная строковая переменная 

while (1)        // основной цикл программы
          {
             a=5; // скорость бегущей строки, не будем заморачиваться 
             size=sizeof(str2)-1;  // определяем размер строковой переменной
             for(k=1;k<size;k++)  //выводим  текст "   ТЕМПЕРАТУРА ВОЗДУХА " 
              {
               simv=(str2[k]) ; // определяем код очередного символа в выводимой строке
               obrzap (simv) ; // заполняем невидимую нуль-матрицу ( справа )для последующего сдвига в видимую область, из таблицы 8*8 для матрицы светодиодов
               sdvig(); //сдвиг 8 строк * 8 раз в лево 
              } // далее повторяемся для следующего символа пока строка не кончится

          }
Мучитель микросхем
Сообщения: 467
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

В таком виде sizeof срабатывает. Но при передаче в функцию теряется размер строки (массива элементов char)/

Длину строки в функцию лучше передавать в явном виде, как показывал ранее. Это позволит выводить строку не полностью, а также не нуль-терминированные строки
Вымогатель припоя
Аватара пользователя
Сообщения: 604
Зарегистрирован: Пн июн 03, 2024 22:29:24

Сообщение Thinnnfor »

Вот в том и вопрос... Хотелось бы не писать одно и тоже для вывода каждой строки, а сделать функцию в которую будет передаваться только строка.

Добавлено after 1 minute 13 seconds:
Всмысле только содержимое строки

Добавлено after 22 minutes 19 seconds:
Ну и допустим в стандартной библиотеке CV AVR #include <alcd.h>
lcd_putsf("hello word"); работает же !
Почему я не могу написать библиотеку где будет просто print_rus (" привет мир ") просто со скобками и кавычками . Кстати для PIC CCS я переделал стандартную библиотеку , и она именно так работает как надо.
Вымогатель припоя
Сообщения: 556
Зарегистрирован: Вт окт 01, 2024 15:22:33

Сообщение Adrift »

[uquote="Thinnnfor",url="/forum/viewtopic.php?p=4793640#p4793640"]Почему я не могу написать библиотеку где будет просто print_rus (" привет мир ") просто со скобками и кавычками .[/uquote]
Вам же сказали, что для определения длины строки используйте strlen, в чем проблема? Хотя там размер не сильно и нужен...
Вымогатель припоя
Аватара пользователя
Сообщения: 604
Зарегистрирован: Пн июн 03, 2024 22:29:24

Сообщение Thinnnfor »

Thinnnfor писал(а):Кстати для PIC CCS я переделал стандартную библиотеку , и она именно так работает как надо.
Вот так :
Правда только для заглавных букв , но это уже мелочи !

Изображение

И вызывается вот так :
lcd_rus(" РОССИЯ ФОРЕВЕР ЕВРОПА ГОВНО ");
Ответить

Вернуться в «AVR»