я для примера написал, что с bit результат при компиляции меньше, при чем при объявлении переменных в bit код не растет совсем.Аlex писал(а):Такую фигню :
даже самый глупый компилятор должен вырезать не глядя.
CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
- Реклама
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: 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
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
когда уже начинающие научатся приводить свой код целиком, чтобы не приходилось задавать наводящие вопросы? вопрос риторический отвечать не надо. и я не буду отвечать на ваш вопрос.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
не хочу полностью. будете смотреть мой бред. и выговаривать потом
что я не правильно сделал. точку с запятой не правильно поставил?
вот и занимайся программированием. пока сам не сделаешь фиг кто подскажет
что я не правильно сделал. точку с запятой не правильно поставил?
вот и занимайся программированием. пока сам не сделаешь фиг кто подскажет
Re: CodeVision AVR в вопросах и ответах
ARV, не такой уж он начинающий...
Я для МК на Си не пишу, но в глаза бросается: в одном месте se инкрементируется, в другом - увеличивается на 600, а поскольку проверка строго на равенство, то может перескочить это значение и дальше крутиться до посинения. И se, надеюсь, объявлена не однобайтовой переменной ? Еще сишники говорят - volatile помогает в подобном случае, им виднее.
Чем мог...
Я для МК на Си не пишу, но в глаза бросается: в одном месте se инкрементируется, в другом - увеличивается на 600, а поскольку проверка строго на равенство, то может перескочить это значение и дальше крутиться до посинения. И se, надеюсь, объявлена не однобайтовой переменной ? Еще сишники говорят - volatile помогает в подобном случае, им виднее.
Чем мог...
- Реклама
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
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;
}- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
Jack_A вы несомненно правы. Я прибавлял значение по 600 и поэтому произошел перескок. Дело было не в том почему переменная не обнулилась. Она бы обнулилась если бы значение было ровно 42199 но я же его перескочил. И соответственно это и привело к непоняткам. Я знаю что делать дальше. Спасибо ))
Re: CodeVision AVR в вопросах и ответах
Ну дык оно ж ... 
---------------------------------------
Ставим плюсы
---------------------------------------
Ставим плюсы
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
я бы поставил + только почему то не ставится. глюк какой что ли
-
barsik_32rus
- Первый раз сказал Мяу!
- Сообщения: 26
- Зарегистрирован: Ср апр 12, 2017 16:30:29
Re: CodeVision AVR в вопросах и ответах
Ребят хелп,укажите на ошибку пожалуйста. Если даже в пустой программе включить Ацп и прерывания то начинает на постоянку работать порт 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)
{
}
}
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
скажите. вот у меня есть переменная. она равна 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
правильно ли я написал?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Если работает, значит правильно.mixon46 писал(а):правильно ли я написал?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
но можно и чуть украсить
если использовать 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;если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
или так:
Код: Выделить всё
if (a > 10)
b += 10;
else if (a > 5)
b += 5;
else if (a > 0)
b++;Re: CodeVision AVR в вопросах и ответах
interrupt [_____] void sec (void)mixon46 писал(а):при каждом прерывании если есть на ножке порта положительное напряжение прибавляется по 1.
{if (PORTB.0==1) // на ножке порта положительное напряжение
{a++;}
else
{a=0;};
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
вы имели ввиду, что надо PINB.0? это да, прогляделroman.com писал(а):на ножке порта положительное напряжение
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: CodeVision AVR в вопросах и ответах
Фигурные скобки расставлены "своеобразно". Стоит сделать по-человечески, чтобы отражали структуру программы.
Переменные, используемые и в прерываниях, и в основном цикле стоит объявить как volatile.
Переменные, используемые и в прерываниях, и в основном цикле стоит объявить как volatile.
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
как много всяких вариантов предложили. я их просмотрел и даже не представляю какой выбрать
на ножке когда 0 тогда + (я сам не правильно написал) обычно же ножку порта через кнопку к минусу питания
на ножке когда 0 тогда + (я сам не правильно написал) обычно же ножку порта через кнопку к минусу питания
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Имхо, напрямую - никак. Если частоты невелики, можно фронты входного сигнала по прерыванию детектировать, измерять время и выдавать импульсы вдвое меньшей частоты на другом выводе.




