Страница 393 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт окт 12, 2017 19:58:23
Dimon456
[uquote="Dikoy",url="/forum/viewtopic.php?p=3197776#p3197776"]в железе работает
протеус на мыло[/uquote]Прекрасно в протеусе работает.
Спойлер

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт окт 24, 2017 15:20:02
gogaze
Помогите новичку! АмперВольтметр, дисплей 1602, вывод данных АЦП на дисплей так
//Текущее напряжение
lcd_gotoxy(0,0);
result=(adc_data[0]*0.01955); //пересчитываем значение АЦП в вольты
sprintf(lcd_buffer,"%.1f V ",result); //помещаем во временную переменную результат
lcd_puts(lcd_buffer); //выводим на экран
Как то же самое вывести на дисплей Nokia 5110 (PCD8544)?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт ноя 09, 2017 09:39:22
Пока_без_кота
Доброго времени суток. Поделитесь пожалуйста ссылкой для скачивания версии 2.50 с crack, нигде не могу найти.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб фев 10, 2018 21:46:54
sergejjj123
Немного непонятно как в массиве с помощью указателя вытащить элемент 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] не очень нравиться
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб фев 10, 2018 21:59:59
WiseLord
sergejjj123 писал(а):Если записать так PORTD = masiv[*p] то запишется 1 в PD.1
А чтобы зажечь PD.0 надо изголиться - PORTD = masiv[*p-1]
Я не специалист в CVAVR, но это не похоже на правду.
PORTD = masiv[*p] запишет не в PD.1 единицу, а в PORTD число 2. И хотя это выглядит похоже, но это совсем разные вещи.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс фев 11, 2018 02:36:31
sergejjj123
Ну это понятно что запишеться весь порт а не только в конкретный бит.
Видно и так что под нулевым индексом в дес формате цифра 1 (1; в бинарном остальные слева заполнятся нулями)
Как не крути единичка должна появиться только на нулевом разряде порта .
Может как-то неправильно я поставил вопрос .
Вы смотрите синтаксис языка а сути вопроса не поняли.
Как в массиве с помощью указателя вытащить с 0-го индекса значение?
У меня получается только с 1-го индекса это цифра десятичн 2 а номер бита в порте -1 (10; в бинарном тоже слева куча нулей)
Почему-то когда пишу так [0] работает правильно
А если так [*p] -то берет значение массива 1-го индекса
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс фев 11, 2018 07:26:02
WiseLord
Ну так естественно. Ведь *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.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 14, 2018 14:56:42
rvk
Привет всем и с праздником святого Валентина!
Прошу меня простить, возможно это уже где то описано.
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 это компилируется, но там почему то не так компилируется как нужно. Уже оптимизацию менял. В дебаговом режиме студия пропускает строки. Одним словом, что то у меня не совсем срослось

