Помогите новичку! АмперВольтметр, дисплей 1602, вывод данных АЦП на дисплей так //Текущее напряжение lcd_gotoxy(0,0); result=(adc_data[0]*0.01955); //пересчитываем значение АЦП в вольты sprintf(lcd_buffer,"%.1f V ",result); //помещаем во временную переменную результат lcd_puts(lcd_buffer); //выводим на экран Как то же самое вывести на дисплей Nokia 5110 (PCD8544)?
Немного непонятно как в массиве с помощью указателя вытащить элемент c индексом -0. Просто имя массива ссылается на его первый элемент? В общем нужен совет int *p; -указатель на целочисл число p= masiv; или так p=&masiv[0] int masiv[8]={1,2,3, ... } 0-й элемент массива 1 , 1-й элемент массива 2 и т д Если записать так PORTD = masiv[*p] то запишется 1 в PD.1 А чтобы зажечь PD.0 надо изголиться - PORTD = masiv[*p-1] Вот это [*p-1] не очень нравиться
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Если записать так PORTD = masiv[*p] то запишется 1 в PD.1 А чтобы зажечь PD.0 надо изголиться - PORTD = masiv[*p-1]
Я не специалист в CVAVR, но это не похоже на правду. PORTD = masiv[*p] запишет не в PD.1 единицу, а в PORTD число 2. И хотя это выглядит похоже, но это совсем разные вещи.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Ну это понятно что запишеться весь порт а не только в конкретный бит. Видно и так что под нулевым индексом в дес формате цифра 1 (1; в бинарном остальные слева заполнятся нулями) Как не крути единичка должна появиться только на нулевом разряде порта . Может как-то неправильно я поставил вопрос . Вы смотрите синтаксис языка а сути вопроса не поняли. Как в массиве с помощью указателя вытащить с 0-го индекса значение? У меня получается только с 1-го индекса это цифра десятичн 2 а номер бита в порте -1 (10; в бинарном тоже слева куча нулей) Почему-то когда пишу так [0] работает правильно А если так [*p] -то берет значение массива 1-го индекса
Ну так естественно. Ведь *p = 1, поэтому и берётся masiv[1]. Если нужно вытянуть с нулевого индекса значение, то это (выбирайте на вкус): masiv[0] = *masiv = *(masiv + 0) = *p = *(p + 0) = p[0] Абсолютно так же и для других индесов, например 3: masiv[3] = *(masiv + 3) = *(p + 3) = p[3]. Вы же по какой-то причине пытаетесь разыменовать указатель дважды. Делая masiv[*p], по сути делаете masiv[masiv[0]].
sergejjj123 писал(а):
Как в массиве с помощью указателя вытащить с 0-го индекса значение?
Ещё раз,резюмируя. Проще всего это сделать так: masiv[0]. И не вводить ещё один лишний указатель p, фактически являющийся полным дублем masiv.
Привет всем и с праздником святого Валентина! Прошу меня простить, возможно это уже где то описано. Codevisionavr 3.12. В отдельном модуле описываю метод локальный: =================== void set_port( volatile uint8_t *pReg, uint8_t bit ) { *pReg |= ( 1 << bit ); } А она выдает мне ошибку: "Error: C:\Users\1\Documents\AVR\Tester\macros.c(20): invalid combination of type specifiers". Если этот метод сделать общедоступным, вынести название в хидер, то имеют место 3 ошибки: ================ Error: C:\Users\1\Documents\AVR\Tester\macros.h(7), #included from: main.c: invalid combination of type specifiers Error: C:\Users\1\Documents\AVR\Tester\macros.h(7), #included from: macros.c: invalid combination of type specifiers Error: C:\Users\1\Documents\AVR\Tester\macros.c(16): invalid combination of type specifiers ================ Мой модуль macros.c включает заглавие macros.h и главный модуль проэкта тоже включает macros.h. И почему то codevisionavr мне это выдает за ошибку. Подскажите мне, будте добры, где я здесь ошибся. я уже второй день над этим голову ламаю. мозги уже выносит. В Atmel Studio это компилируется, но там почему то не так компилируется как нужно. Уже оптимизацию менял. В дебаговом режиме студия пропускает строки. Одним словом, что то у меня не совсем срослось Буду очень признателел за обе подсказки. Потому что писать мне больше нравится в студии, но не могу толком настроить.
Если записать так PORTD = masiv[*p] то запишется 1 в PD.1 А чтобы зажечь PD.0 надо изголиться - PORTD = masiv[*p-1]
Я не специалист в CVAVR, но это не похоже на правду. PORTD = masiv[*p] запишет не в PD.1 единицу, а в PORTD число 2. И хотя это выглядит похоже, но это совсем разные вещи.
А тут я так понял, что надо просто использовать не присвоение, а побитовое или с присвоением PORTD |= *p; Тогда и все биты останутся не тронутыми, кроме как того, какое число будет в *p
такое возможно на самом деле в AVR-GCC, но на сколько мне известно, не в CVAVR.
в большинстве случаев вместо подобной функции вполне неплохо проявляют себя макросы
Да. Спасибо! Написал вот так:
Код:
#define SET_PORT ( *reg, bit ) ( ( *reg ) |= ( 1 << ( bit ) ) ) #define CLEAR_PORT ( *reg, bit ) ( ( *reg ) &= ~( 1 << ( bit ) ) ) #define CHECK_PIN ( *pin, bit ) ( ( *pin ) & ( 1 << ( bit ) ) )
Помогло. Пока не знаю, как будет работать в програме CHECK_PIN, но SET и CLEAR должны. Можно ли будет создать условие: if ( CHECK_PIN( &PINA, 2 ) ) {}, буду пробовать. Но я сегодня . А вчера компилятор от этого выражения был в . Или я где то лажанул по полной. Спасибо! Спасибо! Спасибо! А еще вот не понял выражения
Цитата:
#define set_port(p,b) do{ p |= (1 << (b));}while(0)
Для чего и как это работает? Зачем здесь цикл?
Добавлено after 24 minutes 28 seconds: У меня написано:
Код:
#define SET_PORT ( *reg, bit ) ( ( *reg ) |= ( 1 << ( bit ) ) ) #define CLEAR_PORT ( *reg, bit ) ( ( *reg ) &= ~( 1 << ( bit ) ) ) #define CHECK_PIN ( *pin, bit ) ( ( *pin ) & ( 1 << ( bit ) ) )
, компилятор снова испуган: "Error: C:\Users\1\Documents\AVR\Tester\macros.c(42): undefined symbol 'reg'" И не проходит ни PORTS_CHIP_PANEL[ i ], ни *PORTS_CHIP_PANEL[ i ], ни &PORTS_CHIP_PANEL[ i ]. Ошибка одинаковая. В студии это работает. Похоже мне снова не повезло. Надо спрыгивать на 4 студию.
Этот код в студии работает. Значит точно ничего не выйдет в Codevision. А подскажите, коты, пожалуйста, как можно переменную по ссылке передать? Ведь этой переменной должен быть порт ЦП. Потому что у меня есть 20 портов, которые часто используются. Вот как выйти из положения не создавая массива портов? Спасибо всем!
Сегодня праздник большой. Всех с праздником Сретения!
Добавлено after 2 hours 39 minutes 2 seconds: Вот, наконец то, результаты есть! Этот код:
РАБОТАЕТ!!!!!! Не нужно придумывать в Codevision ниаких методов или define-ов - работать у меня отказалось, а вот самый обыкновенный код, работает. И можно использовать в указателе на массив адреса портов !!!!!!!!!!! УРРРРРРААААА!
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт фев 27, 2018 13:01:55
Открыл глаза
Зарегистрирован: Вт май 05, 2009 17:32:50 Сообщений: 52
Рейтинг сообщения:0
Код:
// Задаем режим работы таймера-счетчика 0 TCCR0A = _BV(COM0A0) | // COM0A1 = 0 и COM0A0 = 1 - переключение OC0A в момент совпадения _BV(WGM01); // WGM = 010 - режим CTC TCCR0B = _BV(CS02)| // CS = 101 - от внутреннего источника _BV(CS00); // с предделителем 1024 OCR0A = M; // Инициализируем счетчик
Помогите начинающему. Есть кусок программы переделываю этот код под CV AVR не могу понять как в визарте сделать эти пол строки _BV(WGM01); // WGM = 010 - режим CTC первую половину делаю так Timer0 / Out.A Toggle on compare match А дальше как. Эта моя первая программа.
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 28, 2018 06:53:33
Открыл глаза
Зарегистрирован: Вт май 05, 2009 17:32:50 Сообщений: 52
Рейтинг сообщения:0
Благодарю за подсказку. Но я хочу понять как это работает в визарде программа которую я переделываю не работает вот я и хочу понять и найти ошибки, а ошибки есть проверял в протэусе вот еще TCCR1B = _BV(WGM12) | // WGM = 0100 - режим CTC _BV(CS12)| // CS = 111 - от внешнего источника (по фронту) _BV(CS11)| _BV(CS10); как с этим разобраться не пойму. здесь на оборот 1ю половину не пойму а вторую половину понял как сделать. Подскажите как с этим бороться.
лучший способ - плюнуть на визарды и взять справочник/datasheet. Если очень плохо с английским скачайте книжки Евстифеева - Микроконтроллеры AVR семейств Tiny и Mega - там все разжевано
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 28, 2018 10:15:33
Открыл глаза
Зарегистрирован: Вт май 05, 2009 17:32:50 Сообщений: 52
Рейтинг сообщения:0
Скачал Белов А В Создаем устройства на микроконтроллерах пытаюсь вникнуть, а даташит на русском не нашел в школе учил немецкий. Вообще существует даташит на аттини 2313 на русском. Поделитесь если есть.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения