Неужели не лень было это всё писать ?
CodeVision AVR в вопросах и ответах
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
я тренируюсь
чем больше пишешь небольших программ тем потом быстрее начинаешь соображать вроде как
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
for (a=0; a<2; a++) \\выполним цикл два раза для каждого значения массива kod
{if (b==kod[a]) \\сравниваю переменную b со значением массива kod[элемент массива] если верно то перейду к
\\выполнению действия
{goto m1;
}
else \\если неверно то прибавлю к переменной c +1 (переменную с пришлось ввести по ходу написания кода, в
\\зависимости чему равно с (0 или 1) будет выполнятся два разных кода)
{с=с++;}
Код: Выделить всё
for (a=0; a<2; a++) {
if(b==kod[a]) break;
}
// Теперь в "a" хранится порядковый номер в массиве
// Если "a" равна 2 - совпадений не найдено
И это правильно. Но поиском быстрее ответ найдёте, чем тут писать и ждать пока ответятmixon46 писал(а):я тренируюсь чем больше пишешь небольших программ тем потом быстрее начинаешь соображать вроде как
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
for (a=0; a<2; a++) {
if(b==kod[a]) break;
}
// Теперь в "a" хранится порядковый номер в массиве
// Если "a" равна 2 - совпадений не найдено
вот про это я не знал. тоже хотел спросить как сделать проще. если а равно 2 то что он выйдет из этого сравнения. ее же потом нужно будет обнулить. тут полный бурелом. так вот если не один код не верный то продолжить нужно будет выполнять тот код который выполнялся до этого. этот весь код получения и сравнения будет работать от внешнего прерывания. то есть нужно потом заново разрешать глобальное прерывание. да на счет этого еще нужно подумать и переварить как следует
есть такая идея
while (1)
{delay (); \\задержка 1 мсек
for (a=0; a<16; a++) \\цикл для записи 16 бит
{b=PIND&0x01; \\переменная b равна логический операции "И" между портом PIND и константой 0x01
b=b<<1; \\сдвиг содержимого переменной на 1 бит к старшему биту
delay1 (); \\задержка 2 мсек
}
и того прием двух байт или же 16 бит будет равен 16*2 мсек, 32 мсек. или же 1 треть секунды. довольно быстро. о блин не подумал. косяк есть получается. когда будет записан второй раз то первый будет перезаписан. бит исчезнет
а что если так
b=b&(PIND&0x01); \\ сначала происходит побитовое и между выводами порта и константой. константа определяет именно младший бит порта. а потом делается побитовое между этой переменной и тем что получилось. а затем сдвиг. тогда по идее бит не должен будет пропасть в неизвестности.
if(b==kod[a]) break;
}
// Теперь в "a" хранится порядковый номер в массиве
// Если "a" равна 2 - совпадений не найдено
вот про это я не знал. тоже хотел спросить как сделать проще. если а равно 2 то что он выйдет из этого сравнения. ее же потом нужно будет обнулить. тут полный бурелом. так вот если не один код не верный то продолжить нужно будет выполнять тот код который выполнялся до этого. этот весь код получения и сравнения будет работать от внешнего прерывания. то есть нужно потом заново разрешать глобальное прерывание. да на счет этого еще нужно подумать и переварить как следует
есть такая идея
while (1)
{delay (); \\задержка 1 мсек
for (a=0; a<16; a++) \\цикл для записи 16 бит
{b=PIND&0x01; \\переменная b равна логический операции "И" между портом PIND и константой 0x01
b=b<<1; \\сдвиг содержимого переменной на 1 бит к старшему биту
delay1 (); \\задержка 2 мсек
}
и того прием двух байт или же 16 бит будет равен 16*2 мсек, 32 мсек. или же 1 треть секунды. довольно быстро. о блин не подумал. косяк есть получается. когда будет записан второй раз то первый будет перезаписан. бит исчезнет
а что если так
b=b&(PIND&0x01); \\ сначала происходит побитовое и между выводами порта и константой. константа определяет именно младший бит порта. а потом делается побитовое между этой переменной и тем что получилось. а затем сдвиг. тогда по идее бит не должен будет пропасть в неизвестности.
- paskal
- Нашел транзистор. Понюхал.
- Сообщения: 160
- Зарегистрирован: Пн сен 05, 2011 10:03:06
- Откуда: Тула
Re: CodeVision AVR в вопросах и ответах
Привет! С CodeVision не работал, поэтому вопрос чайницкий.
Поддерживает ли CodeVision стандарт С++?
Поддерживает ли CodeVision стандарт С++?
Если бы на станции "Мир" стояли Винды, она бы еще висела и висела...
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Да он и C как-то не очень поддерживает. Так, свой какой-то диалект, похожий на C, реализует.
Лучше уж avr-gcc пользовать.
Лучше уж avr-gcc пользовать.
- paskal
- Нашел транзистор. Понюхал.
- Сообщения: 160
- Зарегистрирован: Пн сен 05, 2011 10:03:06
- Откуда: Тула
Re: CodeVision AVR в вопросах и ответах
WiseLord писал(а):Так, свой какой-то диалект, похожий на C, реализует.
А стандартная библиотека Си там присутствует?
WiseLord писал(а):Лучше уж avr-gcc пользовать.
Это WinAvr что ли?
Если бы на станции "Мир" стояли Винды, она бы еще висела и висела...
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Не обязательно Winavr, avr-gcc кроссплатформенный. Вроде как он и в AVR Studio, или как там оно называется, тоже используется.
По поводу стандартных библиотек - лучше их не использовать. Стоит один printf оттуда использовать, или что-то ещё - и уже 2..3 килобайта flash-памяти занято. Оно, может, и удобно, но слишком жирно.
А так - да, они вроде как и в CVAVR тоже есть.
По поводу стандартных библиотек - лучше их не использовать. Стоит один printf оттуда использовать, или что-то ещё - и уже 2..3 килобайта flash-памяти занято. Оно, может, и удобно, но слишком жирно.
А так - да, они вроде как и в CVAVR тоже есть.
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
Спойлер
#include <mega8.h>#include <delay.h>
char SEGMENT[ ] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
volatile unsigned char segcounter = 0;
volatile int display1 = 0;
// Обработчик прерывания по переполнению таймера2
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
PORTC = 0xFF; //гасим все разряды
PORTD = (1 << segcounter); //выбираем следующий разряд
switch (segcounter)
{
case 0:
PORTC = ~(SEGMENT[display1 % 10000 / 1000]); // здесь раскладываем число на разряды
break;
case 1:
PORTC = ~(SEGMENT[display1 % 1000 / 100]);
break;
case 2:
PORTC = ~(SEGMENT[display1 % 100 / 10]);
break;
case 3:
PORTC = ~(SEGMENT[display1 % 10]);
break;
}
if ((segcounter++) > 2) segcounter = 0;
}
/***Главная функция***/
void main (void)
{
DDRC=0xFF;
DDRD=0xFF;
PORTC = 0x00;
PORTD = 0x00;
TIMSK=0x04; // разрешение прерывания по таймеру1
TCCR1B=0x02; //предделитель на 8
while(1)
{ #asm 'sei'; //глобально разрешаем прерывания
#endasm;
display1++; // увеличиваем счет от 0000 до 9999
delay_ms(100); // задержка
};
}
расскажите мне пожалуйста в чем моя ошибка. не получается динамическая индикация. что то накосячил где то
то есть по переполнению таймера когда он достигнет счета в 16384 и перескочит на 0 то должна по прерыванию выполнится команда вывода на экран из 4 семисигментов то число которое насчитала главная функция. перед таймером стоит предделитель на 8. тоесть поступает частота 500 кгц. если поделить 500к на 16384 это составит 30 раз в сек переполнится таймер? значит частота вызова функции будет 30 раз в сек? это как то маловато. надо более высокую частоту. скажем 150 гц. ну да ладно!
но у меня ничего не вышло. может не правильно прерывания настроил?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Так счётчик будет считать от 0 до 2, а у Вас, судя по коду (case 3:), есть 4-ый индикатор.Код: Выделить всё
if ((segcounter++) > 2) segcounter = 0;
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
да 4 индикатора есть. в протеусе нет никаких изменений на PC и на PD. может он не может такое смодулировать?
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
А зачем Вы эти дико тяжёлые деления двухбайтных чисел в прерывании делаете? Почему бы не считать это в основном коде, а в прерывании выводить уже результаты?
Потом, нет необходимости включать прерывания в цикле while(). Один раз включите и достаточно.
Да и зачем использовать все эти "волшебные числа"? Вроде char SEGMENT[ ] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};? Можно же нормально описать, что за что отвечает. Потом же проще будет переназначить на другие ножки. Можете посмотреть, как у меня в простеньком термометре вывод на индикатор сделан (файлы segm.c/segm.h).
Потом, нет необходимости включать прерывания в цикле while(). Один раз включите и достаточно.
Да и зачем использовать все эти "волшебные числа"? Вроде char SEGMENT[ ] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};? Можно же нормально описать, что за что отвечает. Потом же проще будет переназначить на другие ножки. Можете посмотреть, как у меня в простеньком термометре вывод на индикатор сделан (файлы segm.c/segm.h).
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
я новичек. так что я не знаю как лучше сделать. тем более я немного переделал программу с интернета. зачем массив? в нем каждая цифра же описана. так сказать библиотека цифр нет? 
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Понятно, что массив с "изображениями" цифр нужен. Только вот эти 0x3F, 0x06, 0x5B, 0x4F ни о чём не говорят. Непонятно, где тут семгент A, а где десятичная точка.
Такой код с непонятными, взятыми с потолка числами нечитабален, и найти в нём ошибку сложно и самому, а тем более кому-то со стороны.
Такой код с непонятными, взятыми с потолка числами нечитабален, и найти в нём ошибку сложно и самому, а тем более кому-то со стороны.
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
я не понимаю как вы предлагаете переделать эту библиотеку? усложнить её? записать каждый сигмент? а программа вывода тоже наверно усложнится? там же ничего сложного нету, каждая цифра от 0 до 9 идут по очереди. что бы вывести нужную цифру в порт нужно присвоить нужный элемент массива к порту В. а десятичной точки я тут не предусматривал
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
По моей ссылке видно, как это можно сделать.
Потом, Вы для вывода пишете в порты C и D, присваивая им какие-то значения в зависимости от текущего разряда. При этом, сами сказали, в одном порту Вам нужны лишь 7 бит (по числу сегментов), а в другом - лишь 4 бита (по числу разрядов). Но пишете Вы порт целиком, задевая неиспользуемые биты и лишая себя возможности использовать их для прочих целей.
1. Откуда 16384? Timer1 ведь 16-битный, а не 14-битный.
2. Зачем для банальной индикации брать 16-битный таймер, самый "дорогой" в МК? Простенького Timer0 хватит за глаза и частота динамической индикации будет выше намного.
При Ваших установках частота индикации будет 4МГц/8/65536 = 7Гц всего лишь.
Далее, для вывода на сегменты Вы зачем-то выбрали самый неудачный порт - порт C, у которого у ATmega8 всего 6 бит выведено (не считая RESET), а для четырёх разрядов задействовали полноценный порт D. Почему не наоборот?
В остальном прочем программа вполне рабочая. Проверил в Proteus (переделав код для avr-gcc) - на индикатор с общим анодом всё выводится нормально, разве что только цифры меняются очень редко (7Гц, Карл!).
А вот как НУЖНО делать. Код не забивает прерывание тяжёлыми вычислениями, компактнее (404 байта) по размеру, по нему сразу видно, как подключен индикатор, и разводку сегментов (в пределах порта) можно легко менять как угодно (что бывает очень полезно при разработке печатной платы), лишь поменяв пару цифр в определениях сегментов:
Потом, Вы для вывода пишете в порты C и D, присваивая им какие-то значения в зависимости от текущего разряда. При этом, сами сказали, в одном порту Вам нужны лишь 7 бит (по числу сегментов), а в другом - лишь 4 бита (по числу разрядов). Но пишете Вы порт целиком, задевая неиспользуемые биты и лишая себя возможности использовать их для прочих целей.
Эти расчёты вообще непонятны:то есть по переполнению таймера когда он достигнет счета в 16384 и перескочит на 0 то должна по прерыванию выполнится команда вывода на экран из 4 семисигментов то число которое насчитала главная функция. перед таймером стоит предделитель на 8. тоесть поступает частота 500 кгц. если поделить 500к на 16384 это составит 30 раз в сек переполнится таймер? значит частота вызова функции будет 30 раз в сек? это как то маловато. надо более высокую частоту. скажем 150 гц. ну да ладно!
1. Откуда 16384? Timer1 ведь 16-битный, а не 14-битный.
2. Зачем для банальной индикации брать 16-битный таймер, самый "дорогой" в МК? Простенького Timer0 хватит за глаза и частота динамической индикации будет выше намного.
При Ваших установках частота индикации будет 4МГц/8/65536 = 7Гц всего лишь.
Далее, для вывода на сегменты Вы зачем-то выбрали самый неудачный порт - порт C, у которого у ATmega8 всего 6 бит выведено (не считая RESET), а для четырёх разрядов задействовали полноценный порт D. Почему не наоборот?
В остальном прочем программа вполне рабочая. Проверил в Proteus (переделав код для avr-gcc) - на индикатор с общим анодом всё выводится нормально, разве что только цифры меняются очень редко (7Гц, Карл!).
Спойлер
Код: Выделить всё
//#include <mega8.h> // Codevision
//#include <delay.h> // Codevision
#include <avr/io.h> // avr-gcc
#include <util/delay.h> // avr-gcc
#include <avr/interrupt.h> //avr-gcc
char SEGMENT[ ] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
volatile unsigned char segcounter = 0;
volatile int display1 = 0;
// Обработчик прерывания по переполнению таймера2
//interrupt [TIM1_OVF] void timer1_ovf_isr(void) // Codevision
ISR (TIMER1_OVF_vect) // avr-gcc
{
PORTC = 0xFF; //гасим все разряды
PORTD = (1 << segcounter); //выбираем следующий разряд
switch (segcounter)
{
case 0:
PORTC = ~(SEGMENT[display1 % 10000 / 1000]); // здесь раскладываем число на разряды
break;
case 1:
PORTC = ~(SEGMENT[display1 % 1000 / 100]);
break;
case 2:
PORTC = ~(SEGMENT[display1 % 100 / 10]);
break;
case 3:
PORTC = ~(SEGMENT[display1 % 10]);
break;
}
if ((segcounter++) > 2)
segcounter = 0;
}
/***Главная функция***/
int main (void)
{
DDRC=0xFF;
DDRD=0xFF;
PORTC = 0x00;
PORTD = 0x00;
TIMSK=0x04; // разрешение прерывания по таймеру1
TCCR1B=0x02; //предделитель на 8
//#asm 'sei'; // глобально разрешаем прерывания, Codevision
//#endasm; // Codevision
sei(); // avr-gcc
while(1)
{
display1++; // увеличиваем счет от 0000 до 9999
// delay_ms(100); // задержка Codevision
_delay_ms(100); // задержка avr-gcc
};
return 0;
}
А вот как НУЖНО делать. Код не забивает прерывание тяжёлыми вычислениями, компактнее (404 байта) по размеру, по нему сразу видно, как подключен индикатор, и разводку сегментов (в пределах порта) можно легко менять как угодно (что бывает очень полезно при разработке печатной платы), лишь поменяв пару цифр в определениях сегментов:
Спойлер
Код: Выделить всё
//#include <mega8.h> // Codevision
//#include <delay.h> // Codevision
#include <avr/io.h> // avr-gcc
#include <util/delay.h> // avr-gcc
#include <avr/interrupt.h> //avr-gcc
// Определяем разводку по порту сегментов
#define SEG_DDR DDRD
#define SEG_PORT PORTD
#define SEG_A (1<<7)
#define SEG_B (1<<6)
#define SEG_C (1<<5)
#define SEG_D (1<<4)
#define SEG_E (1<<3)
#define SEG_F (1<<2)
#define SEG_G (1<<1)
#define SEG_DP (1<<0)
#define SEG_ALL (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G | SEG_DP)
// Аналогично для разрядов
#define DIG_DDR DDRC
#define DIG_PORT PORTC
#define DIG_0 (1<<0)
#define DIG_1 (1<<1)
#define DIG_2 (1<<2)
#define DIG_3 (1<<3)
#define DIG_ALL (DIG_0 | DIG_1 | DIG_2 | DIG_3)
// "Рисунки" цифр:
#define CH_0 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)
#define CH_1 (SEG_B | SEG_C)
#define CH_2 (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G)
#define CH_3 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G)
#define CH_4 (SEG_B | SEG_C | SEG_F | SEG_G)
#define CH_5 (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G)
#define CH_6 (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define CH_7 (SEG_A | SEG_B | SEG_C)
#define CH_8 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define CH_9 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)
char segm[] = {CH_0, CH_1, CH_2, CH_3, CH_4, CH_5, CH_6, CH_7, CH_8, CH_9};
char dig[4]; // Здесь будет храниться готовое для вывода число
volatile unsigned char segcounter = 0;
volatile int display1 = 0;
// Обработчик прерывания по переполнению таймера2
//interrupt [TIM0_OVF] void timer0_ovf_isr(void) // Codevision
ISR (TIMER0_OVF_vect) // avr-gcc
{
SEG_PORT |= SEG_ALL; // гасим все сегменты единицей
DIG_PORT &= ~DIG_ALL; // гасим все разряды нулём
DIG_PORT |= (1<<segcounter); // Зажигаем единицей (анод) нужный разряд
SEG_PORT = ~dig[segcounter]; // Зажигаем нужную цифру
if ((++segcounter) >= 4)
segcounter = 0;
}
void showNumber(int value)
{
unsigned char i;
for (i = 0; i < 4; i++) {
dig[i] = segm[value % 10];
value /= 10;
}
// Старая реализация расчётов гораздо сложнее и затратнее по ресурсам
// dig[3] = ~(segm[display1 % 10000 / 1000]);
// dig[2] = ~(segm[display1 % 1000 / 100]);
// dig[1] = ~(segm[display1 % 100 / 10]);
// dig[0] = ~(segm[display1 % 10]);
}
int main (void)
{
SEG_DDR |= SEG_ALL; // Сегменты переводим на выход
DIG_DDR |= DIG_ALL; // Разряды переводим на выход
// Здесь эти 0x01 и 0x02 лучше тоже заменить чем-то вроде TIMSK |= (1<<TOIE0),
// должен же и Codevision такое понимать
TIMSK = 0x01; // разрешение прерывания по таймеру1
TCCR0 = 0x02; // предделитель на 8
//#asm 'sei'; // глобально разрешаем прерывания, Codevision
//#endasm; // Codevision, нужно ли вообще?
sei(); // avr-gcc
while(1)
{
showNumber(display1);
display1++; // увеличиваем счет от 0000 до 9999
// delay_ms(100); // задержка Codevision
_delay_ms(100); // задержка avr-gcc
};
return 0;
}
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
code vision ругается на int main (void) мол главная функция не должна ничего возвращать. а так посмотрел. я не пользуюсь define не знаю почему. интересно конечно но я бы до такого не додумался. нет во мне творческой жилки))
если использовать 8 бит таймер не слишком ли много 2 кгц для динамической индикации. 4мгц \ 8 \ 256 = 1953 гц. это слишком. не будет же видно свечения сегментов.
в принципе мне в этой программе можно использовать и 16 битный таймер. частоту индикации нужно сделать где то 150 гц. я пересчитал с делителями и не выходит. нужно использовать прерывание по совпадению. я так думаю
я убрал int main (void) и убрал return 0 так как на них ругается компилятор. поставил void main (void) но у меня ничего не работает. скачать что ли winavr. они же не сильно отличаются я так понял
если использовать 8 бит таймер не слишком ли много 2 кгц для динамической индикации. 4мгц \ 8 \ 256 = 1953 гц. это слишком. не будет же видно свечения сегментов.
в принципе мне в этой программе можно использовать и 16 битный таймер. частоту индикации нужно сделать где то 150 гц. я пересчитал с делителями и не выходит. нужно использовать прерывание по совпадению. я так думаю
я убрал int main (void) и убрал return 0 так как на них ругается компилятор. поставил void main (void) но у меня ничего не работает. скачать что ли winavr. они же не сильно отличаются я так понял
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Функция main всегда должна возвращать целое число. А что там думают по этому поводу разработчики поделки по имени Codevision - это на их совести.mixon46 писал(а):code vision ругается на int main (void) мол главная функция не должна ничего возвращать
2кГц для динамической индикации это замечательно. Я бы и ещё добавил. И это всяко лучше 7Гц. Пожалуйте 16-бит таймер, он для более важных вещей нужен.
Ок, main() вы под CV переделали, а всё прочее? То, что я для Codevision оставил закомментированным? Раскомментируйте, а то, что под avr-gcc, наоборот, закомментируйте.
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
WiseLord писал(а):mixon46 писал(а):
Ок, main() вы под CV переделали, а всё прочее? То, что я для Codevision оставил закомментированным? Раскомментируйте, а то, что под avr-gcc, наоборот, закомментируйте.
да я переделал как у вас под codevision только не получается скомпилировать. int main (void) не дает это сделать
как вы компилируете в winavr. скачал я эту среду и в общем то еще не разобрался
азазаза
#asm
sei;
#endasm
теперь работает. только цифры выводятся неправильно. нужно пересмотреть код. не одна не верна
о теперь разобрался. ссори)) 7 бит это сегмент А. теперь понятно все)
а эта запись в скобках showNumber(display1);
говорит о чем? я запутался. то что счет будет прибавлен даже если вызвано прерывание? хотя такое быть не может. а может то что она возвращает то самое значение когда было до прерывания? я наверно понял. было допустим 125 после прерывания и выхода из функции прерывания это число будет возвращено в ту главную функцию что бы продолжить счет дальше? тогда все понятно
а тут что в скобках?
showNumber(int value)
int value это что
- Дима_Медвед
- Открыл глаза
- Сообщения: 73
- Зарегистрирован: Сб авг 23, 2014 21:49:24
Re: CodeVision AVR в вопросах и ответах
Всем привет! Есть вопрос: как запустить симулятор в CVAVR??
При попытку запуска с AVR studio 4.19 пишет, что не может открыть студию, а с версией 6.1+ ничего не происходит.
Что делать?
При попытку запуска с AVR studio 4.19 пишет, что не может открыть студию, а с версией 6.1+ ничего не происходит.
Что делать?