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

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

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

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

Кнопку, судя по всему, Вы опрашивать уже умеете. Тогда сделайте обычный программный триггер, а по его состоянию развилочку (условие) на два куска программы.
Триггер сделать очень просто. Заводите переменную и после каждого нажатия кнопки меняете её состояние.
Вот, собственно, и весь алгоритм :dont_know:
Реклама
Rtmip
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

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

Сообщение Rtmip »

sphincs писал(а):где можно взять библиотеку для работы с LCD на HD44780 через I2C расширитель PCF8574 для CV AVR?
тут, предпоследнее сообщение. :)
Реклама
Аватара пользователя
sphincs
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Вт сен 11, 2012 09:13:52
Откуда: Брест, Беларусь
Контактная информация:

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

Сообщение sphincs »

Rtmip, там есть библиотека для LCD, но нет для PCF8574. качаю разные библиотеки для PCF8574, они ссылаются на другие самописные библиотеки. одна за одну цепляются. короче, как я понял, без вариантов. нужны либо все библиотеки от того автора, либо писать их самому :(
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

А в чём проблема-то написать самому?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Какой кошмар, уже для регистров библиотеки ищут. Скоро для светодиодов будут библиотеки просить :facepalm:
Читайте, там всё понятно. Останется просто подёргать ногами МК.
Реклама
Rtmip
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

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

Сообщение Rtmip »

sphincs писал(а):Rtmip, там есть библиотека для LCD, но нет для PCF8574.
Во вложении смотрите :tea:
Аlex писал(а):Какой кошмар, уже для регистров библиотеки ищут...
этот регистр простой, да :)
Но, вот бывают же новички, им надо помочь разобраться, кроме того, это же не просто регистром управлять, а через
него управлять дисплеем. А учитывая, что у нас до сих пор живая тема про инициализацию LCD на HD44780, то нечему
удивляться, раз не могут просто с дисплеем справиться. :))
Вложения
remote.rar
(1.08 КБ) 346 скачиваний
Реклама
DC_DC
Родился
Сообщения: 8
Зарегистрирован: Вс окт 05, 2014 21:11:48

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

Сообщение DC_DC »

Аlex писал(а):Кнопку, судя по всему, Вы опрашивать уже умеете. Тогда сделайте обычный программный триггер, а по его состоянию развилочку (условие) на два куска программы.
Триггер сделать очень просто. Заводите переменную и после каждого нажатия кнопки меняете её состояние.
Вот, собственно, и весь алгоритм :dont_know:
Спасибо, разобрался.
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

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

Сообщение amd9800 »

Мне нужно сделать директиву(макрос) через которую человек определяет порт на котором висит устройство

к примеру #define SPI_PORT PORTB

но мне нужен и Регистр DDRB
но определять две директивы неудобно

поэтому думаю сделать такую хитрость
#define SPI_PORT B

а уже в хедере
#define SPI_DDR ##DDR SPI_PORT
#define SPI_PORT ##PORT SPI_PORT

таким образом получим DDRB
и переопределим директиву SPI_PORT с значением PORTB

как думаете насколько это правильно?
Аватара пользователя
rxstart1
Вымогатель припоя
Сообщения: 508
Зарегистрирован: Пт фев 22, 2013 18:00:43
Откуда: Беларусь, г. Гомель

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

Сообщение rxstart1 »

Выводите переменную, а уж ее изменяйте программами или функциями, вообще проблемы не вижу
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

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

Сообщение amd9800 »

Либо вы не понимаете о чем я написал и ответили глупость.

Либо я вас не понимаю. Поясните пожалуйста.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

https://github.com/WiseLord/matrixclock ... ter/pins.h
https://github.com/WiseLord/matrixclock ... /max7219.c
Можете посмотреть на мой вариант определений и использования.
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

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

Сообщение amd9800 »

Спасибо за пример - поставил вам плюсик
Именно то что надо
#define MY_PORT B - будет находится в другом файле
и это надо для того чтоб пользователь библиотеки сильно не заморачивался
выбрал букву порта а дальше все расчеты сами какой PIN и DDR

просто пишу библиотеку для управления LCD, а также семисегментным лед по SPI.
на одной шине можно объединить несколько устройств.

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

#define CONCAT(x,y)			x ## y
#define DDR(x)				CONCAT(DDR,x)
#define PORT(x)				CONCAT(PORT,x)
#define PIN(x)				CONCAT(PIN,x)

#define MY_PORT B
#define MY_DDR DDR(MY_PORT)
#define MY_PRT PORT(MY_PORT)

