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

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

Добавлено: Пт апр 21, 2017 15:09:03
jeka79
Аlex писал(а):Такую фигню :
даже самый глупый компилятор должен вырезать не глядя.
я для примера написал, что с bit результат при компиляции меньше, при чем при объявлении переменных в bit код не растет совсем.

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

Добавлено: Вт апр 25, 2017 21:19:56
mixon46
всем привет. написал я такой код но не идет обнуление переменной se. (переменная se глобальная)

interrupt [TIM1_COMPA] void sec (void) //вызов прерывания по совпадению счетного таймера
{
se++;
if (se==43199)
{se=0;};
if (PIND.6==0)
{delay_ms (10);
se=se+600;
};
PORTB.0=~PORTB.0;
}


не правильно что ли?

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

Добавлено: Вт апр 25, 2017 21:25:06
ARV
когда уже начинающие научатся приводить свой код целиком, чтобы не приходилось задавать наводящие вопросы? вопрос риторический отвечать не надо. и я не буду отвечать на ваш вопрос.

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

Добавлено: Вт апр 25, 2017 21:27:42
mixon46
не хочу полностью. будете смотреть мой бред. и выговаривать потом :))
что я не правильно сделал. точку с запятой не правильно поставил?

вот и занимайся программированием. пока сам не сделаешь фиг кто подскажет

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

Добавлено: Вт апр 25, 2017 22:42:53
Jack_A
ARV, не такой уж он начинающий...
Я для МК на Си не пишу, но в глаза бросается: в одном месте se инкрементируется, в другом - увеличивается на 600, а поскольку проверка строго на равенство, то может перескочить это значение и дальше крутиться до посинения. И se, надеюсь, объявлена не однобайтовой переменной ? Еще сишники говорят - volatile помогает в подобном случае, им виднее.
Чем мог...

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

Добавлено: Ср апр 26, 2017 06:32:15
WiseLord
mixon46: Проделайте простые вычисления - с какой частотой вызывается таймер, далее, каков интервал времени между двумя прерываниями и, наконец, влезает ли 10мс задержка в этот интервал.

Это я к тому, что задержки в прерывании недопустимы вообще.

Ну и да, тип se неизвестен. Возможно, 43199 вообще невозможное значение.

P.S. И я упорно не понимаю желание людей писать код без форматирования. Словно сочинение какое-то. Ведь так нереально ошибки искать, когда даже логика кода глазами не видна. Когда, всего лишь добавление нескольких отступов делают всё гораздо читабельнее и понятнее.

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

interrupt [TIM1_COMPA] void sec(void)
{
    se++;
    if (se == 43199)
        se = 0;
    if (PIND.6 == 0) {
        delay_ms (10);
        se = se + 600;
    }
    PORTB.0 = ~PORTB.0;
}

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

Добавлено: Ср апр 26, 2017 10:24:46
mixon46
Jack_A вы несомненно правы. Я прибавлял значение по 600 и поэтому произошел перескок. Дело было не в том почему переменная не обнулилась. Она бы обнулилась если бы значение было ровно 42199 но я же его перескочил. И соответственно это и привело к непоняткам. Я знаю что делать дальше. Спасибо ))

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

Добавлено: Ср апр 26, 2017 10:26:42
Jack_A
Ну дык оно ж ... :)


---------------------------------------
Ставим плюсы :shock:

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

Добавлено: Ср апр 26, 2017 11:57:46
mixon46
я бы поставил + только почему то не ставится. глюк какой что ли

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

Добавлено: Чт май 04, 2017 17:24:58
barsik_32rus
Ребят хелп,укажите на ошибку пожалуйста. Если даже в пустой программе включить Ацп и прерывания то начинает на постоянку работать порт B0,в чем проблема?
Спойлер#include <mega328p.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x40
unsigned char buttonclick=0;
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}


// Функция прерывания
interrupt [EXT_INT0] void ext_int0_isr(void)
{
buttonclick++;
}















void main(void)
{


// Настройка частоты
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

//АЦП
DIDR0=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x83;

// Конфигурация входов/выходов

PORTB=0x00;
DDRB=0x07;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0xE0;


// Инициализация прерывания
EICRA=0x00;
EIMSK=0x01;
EIFR=0x01;
PCICR=0x00;

#asm("sei")


while (1)
{
}
}

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

Добавлено: Чт май 04, 2017 21:49:03
mixon46
скажите. вот у меня есть переменная. она равна 0. но при каждом прерывании если есть на ножке порта положительное напряжение прибавляется по 1. мне нужно сделать так что бы в другую переменную в зависимости от числа в той переменной к которой прибавляется единица прибавлялось разное число. так например если

от 1 до 5 то прибавим 1
от 6 до 10 то прибавим 5
от 11 до 15 то прибавим 10

задача получается примерно такой


unsigned int a=0;
unsigned int b=0;


interrupt [_____] void sec (void)
{if (PORTB.0==0)
{a++;}
else
{a=0;};


if (a>=1&&a<=5) \\если а в диапазоне от 1 до 5 то прибавим к b 1
{b=b+1;}
if (a>=6&&a<=10)
{b=b+5;}
if (a>=11&&a<=15)
{b=b+10;}
if (a>15)
{b=b+10;} \\если больше 15 то прибавим к b так же 10




правильно ли я написал?

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

Добавлено: Пт май 05, 2017 07:37:03
Аlex
mixon46 писал(а):правильно ли я написал?
Если работает, значит правильно.

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

Добавлено: Пт май 05, 2017 09:05:02
ARV
но можно и чуть украсить :) если использовать else:

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

int d = 0;

if ((a>=1) && (a<=5)) d = 1;
else if ((a>=6) && (a<=10)) d = 5;
else if (a>=11) d = 10;

b += d;

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

Добавлено: Пт май 05, 2017 09:48:57
WiseLord
или так:

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

if (a > 10)
  b += 10;
else if (a > 5)
  b += 5;
else if (a > 0)
  b++;

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

Добавлено: Пт май 05, 2017 11:45:08
roman.com
mixon46 писал(а):при каждом прерывании если есть на ножке порта положительное напряжение прибавляется по 1.
interrupt [_____] void sec (void)
{if (PORTB.0==1) // на ножке порта положительное напряжение
{a++;}
else
{a=0;};

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

Добавлено: Пт май 05, 2017 11:49:00
ARV
roman.com писал(а):на ножке порта положительное напряжение
вы имели ввиду, что надо PINB.0? это да, проглядел

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

Добавлено: Пт май 05, 2017 16:46:32
COKPOWEHEU
Фигурные скобки расставлены "своеобразно". Стоит сделать по-человечески, чтобы отражали структуру программы.
Переменные, используемые и в прерываниях, и в основном цикле стоит объявить как volatile.

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

Добавлено: Вс май 07, 2017 20:52:42
mixon46
как много всяких вариантов предложили. я их просмотрел и даже не представляю какой выбрать :)

на ножке когда 0 тогда + (я сам не правильно написал) обычно же ножку порта через кнопку к минусу питания

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

Добавлено: Сб май 13, 2017 01:01:20
bc2
Здравствуйте, только начал изучать работу с atmega8 и CodeVision AVR
подскажите пожалуйста как реализовать вот такое.
на ногу 23 подаю например 1HZ а на 24 ноге нужно на выходе получить 1HZ * 2 то есть получается 2. Как реализовать умножение?

Изображение

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

Добавлено: Сб май 13, 2017 07:34:17
WiseLord
Имхо, напрямую - никак. Если частоты невелики, можно фронты входного сигнала по прерыванию детектировать, измерять время и выдавать импульсы вдвое меньшей частоты на другом выводе.