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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

Если вопрос озвученный ТС прозвучал для Вас именно так и не вызвал никаких подозрений по поводу его корректности, то пожалуй это лишь Ваше мнение и меня прошу не впутывать в это. Я задал уточняющий вопрос ТС и хотел бы получить именно его коментарий по этому поводу, в том числе и по поводу уместности моих рассуждений.
Ставим плюсы: )
Аватара пользователя
v000va
Мучитель микросхем
Сообщения: 422
Зарегистрирован: Ср дек 26, 2007 18:33:00

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

Сообщение v000va »

День добрый, подскажите плз, в чем косяк, в трех соснах запутался :shock:
Есть АЦП, с шумоподавлением, если запускаем преобразование вызывая ф-цию read_adc(0) - выдает значение напряжения с выводом в UART как положено. А вот если используем getchar, то по нажатию клавишы "а" вместо результата выдает какую-то чепуху а не значения напряжения.
Т.е. сам по себе кусок программы

Код: Выделить всё

        x=read_adc(0);
        PORTB=x;   
        adc_data_dec = (ADCL|ADCH<<8);
        i = adc_data_dec*2.56; // пересчет значения 12-тибитной величины
        printf("\rResult = %d \r", x);
        delay_ms(200);   


работает, а в цикле с getchar и case нет. :( Цикл с getchar и case сам по себе тоже чудесно работает.

Код: Выделить всё

while (1)
      { 
        y=getchar();   

        switch (y)
        {
        case 'a': printf("\rCase1 \r");
        //delay_ms(80);
        x=read_adc(0);
        PORTB=x;
        adc_data_dec = (ADCL|ADCH<<8);
        i = adc_data_dec*2.56; // пересчет значения 12-тибитной величины
        printf("\rResult = %d \r", i);       
        break;
               
        case 'b': printf("\rCase2 \r");

         
        break;                         

        default: printf("\rError \r");
        break; 
           
        };
      };
}


А если делаю задержку в 80мС после printf("\rCase1 \r"), то по нажатию "а" выводит как положено.

Код: Выделить всё

while (1)
      { 
        y=getchar();   

        switch (y)
        {
        case 'a': printf("\rCase1 \r");
        delay_ms(80);
        x=read_adc(0);
        PORTB=x;
        adc_data_dec = (ADCL|ADCH<<8);
        i = adc_data_dec*2.56; // пересчет значения 12-тибитной величины
        printf("\rResult = %d \r", i);       
        break;
               
        case 'b': printf("\rCase2 \r");

         
        break;                         

        default: printf("\rError \r");
        break; 
           
        };
      };
}


Почему без задержки не работает?
Последний раз редактировалось v000va Сб фев 04, 2012 01:27:42, всего редактировалось 1 раз.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

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

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

Сообщение v000va »

demiurg301 писал(а):А накой вам и прерывание и getchar в одном флаконе. Вы уж определитесь :))

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

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

Сообщение vitalik_1984 »

vOOOva,я не понял,а зачем вы вызываете функцию,а потом делаете то же самое,что в этой функции только что сделали?
В поисках истины человек развивается.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

можна ли при открытии чужого проэкта открыть вот эти закладки, чтобы посмотреть какие настройки автор делал при создании проэкта ?
Вложения
5676777777777777777.jpg
(54.31 КБ) 367 скачиваний
Tell Me The Truth
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

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

Сообщение Барсик »

Смысла нет. Поскольку это не настройки проекта, а программа-мастер, которая автоматически создаёт текст программы на C, на основании того, какие галки и где в этом мастере расставил...

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

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

Сообщение vitalik_1984 »

можна ли при открытии чужого проэкта открыть вот эти закладки

нет нельзя,но можно внимательно почитать комментарии к коду,если автор этим пользовался и не стер их.генератор кода создает подробные комментарии о настройке портов и другой перифериий
В поисках истины человек развивается.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

а как узнать напремер насколько в проге выставлен регистр совпадения ?
Tell Me The Truth
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Читать документ про ваш камень.Вообще ищем OCR1A/B

The Timer/Counter (TCNT1), Output Compare Registers (OCR1A/B), and Input Capture Regis-
ter (ICR1) are all 16-bit registers. Special procedures must be followed when accessing the 16-
bit registers. These procedures are described in the section “Accessing 16-bit Registers” on
page 79. The Timer/Counter Control Registers (TCCR1A/B) are 8-bit registers and have no CPU
access restrictions. Interrupt requests (abbreviated to Int.Req. in the figure) signals are all visible
in the Timer Interrupt Flag Register (TIFR). All interrupts are individually masked with the Timer
Interrupt Mask Register (TIMSK). TIFR and TIMSK are not shown in the figure since these regis-
ters are shared by other timer units.
В поисках истины человек развивается.
Аватара пользователя
v000va
Мучитель микросхем
Сообщения: 422
Зарегистрирован: Ср дек 26, 2007 18:33:00

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

Сообщение v000va »

