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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

Сообщение Pink-Pank »

Такое сделать нельзя, поскольку обращение к конкретным битам преобразуется в определенную последовательность команд. Единственное, что можете сделать - оформить все в функцию, которая будет раскидывать ваши данные по нужным ножкам.
Fucking static initialization order fiasco
Реклама
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

WiseLord писал(а):Вы на глаз отличаете интервалы меньше 150мс?.
Ну да. Я думаю и Вы отличите :) .
WiseLord писал(а):Хорошо бы осциллографом на ножке посмотреть
Осциллографом не смотрел, а просто подцепил низкоточный СД напрямую к порту. Оказалось, что программа работает как надо.
Там оказалась какая-то заморочка с мощным СД. Сначала грешил на полевик, заменил его на биполяр, но при подаче питания появлялась только одна вспышка, после чего СД переставал светиться и МК уходил в ступор. Потом заметил, что если прикоснуться рукой к ноге СД, то вспышки появляются так, как надо.
В итоге, после токоограничивающего резистора СД (1.5 Ом при питании 12В) поставил советский диод Д18 и всё заработало. СД был на 9-11В и 900-1000мА. Почему всё заработало именно так, я и не понял :) .
Реклама
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

Вопрос по uart. Нужно принять с компа сообщение и вывести на hd44870/ Сгенерировал начальный код,
в char rx_buffer[RX_BUFFER_SIZE]; складывается принятое. RX_BUFFER_SIZE по умолчанию 8. Если я посылаю с компа сообщение типа radiokot, в каком виде оно будет болтаться в rx_buffer ? Я так понимаю - под каждый символ своя ячейка.
Второй момент, предположив, что в первой ячейке символ, делаю так
lcd_gotoxy(15,1);
sprintf(lcd_buffer,"%c",rx_buffer[0]);
lcd_puts(lcd_buffer);
и посылаю любой символ с компа - на экране рисует "у", не зависимо от посланного символа.
Если сделать "%s" - на экране вообще ничего не рисует.
если предположить что там код символа и сделать "%u" то на экране рисует число 121 (что внезапно оказалось кодом символа "y" в знакогенераторе hd44870)
Собственно какаята фигня
petro2033
Открыл глаза
Сообщения: 75
Зарегистрирован: Сб ноя 23, 2013 11:54:35

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

Сообщение petro2033 »

Добрый день! Подскажите, есть ли возможность передать номер порта в переменной? Или придется все обыгрывать в if?
void fooo (name_of_port)
{
name_of_port = 1;
}

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

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

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

Через указатель и номер бита.
Но, насколько мне известно, в кодевижене это сделать геморойно. В нём указатель на порт можно получить только через ж...
Реклама
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

Сообщение Pink-Pank »

Попробуйте так:

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

void fooo (char * adress_port, char bit)
{*adress_port |= 1 << bit; };
И передавать так:

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

fooo (&PORTA, 2);
Либо можете назначить сами адреса:

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

#define PortA_ptr (char * (0x19))
fooo (Porta_ptr, 2);
Адреса портов в даташите смотрите.
Fucking static initialization order fiasco
Реклама
petro2033
Открыл глаза
Сообщения: 75
Зарегистрирован: Сб ноя 23, 2013 11:54:35

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

Сообщение petro2033 »

Спасибо за ответ! И еще вопрос!! Как можно с эмитировать нажатие клавиши? Можно ли, когда я передаю байты командой putchar(); передать не байты, а сымитировать нажатие клавиши?
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

petro2033 писал(а):Спасибо за ответ! И еще вопрос!! Как можно с эмитировать нажатие клавиши? Можно ли, когда я передаю байты командой putchar(); передать не байты, а сымитировать нажатие клавиши?

bit power;

Запусти в нужных местах программы проверку этого бита if power==1; то выполнить то или то. по окончанию power=0;

при нажатии нужной клавиши или принятии нужной команды меняй этот бит на "1"
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

Как побитно сложить два массива?

flash byte digits12[8][10]={
{0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
};

flash byte digits21[8][10]={
{0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00}
};
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Очевидно же..

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

byte i, j, result[8][10];
for (i = 0; i < 8; i++)
  for (j = 0; j < 10; j++)
    result[i][j] = digits12[i][j] | digits21[i][i];
Ну и учесть то, что исходные массивы в flash, в avr-gcc для обращения к переменным во flash используют pgm_read_-функции, как там в Codevision - не знаю.
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

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

Сообщение eduardo »

Здравстуйте.Проблема такая:нужно в цикле while при условии один раз очистить 4 строки дисплея(4-хстрочный на 20 символов). К примеру
условие--нажатая кнопка. Т. е. пока кнопка не нажата,дисплей отображает одно,а когда кнопка нажата,дисплей очищается один раз и отображает другое.У меня получается,что дисплей бесконечно очищается.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Да хотя бы так (сама идея):

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

while(1) {
	draw_something();
	while(button_pressed()) {
		clear_display();
		while(button_pressed) {
			draw_something_other();
		}
	}
}
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

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

Сообщение eduardo »

спасибо,похожим кодом получилось... :))
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Здравствуйте, подскажите чем отличается sfrb от define ? про sfrb вообще нечего не нашёл.

