Страница 180 из 421

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

Добавлено: Пт фев 03, 2012 21:08:08
ibiza11
Если вопрос озвученный ТС прозвучал для Вас именно так и не вызвал никаких подозрений по поводу его корректности, то пожалуй это лишь Ваше мнение и меня прошу не впутывать в это. Я задал уточняющий вопрос ТС и хотел бы получить именно его коментарий по этому поводу, в том числе и по поводу уместности моих рассуждений.

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

Добавлено: Сб фев 04, 2012 01:10:08
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;  
            
        }; 
      };
}
Почему без задержки не работает?

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

Добавлено: Сб фев 04, 2012 01:20:30
demiurg301
А накой вам и прерывание и getchar в одном флаконе. Вы уж определитесь :))

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

Добавлено: Сб фев 04, 2012 01:29:31
v000va
demiurg301 писал(а):А накой вам и прерывание и getchar в одном флаконе. Вы уж определитесь :))
В смысле?

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

Добавлено: Сб фев 04, 2012 06:40:58
vitalik_1984
vOOOva,я не понял,а зачем вы вызываете функцию,а потом делаете то же самое,что в этой функции только что сделали?

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

Добавлено: Сб фев 04, 2012 14:37:38
FreshMan
можна ли при открытии чужого проэкта открыть вот эти закладки, чтобы посмотреть какие настройки автор делал при создании проэкта ?

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

Добавлено: Сб фев 04, 2012 17:21:47
Барсик
Смысла нет. Поскольку это не настройки проекта, а программа-мастер, которая автоматически создаёт текст программы на C, на основании того, какие галки и где в этом мастере расставил...

Настройки проекта в другом месте.

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

Добавлено: Сб фев 04, 2012 17:26:08
vitalik_1984
можна ли при открытии чужого проэкта открыть вот эти закладки
нет нельзя,но можно внимательно почитать комментарии к коду,если автор этим пользовался и не стер их.генератор кода создает подробные комментарии о настройке портов и другой перифериий

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

Добавлено: Сб фев 04, 2012 18:54:31
FreshMan
а как узнать напремер насколько в проге выставлен регистр совпадения ?

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

Добавлено: Сб фев 04, 2012 19:08:25
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.

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

Добавлено: Сб фев 04, 2012 21:09:31
v000va
vitalik_1984 писал(а):vOOOva,я не понял,а зачем вы вызываете функцию,а потом делаете то же самое,что в этой функции только что сделали?
Я что-то туплю, ткните меня, в чем прикол?

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

Добавлено: Сб фев 04, 2012 22:30:23
vitalik_1984
Ой,простите не так посмотрел.

А что делает ваша функция read_adc(0)?
читает состояние ноги 0?
и зачем вы присваиваете значение функции порту?

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

Добавлено: Сб фев 04, 2012 22:40:23
demiurg301
v000va писал(а): В смысле?
Зачем вам и прерывание по приёму байта и getchar? Это чо за изврат?

А если делаю задержку в 80мС после printf("\rCase1 \r"), то по нажатию "а" выводит как положено.
А скорость порта какая? Вы там случаем для АЦП "noice cancel" не включили?

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

Добавлено: Вс фев 05, 2012 00:06:49
vitalik_1984
demiurg301 писал(а):Зачем вам и прерывание по приёму байта и getchar? Это чо за изврат?
чего то я не увидел где тут прерывание по приему байта...
demiurg301 писал(а): А скорость порта какая? Вы там случаем для АЦП "noice cancel" не включили?
Так ведь пауза то у него стоит внутри switch (y), то есть уже после приема байта сюда попадаем.

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

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

Добавлено: Вс фев 05, 2012 00:29:20
demiurg301
vitalik_1984 писал(а): чего то я не увидел где тут прерывание по приему байта...
Там сверху писал, что у него прерывание по RX - потом отредактировал - а я не посмотрел.
vitalik_1984 писал(а): Так ведь пауза то у него стоит внутри switch (y), то есть уже после приема байта сюда попадаем.

А про get_char действительно лишнее каждый раз этой функцией пользоваться.
Там вообще не понятно "чего НЕ ТАК "

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

Добавлено: Вс фев 05, 2012 13:17:20
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,Скажите что вы пытаетесь вообще сделать своим чтением через нажатие клавиши?
Что должен делать прибор в то время, когда ничего не приходит?

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

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

заранее спасибо

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

Добавлено: Пн фев 13, 2012 09:35:36
pyzhman
В прерывании от timer1 записать ++TCNT0.

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

Добавлено: Пн фев 13, 2012 14:07:19
totty
pyzhman писал(а):В прерывании от timer1 записать ++TCNT0.
понял, а источником тактового сигнала на таймера 0 что выставить? 000 - нет тактовой частоты или 111 - неинвертир сигнал с внешней ноги (Т0 или Т1)

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

Добавлено: Пн фев 13, 2012 15:23:12
pyzhman
Оставить заглушенным, т.е. 000. Не забыть разрешить прерывание по переполнению.
Вообще говоря, что за изврат? Для чего? Если событие по условиям, формируемым в таймере1, то там и обрабатывать. Или флажок взвести.