CodeVision AVR в вопросах и ответах
- Pink-Pank
- Опытный кот
- Сообщения: 721
- Зарегистрирован: Ср июн 11, 2014 09:43:13
- Откуда: США
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Такое сделать нельзя, поскольку обращение к конкретным битам преобразуется в определенную последовательность команд. Единственное, что можете сделать - оформить все в функцию, которая будет раскидывать ваши данные по нужным ножкам.
Fucking static initialization order fiasco
- Реклама
Re: CodeVision AVR в вопросах и ответах
Ну да. Я думаю и Вы отличитеWiseLord писал(а):Вы на глаз отличаете интервалы меньше 150мс?.
Осциллографом не смотрел, а просто подцепил низкоточный СД напрямую к порту. Оказалось, что программа работает как надо.WiseLord писал(а):Хорошо бы осциллографом на ножке посмотреть
Там оказалась какая-то заморочка с мощным СД. Сначала грешил на полевик, заменил его на биполяр, но при подаче питания появлялась только одна вспышка, после чего СД переставал светиться и МК уходил в ступор. Потом заметил, что если прикоснуться рукой к ноге СД, то вспышки появляются так, как надо.
В итоге, после токоограничивающего резистора СД (1.5 Ом при питании 12В) поставил советский диод Д18 и всё заработало. СД был на 9-11В и 900-1000мА. Почему всё заработало именно так, я и не понял
- levaclaus
- Потрогал лапой паяльник
- Сообщения: 302
- Зарегистрирован: Пн янв 07, 2008 16:56:28
- Откуда: Минск
Re: CodeVision AVR в вопросах и ответах
Вопрос по 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)
Собственно какаята фигня
в 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)
Собственно какаята фигня
Re: CodeVision AVR в вопросах и ответах
Добрый день! Подскажите, есть ли возможность передать номер порта в переменной? Или придется все обыгрывать в if?
void fooo (name_of_port)
{
name_of_port = 1;
}
где name_of_port может быть PORTB.0123 или PORTA.0123
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 в вопросах и ответах
Через указатель и номер бита.
Но, насколько мне известно, в кодевижене это сделать геморойно. В нём указатель на порт можно получить только через ж...
Но, насколько мне известно, в кодевижене это сделать геморойно. В нём указатель на порт можно получить только через ж...
- Реклама
- Pink-Pank
- Опытный кот
- Сообщения: 721
- Зарегистрирован: Ср июн 11, 2014 09:43:13
- Откуда: США
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Попробуйте так:
И передавать так:
Либо можете назначить сами адреса:
Адреса портов в даташите смотрите.
Код: Выделить всё
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
Re: CodeVision AVR в вопросах и ответах
Спасибо за ответ! И еще вопрос!! Как можно с эмитировать нажатие клавиши? Можно ли, когда я передаю байты командой putchar(); передать не байты, а сымитировать нажатие клавиши?
- levaclaus
- Потрогал лапой паяльник
- Сообщения: 302
- Зарегистрирован: Пн янв 07, 2008 16:56:28
- Откуда: Минск
Re: CodeVision AVR в вопросах и ответах
petro2033 писал(а):Спасибо за ответ! И еще вопрос!! Как можно с эмитировать нажатие клавиши? Можно ли, когда я передаю байты командой putchar(); передать не байты, а сымитировать нажатие клавиши?
bit power;
Запусти в нужных местах программы проверку этого бита if power==1; то выполнить то или то. по окончанию power=0;
при нажатии нужной клавиши или принятии нужной команды меняй этот бит на "1"
- levaclaus
- Потрогал лапой паяльник
- Сообщения: 302
- Зарегистрирован: Пн янв 07, 2008 16:56:28
- Откуда: Минск
Re: CodeVision AVR в вопросах и ответах
Как побитно сложить два массива?
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}
};
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 в вопросах и ответах
Очевидно же..
Ну и учесть то, что исходные массивы в flash, в avr-gcc для обращения к переменным во flash используют pgm_read_-функции, как там в Codevision - не знаю.
Код: Выделить всё
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];Re: CodeVision AVR в вопросах и ответах
Здравстуйте.Проблема такая:нужно в цикле while при условии один раз очистить 4 строки дисплея(4-хстрочный на 20 символов). К примеру
условие--нажатая кнопка. Т. е. пока кнопка не нажата,дисплей отображает одно,а когда кнопка нажата,дисплей очищается один раз и отображает другое.У меня получается,что дисплей бесконечно очищается.
условие--нажатая кнопка. Т. е. пока кнопка не нажата,дисплей отображает одно,а когда кнопка нажата,дисплей очищается один раз и отображает другое.У меня получается,что дисплей бесконечно очищается.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Да хотя бы так (сама идея):
Код: Выделить всё
while(1) {
draw_something();
while(button_pressed()) {
clear_display();
while(button_pressed) {
draw_something_other();
}
}
}Re: CodeVision AVR в вопросах и ответах
спасибо,похожим кодом получилось... 
Re: CodeVision AVR в вопросах и ответах
Здравствуйте, подскажите чем отличается sfrb от define ? про sfrb вообще нечего не нашёл.
Началось всё с того что надо было перенести обработчик с первого таймера на третий.
А по коду у меня было разбросаны примерно такие задержки.
Ну я подумал всего-то переименовать TCNT1 на TCNT3 что сложно того?
После того как всё переименовал удивился что он у меня ругается на TCNT3. Открыл файл atmega128.h смотрю и правда нету TCNT3.
Не долга думаю вотку такую штук #define TCNT3 (*(unsigned int *) 0x88)
Попытался протестировать в avr studio долго мучился и не понимал что он там за фигню выдаёт (даже без этой модификации) пришёл к выводу что в студии таймеры можно не тестировать. Запрограммировал это всё в железо LCD заработало а термодатчик нет. Пересчитал все задержки и привёл всё к виду
После этого и термодатчик заработал.
почему #define TCNT3 (*(unsigned int *) 0x88) не подошёл ?
Началось всё с того что надо было перенести обработчик с первого таймера на третий.
А по коду у меня было разбросаны примерно такие задержки.
Код: Выделить всё
TCNT1=(0xFFFF-12000); //1msПосле того как всё переименовал удивился что он у меня ругается на 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 в вопросах и ответах
Если не изменяет память, sfrb, sfrw это специализированные в CodeVision ключевые слова для объявления регистров.
Fucking static initialization order fiasco
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Представить элементы массива как 0bpppp0xxx, где p - номер порта, х - номер бита в порте.Combatos писал(а):организовать вывод данных в разные порты, разные биты посредством массива, типа array[]={PORTD.1, PORTC.0, PORTB.7}
Docendo discimus
Re: CodeVision AVR в вопросах и ответах
здравствуйте. не генерируется 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 в вопросах и ответах
Снимок2.PNG говорит о том, почему не генерируется.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: CodeVision AVR в вопросах и ответах
Всем добрый вечер! Осваиваю по немного ремесло, короче говоря чайник! Столкнулся с такой проблемой. Имеем 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);
}

Подскажите в чем дело то... Заранее благодарен.
Если 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);
}

Подскажите в чем дело то... Заранее благодарен.
Re: CodeVision AVR в вопросах и ответах
Подскажите пожалуйста как правильно извлечь нужный элемент из многомерного массива:
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пасибо.
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пасибо.


