я для примера написал, что с bit результат при компиляции меньше, при чем при объявлении переменных в bit код не растет совсем.Аlex писал(а):Такую фигню :
даже самый глупый компилятор должен вырезать не глядя.
CodeVision AVR в вопросах и ответах
- Реклама
всем привет. написал я такой код но не идет обнуление переменной 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;
}
не правильно что ли?
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;
}
не правильно что ли?
когда уже начинающие научатся приводить свой код целиком, чтобы не приходилось задавать наводящие вопросы? вопрос риторический отвечать не надо. и я не буду отвечать на ваш вопрос.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
не хочу полностью. будете смотреть мой бред. и выговаривать потом
что я не правильно сделал. точку с запятой не правильно поставил?
вот и занимайся программированием. пока сам не сделаешь фиг кто подскажет
что я не правильно сделал. точку с запятой не правильно поставил?
вот и занимайся программированием. пока сам не сделаешь фиг кто подскажет
ARV, не такой уж он начинающий...
Я для МК на Си не пишу, но в глаза бросается: в одном месте se инкрементируется, в другом - увеличивается на 600, а поскольку проверка строго на равенство, то может перескочить это значение и дальше крутиться до посинения. И se, надеюсь, объявлена не однобайтовой переменной ? Еще сишники говорят - volatile помогает в подобном случае, им виднее.
Чем мог...
Я для МК на Си не пишу, но в глаза бросается: в одном месте se инкрементируется, в другом - увеличивается на 600, а поскольку проверка строго на равенство, то может перескочить это значение и дальше крутиться до посинения. И se, надеюсь, объявлена не однобайтовой переменной ? Еще сишники говорят - volatile помогает в подобном случае, им виднее.
Чем мог...
- Реклама
mixon46: Проделайте простые вычисления - с какой частотой вызывается таймер, далее, каков интервал времени между двумя прерываниями и, наконец, влезает ли 10мс задержка в этот интервал.
Это я к тому, что задержки в прерывании недопустимы вообще.
Ну и да, тип se неизвестен. Возможно, 43199 вообще невозможное значение.
P.S. И я упорно не понимаю желание людей писать код без форматирования. Словно сочинение какое-то. Ведь так нереально ошибки искать, когда даже логика кода глазами не видна. Когда, всего лишь добавление нескольких отступов делают всё гораздо читабельнее и понятнее.
Это я к тому, что задержки в прерывании недопустимы вообще.
Ну и да, тип 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;
}Jack_A вы несомненно правы. Я прибавлял значение по 600 и поэтому произошел перескок. Дело было не в том почему переменная не обнулилась. Она бы обнулилась если бы значение было ровно 42199 но я же его перескочил. И соответственно это и привело к непоняткам. Я знаю что делать дальше. Спасибо ))
Ну дык оно ж ... 
---------------------------------------
Ставим плюсы
---------------------------------------
Ставим плюсы
я бы поставил + только почему то не ставится. глюк какой что ли
- Сообщения: 26
- Зарегистрирован: Ср апр 12, 2017 16:30:29
Ребят хелп,укажите на ошибку пожалуйста. Если даже в пустой программе включить Ацп и прерывания то начинает на постоянку работать порт B0,в чем проблема?
#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)
{
}
}
Спойлер
#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)
{
}
}
скажите. вот у меня есть переменная. она равна 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
правильно ли я написал?
от 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
правильно ли я написал?
Если работает, значит правильно.mixon46 писал(а):правильно ли я написал?
но можно и чуть украсить
если использовать 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;если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
или так:
Код: Выделить всё
if (a > 10)
b += 10;
else if (a > 5)
b += 5;
else if (a > 0)
b++;interrupt [_____] void sec (void)mixon46 писал(а):при каждом прерывании если есть на ножке порта положительное напряжение прибавляется по 1.
{if (PORTB.0==1) // на ножке порта положительное напряжение
{a++;}
else
{a=0;};
вы имели ввиду, что надо PINB.0? это да, прогляделroman.com писал(а):на ножке порта положительное напряжение
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Фигурные скобки расставлены "своеобразно". Стоит сделать по-человечески, чтобы отражали структуру программы.
Переменные, используемые и в прерываниях, и в основном цикле стоит объявить как volatile.
Переменные, используемые и в прерываниях, и в основном цикле стоит объявить как volatile.
как много всяких вариантов предложили. я их просмотрел и даже не представляю какой выбрать
на ножке когда 0 тогда + (я сам не правильно написал) обычно же ножку порта через кнопку к минусу питания
на ножке когда 0 тогда + (я сам не правильно написал) обычно же ножку порта через кнопку к минусу питания
- Сообщения: 2
- Зарегистрирован: Сб май 13, 2017 00:52:35
Имхо, напрямую - никак. Если частоты невелики, можно фронты входного сигнала по прерыванию детектировать, измерять время и выдавать импульсы вдвое меньшей частоты на другом выводе.