Началось всё с того что надо было перенести обработчик с первого таймера на третий.
А по коду у меня было разбросаны примерно такие задержки.

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

TCNT1=(0xFFFF-12000); //1ms
Ну я подумал всего-то переименовать TCNT1 на TCNT3 что сложно того?
После того как всё переименовал удивился что он у меня ругается на TCNT3. Открыл файл atmega128.h смотрю и правда нету TCNT3.
Не долга думаю вотку такую штук #define TCNT3 (*(unsigned int *) 0x88)
Попытался протестировать в avr studio долго мучился и не понимал что он там за фигню выдаёт (даже без этой модификации) пришёл к выводу что в студии таймеры можно не тестировать. Запрограммировал это всё в железо LCD заработало а термодатчик нет. Пересчитал все задержки и привёл всё к виду

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

TCNT3H=0xD1; //1ms
TCNT3L=0x1F;
После этого и термодатчик заработал.
почему #define TCNT3 (*(unsigned int *) 0x88) не подошёл ?

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

sfrb TCNT1L=0x2c;
sfrb TCNT1H=0x2d;
sfrw TCNT1=0x2c;  // 16 bit access

#define OCR3AH (*(unsigned char *) 0x87)
#define TCNT3L (*(unsigned char *) 0x88)
#define TCNT3H (*(unsigned char *) 0x89)
#define TCCR3B (*(unsigned char *) 0x8a)
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

Сообщение Pink-Pank »

Если не изменяет память, sfrb, sfrw это специализированные в CodeVision ключевые слова для объявления регистров.
Fucking static initialization order fiasco
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Combatos писал(а):организовать вывод данных в разные порты, разные биты посредством массива, типа array[]={PORTD.1, PORTC.0, PORTB.7}
Представить элементы массива как 0bpppp0xxx, где p - номер порта, х - номер бита в порте.
Docendo discimus
asd81
Прорезались зубы
Сообщения: 247
Зарегистрирован: Вс ноя 06, 2011 16:59:31

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

Сообщение asd81 »

здравствуйте. не генерируется hex файл. версия 3.17, которая в свободном доступе. пробовал 2.05 которая тоже до 4 кило, то же самое.
Вложения
Снимок2.PNG
(9.38 КБ) 204 скачивания
Снимок1.PNG
(23.08 КБ) 315 скачиваний
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Снимок2.PNG говорит о том, почему не генерируется.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
RoTToR
Открыл глаза
Сообщения: 73
Зарегистрирован: Вс июн 07, 2009 23:16:16
Контактная информация:

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

Сообщение RoTToR »

Всем добрый вечер! Осваиваю по немного ремесло, короче говоря чайник! Столкнулся с такой проблемой. Имеем 4 сдвиговых регистра 74НС595 соединенных последовательно, итого 32 бита. Нужно в эти 4 регистра заталкивать некую переменную unsigned long int led;

Если led = 1231231233; или led = 1 << 29; то все работает замечательно. Но стоит только сдвигать единичку в led на некую переменную Х, то биты старше 16-го не выводятся, и выскакивает предупреждение при компиляции.

unsigned char X=29;

led = 1 << X;

hc595(led);

void hc595(unsigned long int tmp)
{
unsigned char i;
for(i=0;i<32;i++)
{
if(tmp&0x80000000) PORTD|=1<<DATA;
else PORTD&=~(1<<DATA);
tmp= tmp<<1;
PORTD|=1<<CLK;
PORTD&=~(1<<CLK);
}
PORTD|=1<<STROBE;
PORTD&=~(1<<STROBE);
}
Изображение

Подскажите в чем дело то... Заранее благодарен.
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

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

Сообщение eduardo »

Подскажите пожалуйста как правильно извлечь нужный элемент из многомерного массива: :dont_know:

unsigned char dni[8][2]={{0xA8,0x48},{0x42,0x54},{0x43,0x50},{0xAB,0x54},{0xA8,0x54},{0x43,0xA0},{0x42,0x43}};

Этот массив содержит символы дней недели для вывода на LCD{ПН,ВТ,СР,ЧТ,ПТ,СБ,ВС}

Пишу lcd_puts(dni[2]);// Выводит все элементы начиная со 2-го

lcd_puts(dni[4]);// Выводит все элементы начиная с 4-го

Cпасибо.
Ответить

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