vitalik_1984 писал(а):vOOOva,я не понял,а зачем вы вызываете функцию,а потом делаете то же самое,что в этой функции только что сделали?

Я что-то туплю, ткните меня, в чем прикол?
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Ой,простите не так посмотрел.

А что делает ваша функция read_adc(0)?
читает состояние ноги 0?
и зачем вы присваиваете значение функции порту?
В поисках истины человек развивается.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

v000va писал(а):В смысле?


Зачем вам и прерывание по приёму байта и getchar? Это чо за изврат?


А если делаю задержку в 80мС после printf("\rCase1 \r"), то по нажатию "а" выводит как положено.


А скорость порта какая? Вы там случаем для АЦП "noice cancel" не включили?
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

demiurg301 писал(а):Зачем вам и прерывание по приёму байта и getchar? Это чо за изврат?

чего то я не увидел где тут прерывание по приему байта...
demiurg301 писал(а):А скорость порта какая? Вы там случаем для АЦП "noice cancel" не включили?

Так ведь пауза то у него стоит внутри switch (y), то есть уже после приема байта сюда попадаем.

А про get_char действительно лишнее каждый раз этой функцией пользоваться.
В поисках истины человек развивается.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

vitalik_1984 писал(а):чего то я не увидел где тут прерывание по приему байта...

Там сверху писал, что у него прерывание по RX - потом отредактировал - а я не посмотрел.

vitalik_1984 писал(а):Так ведь пауза то у него стоит внутри switch (y), то есть уже после приема байта сюда попадаем.

А про get_char действительно лишнее каждый раз этой функцией пользоваться.


Там вообще не понятно "чего НЕ ТАК "
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

demiurg301 писал(а):Там вообще не понятно "чего НЕ ТАК "

да тут всё не так !
Разберем смысл представленного алгоритма

Код: Выделить всё

        x=read_adc(0);// прочитали функцией read_adc,присвоили значение переменной х
        PORTB=x;// ЗАЧЕМ ТО присвоили ПОРТУ значение переменной х   
        adc_data_dec = (ADCL|ADCH<<8);// считываем в переменную adc_data_dec данные регистров АЦП
        //А нельзя было просто adc_data использовать, которую CVAVR уже для этого применения создал?!!
       
         i = adc_data_dec*2.56; // (пересчет значения 12-тибитной величины)  зачем? все равно не используем
        printf("\rResult = %d \r", x); //выводим результат ПЕРЕМЕННОЙ Х!!!! зачем??
        delay_ms(200); //ну тут понятно

это первый кусок

Предлагаю эту кашу заменить на другой код

Код: Выделить всё

        adc_data=read_adc(0);
        adc_data*=2.56;
        printf("\rResult = %d \r", adc_data);


А в цикле с char уже другая история.

Код: Выделить всё

printf("\rResult = %d \r", i); //выводим результат преременной i!

Зачем тогда сначала считали в переменную х?

vitalik_1984 писал(а):vOOOva,я не понял,а зачем вы вызываете функцию,а потом делаете то же самое,что в этой функции только что сделали?

Получается правильно спросил
Для справки

Код: Выделить всё

unsigned int read_adc(unsigned char adc_input)
{
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    // Start the AD conversion
    ADCSRA|=0x40;
    // Wait for the AD conversion to complete
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCW;
}

то есть функция read_adc уже делает то, что вы пытаетесь своим

Код: Выделить всё

adc_data_dec = (ADCL|ADCH<<8);
сделать

По гет_чар могу предложить использовать прерывание,а за ним делать уже чтение и вывод на дисплей.

v000va,Скажите что вы пытаетесь вообще сделать своим чтением через нажатие клавиши?
Что должен делать прибор в то время, когда ничего не приходит?
В поисках истины человек развивается.
Аватара пользователя
totty
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Ср авг 03, 2011 22:26:02
Откуда: Севастополь

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

Сообщение totty »

Подскажите пожалуйста, имеется мк tiny2313, в нем 2 таймера, один 8 бит, второй 16.
что требуется:
16-битный работает как источник тактового сигнала для 8-битного таймера с возможностью регулировки частоты, т е частота в очень широком пределе будет меняться програмно, так вот, как мне подключить его к 8-битному?
это можно както сделать програмно или нужно вывести наружу и подать на какуюто ногу? если да то на какую?

заранее спасибо
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

В прерывании от timer1 записать ++TCNT0.
Docendo discimus
Аватара пользователя
totty
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Ср авг 03, 2011 22:26:02
Откуда: Севастополь

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

Сообщение totty »

pyzhman писал(а):В прерывании от timer1 записать ++TCNT0.


понял, а источником тактового сигнала на таймера 0 что выставить? 000 - нет тактовой частоты или 111 - неинвертир сигнал с внешней ноги (Т0 или Т1)
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Оставить заглушенным, т.е. 000. Не забыть разрешить прерывание по переполнению.
Вообще говоря, что за изврат? Для чего? Если событие по условиям, формируемым в таймере1, то там и обрабатывать. Или флажок взвести.
Docendo discimus
Ответить

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