обычно он нужен для тех платформ, где int не 2 байта, например, PC или ARM. но, правда, в этом случае мои определения так же будут некорректными, придется писать unsigned short int, а еще лучше пользоваться компилятором, поддерживающим стандарт С99, и типом uint16_tdemiurg301 писал(а):Насколько я знаю: word - это 2 байта, он же int - зачем он нужен?
CodeVision AVR в вопросах и ответах
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: CodeVision AVR в вопросах и ответах
[quote="Solyara"]Господа приветствую. Начинаю осваивать программирование. На Tiny13 пишу код под ШИМ:
Re: CodeVision AVR в вопросах и ответах
ДЕнь добрый, подскажите плз, запутался в 3-х соснах, есть такой вот код:
Через uart вводим команды управления, а через 2 кнопки управляем ШИМ, т.е. увеличиваем/уменьшаем duty cycle.
Так вот если только опрашиваем кнопки в цикле, то кнопки опрашиваются, все работает. Если добваляем код начиная со стороки ... x=getchar(); switch (x) ... , то кнопки не работают, но работатет getchar и ввод команд через uart. Если код опроса кнопок перенести после цикла с getchar и switch, то опрашиваются кнопки, но ввод через uart не работает, т.е. или работает getchar или кнопки. Где я натупил?
Код: Выделить всё
while (1)
{
if (PINB.0==0){
printf("\rbutton1 \r");
OCR2++;
}
else
if (PINB.1==0){
printf("\rbutton2 \r");
OCR2--;
}
x=getchar();
switch (x)
{
case 'h':
printf("\rStop ADC \r");
ADCSRA = 0;
break;
case 's':
printf("\rRun adjust \r");
adjust();
break;
default:
printf("\rKey = %d \r", x);
printf("\rError2 \r");
break;
};
};Через uart вводим команды управления, а через 2 кнопки управляем ШИМ, т.е. увеличиваем/уменьшаем duty cycle.
Так вот если только опрашиваем кнопки в цикле, то кнопки опрашиваются, все работает. Если добваляем код начиная со стороки ... x=getchar(); switch (x) ... , то кнопки не работают, но работатет getchar и ввод команд через uart. Если код опроса кнопок перенести после цикла с getchar и switch, то опрашиваются кнопки, но ввод через uart не работает, т.е. или работает getchar или кнопки. Где я натупил?

