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

Обсуждаем контроллеры компании Atmel.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

[uquote="Dikoy",url="/forum/viewtopic.php?p=3197776#p3197776"]в железе работает
протеус на мыло[/uquote]Прекрасно в протеусе работает.
СпойлерИзображение
Реклама
gogaze
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Пн янв 09, 2017 06:50:37
Откуда: Приморье

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

Сообщение 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)?
Мир не без добрых людей!
Реклама
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

Сообщение Пока_без_кота »

Доброго времени суток. Поделитесь пожалуйста ссылкой для скачивания версии 2.50 с crack, нигде не могу найти.
sergejjj123
Открыл глаза
Сообщения: 65
Зарегистрирован: Пт окт 16, 2009 22:32:58

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

Сообщение 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] не очень нравиться
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

sergejjj123 писал(а):Если записать так PORTD = masiv[*p] то запишется 1 в PD.1
А чтобы зажечь PD.0 надо изголиться - PORTD = masiv[*p-1]
Я не специалист в CVAVR, но это не похоже на правду.
PORTD = masiv[*p] запишет не в PD.1 единицу, а в PORTD число 2. И хотя это выглядит похоже, но это совсем разные вещи.
Реклама
sergejjj123
Открыл глаза
Сообщения: 65
Зарегистрирован: Пт окт 16, 2009 22:32:58

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

Сообщение sergejjj123 »

Ну это понятно что запишеться весь порт а не только в конкретный бит.
Видно и так что под нулевым индексом в дес формате цифра 1 (1; в бинарном остальные слева заполнятся нулями)
Как не крути единичка должна появиться только на нулевом разряде порта .
Может как-то неправильно я поставил вопрос .
Вы смотрите синтаксис языка а сути вопроса не поняли.
Как в массиве с помощью указателя вытащить с 0-го индекса значение?
У меня получается только с 1-го индекса это цифра десятичн 2 а номер бита в порте -1 (10; в бинарном тоже слева куча нулей)
Почему-то когда пишу так [0] работает правильно
А если так [*p] -то берет значение массива 1-го индекса
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение 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.
Аватара пользователя
rvk
Встал на лапы
Сообщения: 123
Зарегистрирован: Ср фев 01, 2017 14:20:58

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

Сообщение 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 это компилируется, но там почему то не так компилируется как нужно. Уже оптимизацию менял. В дебаговом режиме студия пропускает строки. Одним словом, что то у меня не совсем срослось :)
Буду очень признателел за обе подсказки. Потому что писать мне больше нравится в студии, но не могу толком настроить.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

А volatile допустим в аргументах функции в CVAVR?
Аватара пользователя
rvk
Встал на лапы
Сообщения: 123
Зарегистрирован: Ср фев 01, 2017 14:20:58

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

Сообщение 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:
Может лучше сразу прицепить весь проект.
Вложения
Tester.rar
(105.04 КБ) 216 скачиваний
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18558
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение 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);
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
rvk
Встал на лапы
Сообщения: 123
Зарегистрирован: Ср фев 01, 2017 14:20:58

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

Сообщение 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 ) ) {}, буду пробовать.
Но я сегодня :shock: :shock: :shock: . А вчера компилятор от этого выражения был в :shock: :shock: :shock: .
Или я где то лажанул по полной.
Спасибо! Спасибо! Спасибо!
А еще вот не понял выражения
#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 };
А теперь, когда я это использую

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

CLEAR_PORT( PORTS_CHIP_PANEL[ i ], i );
, компилятор снова испуган: "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 студию.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

define некорректные, а именно -звездочки в них.
Аватара пользователя
rvk
Встал на лапы
Сообщения: 123
Зарегистрирован: Ср фев 01, 2017 14:20:58

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

Сообщение rvk »

define некорректные, а именно -звездочки в них.
Этот код в студии работает. Значит точно ничего не выйдет в Codevision.
:idea: А подскажите, коты, пожалуйста, как можно переменную по ссылке передать? Ведь этой переменной должен быть порт ЦП.
Потому что у меня есть 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-ов - работать у меня отказалось, а вот самый обыкновенный код, работает.
И можно использовать в указателе на массив адреса портов !!!!!!!!!!!
УРРРРРРААААА!
:)) :)) :))) :music: :solder:
Всем удачи и спасибо!
bango
Открыл глаза
Сообщения: 52
Зарегистрирован: Вт май 05, 2009 17:32:50

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

Сообщение 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
А дальше как. Эта моя первая программа.
city77
Открыл глаза
Сообщения: 53
Зарегистрирован: Чт дек 28, 2017 23:07:31

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

Сообщение city77 »

неужели долго ручками?

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

 TCCR0A = (1<<COM0A0) | (1<<WGM01);           
bango
Открыл глаза
Сообщения: 52
Зарегистрирован: Вт май 05, 2009 17:32:50

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

Сообщение bango »

Благодарю за подсказку. Но я хочу понять как это работает в визарде программа которую я переделываю не работает вот я и хочу понять и найти ошибки, а ошибки есть проверял в протэусе вот еще
TCCR1B = _BV(WGM12) | // WGM = 0100 - режим CTC
_BV(CS12)| // CS = 111 - от внешнего источника (по фронту)
_BV(CS11)|
_BV(CS10);
как с этим разобраться не пойму. здесь на оборот 1ю половину не пойму а вторую половину понял как сделать. Подскажите как с этим бороться.
city77
Открыл глаза
Сообщения: 53
Зарегистрирован: Чт дек 28, 2017 23:07:31

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

Сообщение city77 »

как с этим разобраться
лучший способ - плюнуть на визарды и взять справочник/datasheet. Если очень плохо с английским скачайте книжки Евстифеева - Микроконтроллеры AVR семейств Tiny и Mega - там все разжевано
bango
Открыл глаза
Сообщения: 52
Зарегистрирован: Вт май 05, 2009 17:32:50

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

Сообщение bango »

Скачал Белов А В Создаем устройства на микроконтроллерах пытаюсь вникнуть, а даташит на русском не нашел в школе учил немецкий.
Вообще существует даташит на аттини 2313 на русском. Поделитесь если есть.
city77
Открыл глаза
Сообщения: 53
Зарегистрирован: Чт дек 28, 2017 23:07:31

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

Сообщение city77 »

bango писал(а):Поделитесь если есть
.. я же вам название дал, неужели поиск в гугле запретили? http://avr.ru/docs/books/avr
Ответить

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