void main(void)
{
MY_PRT=0x0F;
MY_DDR=0xFF;
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

sphincs писал(а):где можно взять библиотеку для работы с LCD на HD44780 через I2C расширитель PCF8574 для CV AVR? желательно с пояснениями по ней
Наткнулся только что на статью, почитайте - http://we.easyelectronics.ru/part/i2c-r ... f8574.html Возможно, поможет.
Аватара пользователя
sphincs
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Вт сен 11, 2012 09:13:52
Откуда: Брест, Беларусь
Контактная информация:

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

Сообщение sphincs »

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

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

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

Совершенно не понятно, для чего нужна какая-то там "библиотека" ? Разберитесь с микросхемой, добейтесь вывода каких-либо данных на её порты. И всё, дальше остаётся дело за малым - управлять LCD-дисплеем, согласно его документации.
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

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

Сообщение amd9800 »

в продолжение...

опять обнаружил ошибку и не могу понять как ее решить

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

#define SS_PIN_UP SS_PORT |=(1<<SS_PIN)
#define SS_PIN_DN SS_PORT &=(~(1<<SS_PIN))
#define SS_STROBE SS_PIN_UP;SS_PIN_DN;
если я в программе использую
SS_PIN_UP;
SS_PIN_DN;

то все работает супер

Если же я использую так
SS_PIN_UP;SS_PIN_DN;
то выдает ошибку - не правильно склеивает он макросы и в итоге выходит PORT вместо например PORTB


Испытал в atmel studio - там все прекрасно

Почему после компиляции показывается что программа занимает 584 байта флэш памяти
А hex файл 1634 байта?
Аватара пользователя
sphincs
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Вт сен 11, 2012 09:13:52
Откуда: Брест, Беларусь
Контактная информация:

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

Сообщение sphincs »

уговорили разобраться с самых низов. действительно интересно, особенно если получается хоть что-нибудь :) управлять PCF8574 по I2C у меня получается. теперь к дисплею. для простоты сначала подключил дисплей напрямую к контроллеру по 8-проводной шине + 3 управляющих сигнала. руководствовался статьей http://easyelectronics.ru/avr-uchebnyj- ... 44780.html. Символ получилось вывести на дисплей. в таблице команд написано, что формат передачи данных - 1ххххххх, где ххххххх - это адрес в DDRAM. но в примере старший бит написан 0 и с нулем действительно выводит, а с 1 нет. почему так происходит?
СпойлерDB7..DB6..DB5..DB4..DB3..DB2..DB1..DB0 Значение
..1...AD...AD....AD....AD....AD....AD...AD Переключить адресацию на DDRAM и задать адрес в DDRAM
АD — адрес в памяти DDRAM
пример
Спойлер00110001 — это мы уже записали данные (ножка RS=1) код «1» 0х31
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Первое - команда, при RS=0 (1xxxxxxx задаёт адрес xxxxxxx), второе - уже данные, при RS=1 (тут можно любое xxxxxxxx писать). В даташите всё есть.
Аватара пользователя
sphincs
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Вт сен 11, 2012 09:13:52
Откуда: Брест, Беларусь
Контактная информация:

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

Сообщение sphincs »

о, именно это я и искал. благодарю.
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

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

Сообщение amd9800 »

имею два варианта кода
в данной функции обрабатывается 2х байтовая переменная (Unsigned int) - расставляются нужные биты по местам
и потом эту переменную надо загрузить в массив из 1 байтовых переменных (Unsigned char)

в первом варианте использовал вариант union
во втором просто провожу переменную через маску чтоб половину битов обнулить и присваиваю к одно-байтовой переменной
а потом делаю смещение в право на 8 бит и опять присваиваю уже к другой переменной из массива

По идее первый вариант должен быть оптимальнее, но в реальности получается что программа с первым вариантом занимает 1178 байт, а со вторым 1156.
Почему так?

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

void spi_led7_convert(unsigned char data, unsigned char pos, unsigned char led_nr) {
  typedef union {
  unsigned int B;
  struct {
  unsigned char B1; //nijnii bait  idet v buffer 1
  unsigned char B0; //verhnii bait idet v buffer 0
  };
  } SEG;
  
  SEG disp;
  char i=0;
  disp.B=INI_DISP;
  
  while(i<8){
  disp.B|=(data&1)<<(SEG_POS[i]);
  data=data>>1;
  i++;
  }
  
  disp.B&=~(1<<SEG_LED_POS[pos]);
  spi_led_buf[0][pos][led_nr]=disp.B1;
  spi_led_buf[1][pos][led_nr]=disp.B0;
}

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

void spi_led7_convert2(unsigned char data, unsigned char pos, unsigned char led_nr) {
  unsigned int disp;
  char i=0;
  disp=INI_DISP;
  
  while(i<8){
  disp|=(data&1)<<(SEG_POS[i]);
  data=data>>1;
  i++;
  }
  
  disp&=~(1<<SEG_LED_POS[pos]);
  spi_led_buf[0][pos][led_nr]=(disp&0x00FF);
  spi_led_buf[1][pos][led_nr]=(disp>>8);
}
Ответить

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