Буду очень признателел за обе подсказки. Потому что писать мне больше нравится в студии, но не могу толком настроить.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 14, 2018 15:06:15
WiseLord
А volatile допустим в аргументах функции в CVAVR?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 14, 2018 16:12:13
rvk
[uquote="WiseLord",url="/forum/viewtopic.php?p=3306085#p3306085"]
sergejjj123 писал(а):Если записать так PORTD = masiv[*p] то запишется 1 в PD.1
А чтобы зажечь PD.0 надо изголиться - PORTD = masiv[*p-1]
Я не специалист в CVAVR, но это не похоже на правду.
PORTD = masiv[*p] запишет не в PD.1 единицу, а в PORTD число 2. И хотя это выглядит похоже, но это совсем разные вещи.[/uquote]
А тут я так понял, что надо просто использовать не присвоение, а побитовое или с присвоением
PORTD |= *p;
Тогда и все биты останутся не тронутыми, кроме как того, какое число будет в *p
Добавлено after 54 minutes 2 seconds:
[uquote="WiseLord",url="/forum/viewtopic.php?p=3308710#p3308710"]А volatile допустим в аргументах функции в CVAVR?[/uquote]
Я пробовал без volatile, ничего не меняется.
А как же тогда заставить codevision запихать переменную в регистр? Но это не вопрос.
Спасибо большое!
Добавлено after 6 minutes 1 second:
Может лучше сразу прицепить весь проект.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 14, 2018 19:04:09
ARV
rvk писал(а):А как же тогда заставить codevision запихать переменную в регистр?
может быть, наоборот - регистр в переменную? я так вангую, вы хотите свою функцию set_port использовать как-то так
Код: Выделить всё
set_port(&PORTB, 3); // устанавливаем 3-й бит в PORTB
set_port(&PORTD, 2); // 2-й бит в PORTD
такое возможно на самом деле в AVR-GCC, но на сколько мне известно, не в CVAVR.
в большинстве случаев вместо подобной функции вполне неплохо проявляют себя макросы
Код: Выделить всё
#define set_port(p,b) do{ p |= (1 << (b));}while(0)
set_port(PORTB, 3);
set_port(PORTD, 2);
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 15, 2018 00:55:43
rvk
такое возможно на самом деле в 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 ) ) )
uint8_t BITS_CHIP_PANEL[] = { 0, 1, 7, 6, 5, 4 };
uint8_t *PORTS_CHIP_PANEL[] = { &PORTA, &PORTA, &PORTD, &PORTD, &PORTC, &PORTC };
uint8_t *PINS_CHIP_PANEL[] = { &PINA, &PINA, &PIND, &PIND, &PINC, &PINC };
uint8_t *DDRS_CHIP_PANEL[] = { &DDRA, &DDRA, &DDRD, &DDRD, &DDRC, &DDRC };
А теперь, когда я это использую
, компилятор снова испуган: "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 студию.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 15, 2018 03:42:16
WiseLord
define некорректные, а именно -звездочки в них.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 15, 2018 11:39:42
rvk
define некорректные, а именно -звездочки в них.
Этот код в студии работает. Значит точно ничего не выйдет в Codevision.

А подскажите, коты, пожалуйста, как можно переменную по ссылке передать? Ведь этой переменной должен быть порт ЦП.
Потому что у меня есть 20 портов, которые часто используются. Вот как выйти из положения не создавая массива портов?
Спасибо всем!
Сегодня праздник большой. Всех с праздником Сретения!
Добавлено after 2 hours 39 minutes 2 seconds:
Вот, наконец то, результаты есть!
Этот код:
Код: Выделить всё
uint8_t BITS_CHIP_PANEL[] = { 0, 1, 7, 6, 5, 4 };
uint8_t *PORTS_CHIP_PANEL[] = { &PORTA, &PORTA, &PORTD, &PORTD, &PORTC, &PORTC };
заданы переменные
А потом использование
Код: Выделить всё
*PORTS_CHIP_PANEL[ 3 ] |= ( 1 << BITS_CHIP_PANEL[ 3 ] );
РАБОТАЕТ!!!!!!
Не нужно придумывать в Codevision ниаких методов или define-ов - работать у меня отказалось, а вот самый обыкновенный код, работает.
И можно использовать в указателе на массив адреса портов !!!!!!!!!!!
УРРРРРРААААА!
Всем удачи и спасибо!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт фев 27, 2018 13:01:55
bango
Код: Выделить всё
// Задаем режим работы таймера-счетчика 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 в вопросах и ответах
Добавлено: Вт фев 27, 2018 15:51:04
city77
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 28, 2018 06:53:33
bango
Благодарю за подсказку. Но я хочу понять как это работает в визарде программа которую я переделываю не работает вот я и хочу понять и найти ошибки, а ошибки есть проверял в протэусе вот еще
TCCR1B = _BV(WGM12) | // WGM = 0100 - режим CTC
_BV(CS12)| // CS = 111 - от внешнего источника (по фронту)
_BV(CS11)|
_BV(CS10);
как с этим разобраться не пойму. здесь на оборот 1ю половину не пойму а вторую половину понял как сделать. Подскажите как с этим бороться.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 28, 2018 10:00:02
city77
как с этим разобраться
лучший способ - плюнуть на визарды и взять справочник/datasheet. Если очень плохо с английским скачайте книжки Евстифеева - Микроконтроллеры AVR семейств Tiny и Mega - там все разжевано
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 28, 2018 10:15:33
bango
Скачал Белов А В Создаем устройства на микроконтроллерах пытаюсь вникнуть, а даташит на русском не нашел в школе учил немецкий.
Вообще существует даташит на аттини 2313 на русском. Поделитесь если есть.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 28, 2018 10:37:13
city77
bango писал(а):Поделитесь если есть
.. я же вам название дал, неужели поиск в гугле запретили?
http://avr.ru/docs/books/avr