-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: CodeVision AVR в вопросах и ответах
А чо ж вы хотите - getchar - это ЦИКЛ-ожидание - на нём всё и встаёт. Организуйте прерывание по приёму и буффер приёма и будет вам счастье.
Re: CodeVision AVR в вопросах и ответах
А чо ж вы хотите - getchar - это ЦИКЛ-ожидание - на нём всё и встаёт. Организуйте прерывание по приёму и буффер приёма и будет вам счастье.
Таки да, спасибо demiurg301! Иногда со стороны свежим взгядом многое можно увидеть
Re: CodeVision AVR в вопросах и ответах
Добрый вечер, всем котам.
Решил создать генератор различных форм сигналов на AVR. Раньше работал только с PICами на ассемблере, а сейчас хочу на Си. Поставил себе простенькую задачку (предварительно изучив все необходимые материалы). Хочу Меандр на двух ногах с разницей в частоте в 2 раза и чтобы при нажатии кнопки частоты увеличивались в 2 раза.
Люблю разбираться самостоятельно, но упёрся и никак не идёт... Может где-то поступил не оптимально, но мне важно исправить лишь одну ошибку. Проверку состояния кнопки ставил в основной программе, работает, но это ведь не айс, надо бы сделать как прерывание. Вроде бы всё сделал, но CodeVision выдаёт ошибку:
пока я не проинклюдил #include <avr/interrupt.h> от WinAVRa выдавало ошибку:
Чувствую, что где-то мелкое, а найти не могу..
Заранее спасибо.
Весь код:
Решил создать генератор различных форм сигналов на AVR. Раньше работал только с PICами на ассемблере, а сейчас хочу на Си. Поставил себе простенькую задачку (предварительно изучив все необходимые материалы). Хочу Меандр на двух ногах с разницей в частоте в 2 раза и чтобы при нажатии кнопки частоты увеличивались в 2 раза.
Люблю разбираться самостоятельно, но упёрся и никак не идёт... Может где-то поступил не оптимально, но мне важно исправить лишь одну ошибку. Проверку состояния кнопки ставил в основной программе, работает, но это ведь не айс, надо бы сделать как прерывание. Вроде бы всё сделал, но CodeVision выдаёт ошибку:
missing '{'
в строке ISR (TIMER0_OVF_vect){
пока я не проинклюдил #include <avr/interrupt.h> от WinAVRa выдавало ошибку:
declaration syntax error
в строке ISR (TIMER0_OVF_vect){
Чувствую, что где-то мелкое, а найти не могу..
Заранее спасибо.
Весь код:
Код: Выделить всё
/* Программа для генератора меандра разных частот.
Fuse будут разные.. частота 1МГЦ меги и т.д. до 8МГц...
если что - внешний кварц. */
/* инклюдим хидеры контроллера для портов и регистров...*/
//#define F_CPU 1000000UL // Объявляем, что у нас припаян резонатор на 1 МГц. От этой строки зависит
// корректность работы функции _delay_ms. Следует писать в начале файла, до
// #include, так как F_CPU используется в заголовочных файлах
#include <mega8.h>
#include <m8_128.h>
#include <delay.h>
#include <avr/interrupt.h> //Библиотека прерываний
//Программа инициализации таймера 0
void init_timer (void)
{
TIMSK=(1<<TOIE0); //Разрешить прерывания по переполнению таймера 0
TCCR0=(1<<CS00)|(1<<CS01)|(0<<CS02); //Делитель =/64
};
#asm("sei"); // enable interrupts
// Глобальные переменные
unsigned int timer1, timer2, time1 = 100, time2 = 100;
// Reaction_to_button_state_change:
ISR (TIMER0_OVF_vect){
if (PINB.4==0){
delay_ms(30);
if (PINB.4==0){
while (PINB.4==0); //Ждем отжатия клавиши;
{
#asm ("nop")
};
time1=time1/2; //увеличить частоту меандра в 2 раза нажатием кнопки
//+time2;
PORTB.7=~PORTB.7;
};
//delay_ms(100);
};
};
void main(void){
//void initialization(void){
PORTB=0x86; DDRB=0x86; //1000 0110
/* Insert nop for synchronization*/
#asm("nop"); // Пауза в 1 такт процессора
//#asm("sei"); // enable interrupts
START:
PORTB.1 = 0; //обнулил PORTB.1 - включить светодиод
PORTB.2 = 0; //обнулил PORTB.1 - включить светодиод
/*
//Если это не закоментировать, то кнопка работает, но опрос только раз в цыкл. Лучше на прерываниях.
Reaction_to_button_state_change:
if (PINB.4==0){
delay_ms(30);
if (PINB.4==0){
while (PINB.4==0); //Ждем отжатия клавиши;
{
#asm ("nop")
};
time1=time1/2; //увеличить частоту меандра в 2 раза нажатием кнопки
//+time2;
PORTB.7=~PORTB.7;
};
delay_ms(100);
};
*/
Frequency1_1off:
PORTB.1 = 1; // выключить светодиод
delay_ms(time1);//Программа задержки
Frequency1on___2off:
PORTB.2 = 1; // выключить светодиод
PORTB.1 = 0; // включить светодиод
delay_ms(time1);
Frequency1_2off:
PORTB.1 = 1; // выключить светодиод
delay_ms(time1);
Frequency1on___2on:
PORTB.2 = 0; // включить светодиод
PORTB.1 = 0; // включить светодиод
delay_ms(time1);
goto START;
};-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
вы определитесь окончательно: либо вы используете WinAVR, либо CVAVR, потому как это вещи разного порядка и мешанина из кодов для них работать не будет. CVAVR не сильно озабочен соблюдением стандарта языка Си, поэтому код для WinAVR с большими сложностями портируется на CVAVR. я бы кашу устраивать не советовал.
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: CodeVision AVR в вопросах и ответах
Я использую именно CodeVision AVR.
Просто везде где находил примеры с подобным прерыванием использовался WINAVR и брался interrupt.h.
Я бы не брал его вообще, но ведь ошибка изменилась... или это ничего не значит?
Без использования WINAVR ошибка - declaration syntax error. Везде пишут внимательно проверить все скобки и точки с запятыми, но я уже и проверил и лишние зачем-то тыкал
Не могу найти ошибку...
P.S. ну давайте тогда будем рассматривать мой вопрос с закоментированной строкой //#include <avr/interrupt.h>.
Просто везде где находил примеры с подобным прерыванием использовался WINAVR и брался interrupt.h.
Я бы не брал его вообще, но ведь ошибка изменилась... или это ничего не значит?
Без использования WINAVR ошибка - declaration syntax error. Везде пишут внимательно проверить все скобки и точки с запятыми, но я уже и проверил и лишние зачем-то тыкал
Не могу найти ошибку...
P.S. ну давайте тогда будем рассматривать мой вопрос с закоментированной строкой //#include <avr/interrupt.h>.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
в CVAVR обработчики прерываний оформляются не так - сделайте все по cvavr-овски, и тогда будет видно, где собака порылась
битва с дураками проиграна, победители торжествуют. слава победителям!
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
RacerWZ запустите мастер проекта выберите во вкладе таймер разрешить прерывание таймера и нажмите сверху кнопку с шестеренкой.компилятор автоматически создаст место,куда можно будет вставить обработчик прерывания
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
Спасибо.
Метод заготовки от программы это не то что мне хотелось, но это работает, а это главное.
Не хотел пользоваться wizardом, но теперь понимаю, что стоит... если что буду из его файлов копировать правильное
Всех благодарю.
Метод заготовки от программы это не то что мне хотелось, но это работает, а это главное.
Не хотел пользоваться wizardом, но теперь понимаю, что стоит... если что буду из его файлов копировать правильное
Всех благодарю.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Можно нужные фрагменты просто копировать из появившегося предпросмотра для этого просто левее шестеренки кнопочку нажать и будет вам счастье.
PSСкачал тут на днях новую или какую там версию
(от того что делать было нечего и глюк с окошком запуска мастера уже надоел).
Под номером 2.05.5a. Касперский не одобрил такую программу:)
Пришлось долго уговаривать.В итоге программа в списке доверенных заработала...Хотя прошлая версия и так работала.Подозрительно.
PSСкачал тут на днях новую или какую там версию
(от того что делать было нечего и глюк с окошком запуска мастера уже надоел).
Под номером 2.05.5a. Касперский не одобрил такую программу:)
Пришлось долго уговаривать.В итоге программа в списке доверенных заработала...Хотя прошлая версия и так работала.Подозрительно.
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
Всем привет! В CVAVR кто то подключал строчный LCD по 8-ми битной шине с использованием встроенных библиотек?....или нужно писать свои? Может кто поделиться...... 
портов в мк достаточно, нужна скорость...

