CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Мастер Ломастер »

demiurg301 писал(а):Насколько я знаю: word - это 2 байта, он же int - зачем он нужен?
обычно он нужен для тех платформ, где int не 2 байта, например, PC или ARM. но, правда, в этом случае мои определения так же будут некорректными, придется писать unsigned short int, а еще лучше пользоваться компилятором, поддерживающим стандарт С99, и типом uint16_t
битва с дураками проиграна, победители торжествуют. слава победителям!
ATtiny13
Встал на лапы
Сообщения: 110
Зарегистрирован: Пт окт 21, 2011 15:05:18

Re: CodeVision AVR в вопросах и ответах

Сообщение ATtiny13 »

[quote="Solyara"]Господа приветствую. Начинаю осваивать программирование. На Tiny13 пишу код под ШИМ:
Аватара пользователя
v000va
Мучитель микросхем
Сообщения: 422
Зарегистрирован: Ср дек 26, 2007 18:33:00

Re: CodeVision AVR в вопросах и ответах

Сообщение 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 или кнопки. Где я натупил? :dont_know:
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: CodeVision AVR в вопросах и ответах

Сообщение demiurg301 »

А чо ж вы хотите - getchar - это ЦИКЛ-ожидание - на нём всё и встаёт. Организуйте прерывание по приёму и буффер приёма и будет вам счастье.
Аватара пользователя
v000va
Мучитель микросхем
Сообщения: 422
Зарегистрирован: Ср дек 26, 2007 18:33:00

Re: CodeVision AVR в вопросах и ответах

Сообщение v000va »

А чо ж вы хотите - getchar - это ЦИКЛ-ожидание - на нём всё и встаёт. Организуйте прерывание по приёму и буффер приёма и будет вам счастье.

Таки да, спасибо demiurg301! Иногда со стороны свежим взгядом многое можно увидеть :))
Аватара пользователя
RacerWZ
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс окт 09, 2011 19:32:55

Re: CodeVision AVR в вопросах и ответах

Сообщение 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;
};
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Мастер Ломастер »

вы определитесь окончательно: либо вы используете WinAVR, либо CVAVR, потому как это вещи разного порядка и мешанина из кодов для них работать не будет. CVAVR не сильно озабочен соблюдением стандарта языка Си, поэтому код для WinAVR с большими сложностями портируется на CVAVR. я бы кашу устраивать не советовал.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
RacerWZ
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс окт 09, 2011 19:32:55

Re: CodeVision AVR в вопросах и ответах

Сообщение RacerWZ »

Я использую именно CodeVision AVR.
Просто везде где находил примеры с подобным прерыванием использовался WINAVR и брался interrupt.h.
Я бы не брал его вообще, но ведь ошибка изменилась... или это ничего не значит?
Без использования WINAVR ошибка - declaration syntax error. Везде пишут внимательно проверить все скобки и точки с запятыми, но я уже и проверил и лишние зачем-то тыкал :oops:
Не могу найти ошибку...
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 в вопросах и ответах

Сообщение vitalik_1984 »

RacerWZ запустите мастер проекта выберите во вкладе таймер разрешить прерывание таймера и нажмите сверху кнопку с шестеренкой.компилятор автоматически создаст место,куда можно будет вставить обработчик прерывания
В поисках истины человек развивается.
Аватара пользователя
RacerWZ
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс окт 09, 2011 19:32:55

Re: CodeVision AVR в вопросах и ответах

Сообщение RacerWZ »

Спасибо.
Метод заготовки от программы это не то что мне хотелось, но это работает, а это главное.
Не хотел пользоваться wizardом, но теперь понимаю, что стоит... если что буду из его файлов копировать правильное :))
Всех благодарю.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

Можно нужные фрагменты просто копировать из появившегося предпросмотра для этого просто левее шестеренки кнопочку нажать и будет вам счастье.

PSСкачал тут на днях новую или какую там версию
(от того что делать было нечего и глюк с окошком запуска мастера уже надоел).
Под номером 2.05.5a. Касперский не одобрил такую программу:)
Пришлось долго уговаривать.В итоге программа в списке доверенных заработала...Хотя прошлая версия и так работала.Подозрительно.
В поисках истины человек развивается.
Аватара пользователя
wellcom
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Re: CodeVision AVR в вопросах и ответах

Сообщение wellcom »

Всем привет! В CVAVR кто то подключал строчный LCD по 8-ми битной шине с использованием встроенных библиотек?....или нужно писать свои? Может кто поделиться...... :beer:
портов в мк достаточно, нужна скорость... :lol:
:solder: 32-х ядерный процессор из П213В
yurik7272
Родился
Сообщения: 16
Зарегистрирован: Пт дек 03, 2010 21:29:38

Re: CodeVision AVR в вопросах и ответах

Сообщение yurik7272 »

Здравствуйте, скажите пожалуйста, как запустить CodeVisionAVR под WIN7. Выдаёт ошибку загрузки драйвера ioport.sys, хотя сам файл в system32/drivers присутствует.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение ibiza11 »

wellcom писал(а):Всем привет! В CVAVR кто то подключал строчный LCD по 8-ми битной шине с использованием встроенных библиотек?....или нужно писать свои? Может кто поделиться...... :beer:
портов в мк достаточно, нужна скорость... :lol:
какая скорость нужна?
Ставим плюсы: )
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение ibiza11 »

yurik7272 писал(а):Здравствуйте, скажите пожалуйста, как запустить CodeVisionAVR под WIN7. Выдаёт ошибку загрузки драйвера ioport.sys, хотя сам файл в system32/drivers присутствует.

http://www.hpinfotech.ro/html/cvavr_setup.htm
Ставим плюсы: )
Аватара пользователя
wellcom
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Re: CodeVision AVR в вопросах и ответах

Сообщение wellcom »

ibiza11 писал(а):
wellcom писал(а):Всем привет! В CVAVR кто то подключал строчный LCD по 8-ми битной шине с использованием встроенных библиотек?....или нужно писать свои? Может кто поделиться...... :beer:
портов в мк достаточно, нужна скорость... :lol:
какая скорость нужна?


необходимо как можно быстро принимать данные по УАРТу и выводить (обновлять) их на LCD., при этом не сильно загружая проц мк этим выводом данных на сам LCD. МК Мега 128.
:solder: 32-х ядерный процессор из П213В
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Мастер Ломастер »

wellcom писал(а):необходимо как можно быстро принимать данные по УАРТу и выводить (обновлять) их на LCD., при этом не сильно загружая проц мк этим выводом данных на сам LCD. МК Мега 128.

шлите по УАРТу байты сразу в виде команд вашего ЖКИ, а в программе МК по прерыванию USART тупо выводите эти байты на шину управления ЖКИ - будет сверхбыстро и с минимально возможной нагрузкой на МК.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение 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-х битный. и так и так успеваю.
если мой пост помог, не поленитесь хотя бы спасибо отписать здесь. а то уже разочаровываюсь в начинающих программистах на форумах.
Ставим плюсы: )
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Мастер Ломастер »

ibiza11 писал(а):на переваривание каждой команды LCD необходимо время, так что напрямую из уарта хоть подавай, хоть не подавай макс скорость LCD не превысить
никакими иными средствами нельзя достичь поставленной ТС задачи: одновременно обеспечить максимально достижимую скорость вывода на ЖКИ и при этом минимальную загрузку самого ядра МК. поэтому ваши рассуждения совершенно неуместны, хотя абсолютно неопровержимы - они просто не о том.
битва с дураками проиграна, победители торжествуют. слава победителям!
Ответить

Вернуться в «AVR»