Помогите новичку! АмперВольтметр, дисплей 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] не очень нравиться
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Если записать так 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 на русском. Поделитесь если есть.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения