Страница 179 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 30, 2012 14:53:42
Мастер Ломастер
demiurg301 писал(а):Насколько я знаю: word - это 2 байта, он же int - зачем он нужен?
обычно он нужен для тех платформ, где int не 2 байта, например, PC или ARM. но, правда, в этом случае мои определения так же будут некорректными, придется писать unsigned short int, а еще лучше пользоваться компилятором, поддерживающим стандарт С99, и типом uint16_t
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 30, 2012 20:48:32
ATtiny13
[quote="Solyara"]Господа приветствую. Начинаю осваивать программирование. На Tiny13 пишу код под ШИМ:
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 30, 2012 23:03:07
v000va
ДЕнь добрый, подскажите плз, запутался в 3-х соснах, есть такой вот код:
Код: Выделить всё
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 или кнопки. Где я натупил?

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 30, 2012 23:27:45
demiurg301
А чо ж вы хотите - getchar - это ЦИКЛ-ожидание - на нём всё и встаёт. Организуйте прерывание по приёму и буффер приёма и будет вам счастье.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт янв 31, 2012 00:41:00
v000va
А чо ж вы хотите - getchar - это ЦИКЛ-ожидание - на нём всё и встаёт. Организуйте прерывание по приёму и буффер приёма и будет вам счастье.
Таки да, спасибо
demiurg301! Иногда со стороны свежим взгядом многое можно увидеть

Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 01, 2012 00:19:14
RacerWZ
Добрый вечер, всем котам.
Решил создать генератор различных форм сигналов на 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;
};
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 01, 2012 06:56:32
Мастер Ломастер
вы определитесь окончательно: либо вы используете WinAVR, либо CVAVR, потому как это вещи разного порядка и мешанина из кодов для них работать не будет. CVAVR не сильно озабочен соблюдением стандарта языка Си, поэтому код для WinAVR с большими сложностями портируется на CVAVR. я бы кашу устраивать не советовал.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 01, 2012 11:22:45
RacerWZ
Я использую именно CodeVision AVR.
Просто везде где находил примеры с подобным прерыванием использовался WINAVR и брался interrupt.h.
Я бы не брал его вообще, но ведь ошибка изменилась... или это ничего не значит?
Без использования WINAVR ошибка -
declaration syntax error. Везде пишут внимательно проверить все скобки и точки с запятыми, но я уже и проверил и лишние зачем-то тыкал
Не могу найти ошибку...
P.S. ну давайте тогда будем рассматривать мой вопрос с закоментированной строкой //#include <avr/interrupt.h>.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 01, 2012 11:28:02
Мастер Ломастер
в CVAVR обработчики прерываний оформляются не так - сделайте все по cvavr-овски, и тогда будет видно, где собака порылась
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 01, 2012 12:45:22
vitalik_1984
RacerWZ запустите мастер проекта выберите во вкладе таймер разрешить прерывание таймера и нажмите сверху кнопку с шестеренкой.компилятор автоматически создаст место,куда можно будет вставить обработчик прерывания
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 01, 2012 20:01:14
RacerWZ
Спасибо.
Метод заготовки от программы это не то что мне хотелось, но это работает, а это главное.
Не хотел пользоваться wizardом, но теперь понимаю, что стоит... если что буду из его файлов копировать правильное
Всех благодарю.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 01, 2012 22:13:41
vitalik_1984
Можно нужные фрагменты просто копировать из появившегося предпросмотра для этого просто левее шестеренки кнопочку нажать и будет вам счастье.
PSСкачал тут на днях новую или какую там версию
(от того что делать было нечего и глюк с окошком запуска мастера уже надоел).
Под номером 2.05.5a. Касперский не одобрил такую программу:)
Пришлось долго уговаривать.В итоге программа в списке доверенных заработала...Хотя прошлая версия и так работала.Подозрительно.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 02, 2012 12:49:10
wellcom
Всем привет! В CVAVR кто то подключал строчный LCD по 8-ми битной шине с использованием встроенных библиотек?....или нужно писать свои? Может кто поделиться......

портов в мк достаточно, нужна скорость...

Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 02, 2012 13:07:10
yurik7272
Здравствуйте, скажите пожалуйста, как запустить CodeVisionAVR под WIN7. Выдаёт ошибку загрузки драйвера ioport.sys, хотя сам файл в system32/drivers присутствует.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 02, 2012 13:56:18
ibiza11
wellcom писал(а):Всем привет! В CVAVR кто то подключал строчный LCD по 8-ми битной шине с использованием встроенных библиотек?....или нужно писать свои? Может кто поделиться......

портов в мк достаточно, нужна скорость...

какая скорость нужна?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 02, 2012 13:57:57
ibiza11
yurik7272 писал(а):Здравствуйте, скажите пожалуйста, как запустить CodeVisionAVR под WIN7. Выдаёт ошибку загрузки драйвера ioport.sys, хотя сам файл в system32/drivers присутствует.
http://www.hpinfotech.ro/html/cvavr_setup.htm
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 02, 2012 16:43:44
wellcom
ibiza11 писал(а):wellcom писал(а):Всем привет! В CVAVR кто то подключал строчный LCD по 8-ми битной шине с использованием встроенных библиотек?....или нужно писать свои? Может кто поделиться......

портов в мк достаточно, нужна скорость...

какая скорость нужна?
необходимо как можно быстро принимать данные по УАРТу и выводить (обновлять) их на LCD., при этом не сильно загружая проц мк этим выводом данных на сам LCD. МК Мега 128.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт фев 03, 2012 12:10:15
Мастер Ломастер
wellcom писал(а):необходимо как можно быстро принимать данные по УАРТу и выводить (обновлять) их на LCD., при этом не сильно загружая проц мк этим выводом данных на сам LCD. МК Мега 128.
шлите по УАРТу байты сразу в виде команд вашего ЖКИ, а в программе МК по прерыванию USART тупо выводите эти байты на шину управления ЖКИ - будет сверхбыстро и с минимально возможной нагрузкой на МК.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт фев 03, 2012 13:24:49
ibiza11
на переваривание каждой команды 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-х битный. и так и так успеваю.
если мой пост помог, не поленитесь хотя бы спасибо отписать здесь. а то уже разочаровываюсь в начинающих программистах на форумах.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт фев 03, 2012 18:48:33
Мастер Ломастер
ibiza11 писал(а):на переваривание каждой команды LCD необходимо время, так что напрямую из уарта хоть подавай, хоть не подавай макс скорость LCD не превысить
никакими иными средствами нельзя достичь поставленной ТС задачи: одновременно обеспечить максимально достижимую скорость вывода на ЖКИ и при этом минимальную загрузку самого ядра МК. поэтому ваши рассуждения совершенно неуместны, хотя абсолютно неопровержимы - они просто не о том.