Обсуждаем контроллеры компании Atmel.
Ответить

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

Пт апр 21, 2017 15:09:03

Аlex писал(а):Такую фигню :
даже самый глупый компилятор должен вырезать не глядя.

я для примера написал, что с bit результат при компиляции меньше, при чем при объявлении переменных в bit код не растет совсем.

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

Вт апр 25, 2017 21:19:56

всем привет. написал я такой код но не идет обнуление переменной 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

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

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

Вт апр 25, 2017 21:27:42

не хочу полностью. будете смотреть мой бред. и выговаривать потом :))
что я не правильно сделал. точку с запятой не правильно поставил?

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

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

Вт апр 25, 2017 22:42:53

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

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

Ср апр 26, 2017 06:32:15

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

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

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

Ср апр 26, 2017 10:26:42

Ну дык оно ж ... :)


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

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

Ср апр 26, 2017 11:57:46

я бы поставил + только почему то не ставится. глюк какой что ли

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

Чт май 04, 2017 17:24:58

Ребят хелп,укажите на ошибку пожалуйста. Если даже в пустой программе включить Ацп и прерывания то начинает на постоянку работать порт 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

скажите. вот у меня есть переменная. она равна 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

mixon46 писал(а):правильно ли я написал?
Если работает, значит правильно.

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

Пт май 05, 2017 09:05:02

но можно и чуть украсить :) если использовать 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

или так:
Код:
if (a > 10)
  b += 10;
else if (a > 5)
  b += 5;
else if (a > 0)
  b++;

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

Пт май 05, 2017 11:45:08

mixon46 писал(а):при каждом прерывании если есть на ножке порта положительное напряжение прибавляется по 1.

interrupt [_____] void sec (void)
{if (PORTB.0==1) // на ножке порта положительное напряжение
{a++;}
else
{a=0;};

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

Пт май 05, 2017 11:49:00

roman.com писал(а):на ножке порта положительное напряжение
вы имели ввиду, что надо PINB.0? это да, проглядел

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

Пт май 05, 2017 16:46:32

Фигурные скобки расставлены "своеобразно". Стоит сделать по-человечески, чтобы отражали структуру программы.
Переменные, используемые и в прерываниях, и в основном цикле стоит объявить как volatile.

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

Вс май 07, 2017 20:52:42

как много всяких вариантов предложили. я их просмотрел и даже не представляю какой выбрать :)

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

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

Сб май 13, 2017 01:01:20

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

Изображение

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

Сб май 13, 2017 07:34:17

Имхо, напрямую - никак. Если частоты невелики, можно фронты входного сигнала по прерыванию детектировать, измерять время и выдавать импульсы вдвое меньшей частоты на другом выводе.
Ответить