CodeVision AVR в вопросах и ответах
- ssvd
- Нашел транзистор. Понюхал.
- Сообщения: 167
- Зарегистрирован: Ср ноя 04, 2009 18:00:56
- Откуда: Алтайский край
- Контактная информация:
есть вопросы по написанию codevision
привет! несколько дней как начал изучать AVR и язык С, а все потому, что возникла необходимость устройство со следующими функциями:
На дисплей выводятся данные которые надо отредактировать
- Время работы в минутах
- Максимальная температура
- время реверса
Затем запустить основное устройство подав на ногу = 1.
В цикле проверять и отображать температуру, а также ждать флага окончания времени или нажатия кнопки "Стоп".
Появился следующий текст и следующие вопросы, подскажи пожалуйста!
1. Как выставить, что бы таймер переполнялся каждую минуту и запускал прерывание.
2. как лучше в этом тексте убрать дребезг.
Так же буду рад получить критику по алгоритму написания программы!
Спасибо!
На дисплей выводятся данные которые надо отредактировать
- Время работы в минутах
- Максимальная температура
- время реверса
Затем запустить основное устройство подав на ногу = 1.
В цикле проверять и отображать температуру, а также ждать флага окончания времени или нажатия кнопки "Стоп".
Появился следующий текст и следующие вопросы, подскажи пожалуйста!
1. Как выставить, что бы таймер переполнялся каждую минуту и запускал прерывание.
2. как лучше в этом тексте убрать дребезг.
Так же буду рад получить критику по алгоритму написания программы!
Спасибо!
- Вложения
-
- kopt.zip
- вот новая версия ))
- (108.05 КБ) 235 скачиваний
-
- kopt.zip
- (126.69 КБ) 236 скачиваний
Последний раз редактировалось ssvd Чт ноя 05, 2009 07:03:30, всего редактировалось 1 раз.
- sheva_s
- Грызет канифоль
- Сообщения: 256
- Зарегистрирован: Пт апр 27, 2007 14:32:48
- Откуда: Украина Кривой Рог
- Контактная информация:
Подскажите почему так работает
а так выдает ошибку на индетификацию символов ISC00, ISC01, INTF0.
что не так делаю хотел научиться настраивать регистры вторым способом что бы было видно что настроено, а невыходит подскажите как правильно делать .
Код: Выделить всё
MCUCR=0x03;
EIFR=0x40; а так выдает ошибку на индетификацию символов ISC00, ISC01, INTF0.
Код: Выделить всё
MCUCR=1<<ISC00|1<<ISC01;
EIFR=1<<INTF0;что не так делаю хотел научиться настраивать регистры вторым способом что бы было видно что настроено, а невыходит подскажите как правильно делать .
sheva_s писал(а):...
что не так делаю хотел научиться настраивать регистры вторым способом что бы было видно что настроено, а невыходит подскажите как правильно делать .
Все очень просто - у Вас не определены константы - номера битов, поэтому и ошибка. Выход - либо найти заголовочный файл где номера битов определены, либо написать самому (первое проще и правильней).
-
CyxoeBuHo
- Открыл глаза
- Сообщения: 51
- Зарегистрирован: Вс июн 14, 2009 00:19:53
- Контактная информация:
пытался написать код на мегу 16-ю...по коду 7-ми сигментник должен "бегать по кругу" 7 раз и потом высветить определеное число... но в протеусе проэкт не запескается.... подскажите, что не так здесь...
вопрос про случайный выбор цикла остается открытым...
Код: Выделить всё
#include <mega16>
#include <delay>
#define PA_OUT DDRA = 0xFF
#define PB_IN DDRB = 0x00
#define PC_OUT DDRC = 0xFF
#define LED_ON PORTA.7=1
#define LED_OFF PORTA.7=0
#define SW_ON PINB.0==0
#define SW_OFF PINB.0==1
void initialization(void){
PA_OUT;
PB_IN;
PC_OUT;
}
void main(void){
unsigned char a;
initialization();
a=0;
while(SW_ON)
{
if (a<7)
{
a++;
LED_ON;
delay_ms(200);
LED_OFF;
delay_ms(800);
}
}
}
вопрос про случайный выбор цикла остается открытым...
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
И снова здравствуйте
И снова бинарная арифметика
Уже подумываю на курсы какие записаться...ато чёт слишком часто торможу в этом вопросе....
в общем....переделываю функцию для LCD3310 вывод символа...
старая работает 100% правильно...
хочу увеличить символ в два раза по высоте(тоесть на две строки) ну а в ширину - хочу выбирать сколько надо раз одно и то же повторять...
тоесть вместо того чтоб в экран слать 8-ми битный столбик 6 раз (символ у меня 8 точек в высоту и 6 - в длину) я "растягиваю" 8 бит на 16 просто дублируя биты...и два раза вывожу...сначала первый рядок потом переход вниз на строку и снова второй байт....вооот....
получается лажа в пропадании одной строчки....не могу даже определить какой...толи нижнего бита верхней строки толи верхнего бита нижней строки....ну...в общем буквы слова и т.д. получаются с пропущенной полоской по середине...хотя вроде все биты заполнил...
+чтоб небыло сомнений - ещё я рисую экраны графикой из КОМпорта....так вот оттуда пропусков небывает...тоесть функция записи в экран точно работает....
БЛ....снова какой-то косяк с кодом....млин....прикрепляю файлик
И снова бинарная арифметика
Уже подумываю на курсы какие записаться...ато чёт слишком часто торможу в этом вопросе....
в общем....переделываю функцию для LCD3310 вывод символа...
старая работает 100% правильно...
хочу увеличить символ в два раза по высоте(тоесть на две строки) ну а в ширину - хочу выбирать сколько надо раз одно и то же повторять...
тоесть вместо того чтоб в экран слать 8-ми битный столбик 6 раз (символ у меня 8 точек в высоту и 6 - в длину) я "растягиваю" 8 бит на 16 просто дублируя биты...и два раза вывожу...сначала первый рядок потом переход вниз на строку и снова второй байт....вооот....
получается лажа в пропадании одной строчки....не могу даже определить какой...толи нижнего бита верхней строки толи верхнего бита нижней строки....ну...в общем буквы слова и т.д. получаются с пропущенной полоской по середине...хотя вроде все биты заполнил...
+чтоб небыло сомнений - ещё я рисую экраны графикой из КОМпорта....так вот оттуда пропусков небывает...тоесть функция записи в экран точно работает....
Код: Выделить всё
void lcd_putcharDS(unsigned char character)
{
int tablept;
unsigned char count, W;
//unsigned char tablept, count;
//123 символ означает что рисовать следующий символ будем инверсно
if(character==123)
InvPrint=!InvPrint;
else
{
lcd_gotoxy(LCD_x, LCD_y);
if ((character<0x20>150)) {return;}
tablept = ((6*character) - 192);
// первый проход по таблице
for (count=6;count>0;count--)
{
//char_column = table[tablept];
for(W=0;W<Width;W++)
{
writedata( 0b00000001&table[tablept] |
(0b00000001&table[tablept])<<1 |
(0b00000010&table[tablept])<<1 |
(0b00000010&table[tablept])<<2 |
(0b00000100&table[tablept])<<2 |
(0b00000100&table[tablept])<<3 |
(0b00001000&table[tablept])<<3 |
(0b00001000&table[tablept])<<4>0;count--)
{
//char_column = table[tablept];
for(W=0;W<Width>>4 |
(0b00010000&table[tablept])>>3 |
(0b00100000&table[tablept])>>3 |
(0b00100000&table[tablept])>>2 |
(0b01000000&table[tablept])>>2 |
(0b01000000&table[tablept])>>1 |
(0b10000000&table[tablept])>>1 |
(0b10000000&table[tablept]));
}
tablept++;
}
LCD_x+=5*(1+Width);
LCD_y-=1;
//writedata(0x00);
}
}
БЛ....снова какой-то косяк с кодом....млин....прикрепляю файлик
- Вложения
-
- lcd_3110.c
- (10.51 КБ) 399 скачиваний
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
Мож чего я пропустил, но мне кажется если опишешь по подробней, что куда подключаешь, общий катод анод, и что хочешь сделать, а лучше файлик протеуса прикрепишь, то шансов получить ответ, будет больше.CyxoeBuHo писал(а):пытался написать код на мегу 16-ю...по коду 7-ми сигментник должен "бегать по кругу" 7 раз и потом высветить определеное число... но в протеусе проэкт не запескается.... подскажите, что не так здесь...
Re: есть вопросы по написанию codevision
Тут даже не в кодевижене дело. То, что сразу бросается в глаза. 1) в обработчиках прерываний надо сидеть как можно меньше. Не сдедует в них использовать задержки (функцию delay). Не надо там же заниматься выводом на LCD индикатор. Там надо только устанавливать флаги, а прочие дела делать в теле основной программы. 2) бесконечные циклы с использованием оператора for и выход из них с помощью goto это, конечно круто. Но лучше обойтись без них. Для проверки какого-то условия обычно используются операторы while или do 3) Часть кода, где выполняется ввод/вывод лучше оформить в виде функций, чтобы не загромождать основную программу.ssvd писал(а):...буду рад получить критику по алгоритму написания программы!...
А зачем это вообще делать через прерывание? Лучше в основной программе отмерять промежуток времени, и когда он закончится, выполнять нужные действияssvd писал(а):1. Как выставить, что бы таймер переполнялся каждую минуту и запускал прерывание...
Лучше написать отдельный кусок кода, который бы опрашивал кнопки и устранял дребезг. И оформить его в виде функции.ssvd писал(а):2. как лучше в этом тексте убрать дребезг...
Я бы на Вашем месте сделал бы из таймера часы реального времени. Использовал бы режим CTC так, чтобы прерывания происходили через определённый промежуток времени. Скажем, через 1 миллисекунду. А потом уже можно с помошью счётчиков получать любые интервалы времени.
У Вас вообще, какая тактовая частота микроконтроллера? Используете кварц или встроенный генератор?
sheva_s писал(а):А можно подробнее как это сделать.
У Вас какая версия CodeVisionAVR ? В старых версиях нет определения названий битов управляющих регистров. А в новых есть файлы что-то вроде xxxx-bit.h Где xxxx - название микроконтроллера. Вот такой файл и надо прицепить к своему проекту. Можно скачать свежую демо версию CodeVisionAVR и попробовать взять эти файлы оттуда.
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
edds писал(а):Доброго времени суток!!!! Необходимы примеры кода (для CVAVR, рабочие) меню (выбор и установка режимов, значений), если будет с коментариями, тада ваще супер. Если есть у кого поделитесь ???
Код: Выделить всё
[color=red]Объёмные вещи оформляются в виде приложения. Сэр Мурр[/color]
Вот пожалуйста кусочек кода менюшки со вложенными подменюшками
- Вложения
-
- prog.c
- полный текст ибо код неправильно вставляется на форум
- (81.15 КБ) 493 скачивания
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
Здравствуйте! Не могу понять, почему когда у меня должно получится число -2 , но в итоге HD44780 показывает 65534. Сделал вот так 65536 - 65534, но опять же,получается,что знак sprintf-ом дорисовывать надо.
Непонятки, почему я отрицательное число не могу вывеcти?
Непонятки, почему я отрицательное число не могу вывеcти?
Код: Выделить всё
char temp_str[33];
void main(void)
{
int temp;
w1_init();
lcd_init(16);
while (1)
{
temp=ds18b20_temperature(0);
if (temp>1000){
temp=65536-temp;
}
sprintf(temp_str,"t=%i.%u\xdfC",temp,temp%1);
lcd_clear();
lcd_puts(temp_str);
delay_ms(500);
};
}
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
а вот видео (~5M), как работает мой вариант "менюшки"clawham писал(а):Вот пожалуйста кусочек кода менюшки со вложенными подменюшками
исходники доступны
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
под кнопкой WWW есть ссылка на новость про TUI - а там есть и ссылка на закачку исходников и прочего.Aiudara писал(а):Ссылочку на исходнички !Работает прикольно. И проект в PROTEUS хочется поиграться.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