портов в мк достаточно, нужна скорость...
Re: CodeVision AVR в вопросах и ответах
Здравствуйте, скажите пожалуйста, как запустить CodeVisionAVR под WIN7. Выдаёт ошибку загрузки драйвера ioport.sys, хотя сам файл в system32/drivers присутствует.
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
какая скорость нужна?wellcom писал(а):Всем привет! В CVAVR кто то подключал строчный LCD по 8-ми битной шине с использованием встроенных библиотек?....или нужно писать свои? Может кто поделиться......
портов в мк достаточно, нужна скорость...
Ставим плюсы: )
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
yurik7272 писал(а):Здравствуйте, скажите пожалуйста, как запустить CodeVisionAVR под WIN7. Выдаёт ошибку загрузки драйвера ioport.sys, хотя сам файл в system32/drivers присутствует.
http://www.hpinfotech.ro/html/cvavr_setup.htm
Ставим плюсы: )
Re: CodeVision AVR в вопросах и ответах
ibiza11 писал(а):какая скорость нужна?wellcom писал(а):Всем привет! В CVAVR кто то подключал строчный LCD по 8-ми битной шине с использованием встроенных библиотек?....или нужно писать свои? Может кто поделиться......
портов в мк достаточно, нужна скорость...
необходимо как можно быстро принимать данные по УАРТу и выводить (обновлять) их на LCD., при этом не сильно загружая проц мк этим выводом данных на сам LCD. МК Мега 128.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
wellcom писал(а):необходимо как можно быстро принимать данные по УАРТу и выводить (обновлять) их на LCD., при этом не сильно загружая проц мк этим выводом данных на сам LCD. МК Мега 128.
шлите по УАРТу байты сразу в виде команд вашего ЖКИ, а в программе МК по прерыванию USART тупо выводите эти байты на шину управления ЖКИ - будет сверхбыстро и с минимально возможной нагрузкой на МК.
битва с дураками проиграна, победители торжествуют. слава победителям!
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
на переваривание каждой команды LCD необходимо время, так что напрямую из уарта хоть подавай, хоть не подавай макс скорость LCD не превысить.
Вопрос - для чего нужно с максимальной скоростью выводить данные на LCD? человеческий глаз не воспринимает изменение информации более 24 раз в секунду. несколько изменений данных на LCD (если даже LCD будет успевать) будет сливаться в единую картинку.
обычно я считаю так:
частота обновления LCD = 30 Гц
период обновления LCD = 0,033 с
количество знакомест LCD = 32
количество переходов на другой адрес (при смене строки) = 2 (это с последнего знакоместа первой строки на первое знакоместо второй строки и с последнего знакоместа второй строки на первое знакоместо первой строки)
в сумме 34 команды (32 - вывод символа, 2 - смена адреса)
0,033 / 34 = ~0,001 с
завожу таймер на это время (1 мс) и при каждом прерывании таймера в зависимости от того где находится курсор в данный момент либо вывожу следующий символ, либо меняю адрес.
получается автоматическая задержка после команды и максимальная для человеческого глаза скорость. и тут, как понимаете, не важно какой интерфейс 8-ми или 4-х битный. и так и так успеваю.
если мой пост помог, не поленитесь хотя бы спасибо отписать здесь. а то уже разочаровываюсь в начинающих программистах на форумах.
Вопрос - для чего нужно с максимальной скоростью выводить данные на LCD? человеческий глаз не воспринимает изменение информации более 24 раз в секунду. несколько изменений данных на LCD (если даже LCD будет успевать) будет сливаться в единую картинку.
обычно я считаю так:
частота обновления LCD = 30 Гц
период обновления LCD = 0,033 с
количество знакомест LCD = 32
количество переходов на другой адрес (при смене строки) = 2 (это с последнего знакоместа первой строки на первое знакоместо второй строки и с последнего знакоместа второй строки на первое знакоместо первой строки)
в сумме 34 команды (32 - вывод символа, 2 - смена адреса)
0,033 / 34 = ~0,001 с
завожу таймер на это время (1 мс) и при каждом прерывании таймера в зависимости от того где находится курсор в данный момент либо вывожу следующий символ, либо меняю адрес.
получается автоматическая задержка после команды и максимальная для человеческого глаза скорость. и тут, как понимаете, не важно какой интерфейс 8-ми или 4-х битный. и так и так успеваю.
если мой пост помог, не поленитесь хотя бы спасибо отписать здесь. а то уже разочаровываюсь в начинающих программистах на форумах.
Ставим плюсы: )
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
никакими иными средствами нельзя достичь поставленной ТС задачи: одновременно обеспечить максимально достижимую скорость вывода на ЖКИ и при этом минимальную загрузку самого ядра МК. поэтому ваши рассуждения совершенно неуместны, хотя абсолютно неопровержимы - они просто не о том.ibiza11 писал(а):на переваривание каждой команды LCD необходимо время, так что напрямую из уарта хоть подавай, хоть не подавай макс скорость LCD не превысить
битва с дураками проиграна, победители торжествуют. слава победителям!