Форум РадиоКот https://radiokot.ru/forum/ |
|
CodeVision AVR в вопросах и ответах https://radiokot.ru/forum/viewtopic.php?f=57&t=5560 |
Страница 388 из 415 |
Автор: | jeka79 [ Пт апр 21, 2017 15:09:03 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
Аlex писал(а): Такую фигню : даже самый глупый компилятор должен вырезать не глядя. я для примера написал, что с bit результат при компиляции меньше, при чем при объявлении переменных в bit код не растет совсем. |
Автор: | mixon46 [ Вт апр 25, 2017 21:19:56 ] |
Заголовок сообщения: | 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; } не правильно что ли? |
Автор: | ARV [ Вт апр 25, 2017 21:25:06 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
когда уже начинающие научатся приводить свой код целиком, чтобы не приходилось задавать наводящие вопросы? вопрос риторический отвечать не надо. и я не буду отвечать на ваш вопрос. |
Автор: | mixon46 [ Вт апр 25, 2017 21:27:42 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
не хочу полностью. будете смотреть мой бред. и выговаривать потом ![]() что я не правильно сделал. точку с запятой не правильно поставил? вот и занимайся программированием. пока сам не сделаешь фиг кто подскажет |
Автор: | Jack_A [ Вт апр 25, 2017 22:42:53 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
ARV, не такой уж он начинающий... Я для МК на Си не пишу, но в глаза бросается: в одном месте se инкрементируется, в другом - увеличивается на 600, а поскольку проверка строго на равенство, то может перескочить это значение и дальше крутиться до посинения. И se, надеюсь, объявлена не однобайтовой переменной ? Еще сишники говорят - volatile помогает в подобном случае, им виднее. Чем мог... |
Автор: | WiseLord [ Ср апр 26, 2017 06:32:15 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
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; } |
Автор: | mixon46 [ Ср апр 26, 2017 10:24:46 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
Jack_A вы несомненно правы. Я прибавлял значение по 600 и поэтому произошел перескок. Дело было не в том почему переменная не обнулилась. Она бы обнулилась если бы значение было ровно 42199 но я же его перескочил. И соответственно это и привело к непоняткам. Я знаю что делать дальше. Спасибо )) |
Автор: | Jack_A [ Ср апр 26, 2017 10:26:42 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
Ну дык оно ж ... ![]() ---------- Ставим плюсы ![]() |
Автор: | mixon46 [ Ср апр 26, 2017 11:57:46 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
я бы поставил + только почему то не ставится. глюк какой что ли |
Автор: | barsik_32rus [ Чт май 04, 2017 17:24:58 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
Ребят хелп,укажите на ошибку пожалуйста. Если даже в пустой программе включить Ацп и прерывания то начинает на постоянку работать порт 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) { } } |
Автор: | mixon46 [ Чт май 04, 2017 21:49:03 ] |
Заголовок сообщения: | 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 правильно ли я написал? |
Автор: | Аlex [ Пт май 05, 2017 07:37:03 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
mixon46 писал(а): правильно ли я написал? Если работает, значит правильно.
|
Автор: | ARV [ Пт май 05, 2017 09:05:02 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
но можно и чуть украсить ![]() Код: 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 [ Пт май 05, 2017 09:48:57 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
или так: Код: if (a > 10)
b += 10; else if (a > 5) b += 5; else if (a > 0) b++; |
Автор: | roman.com [ Пт май 05, 2017 11:45:08 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
mixon46 писал(а): при каждом прерывании если есть на ножке порта положительное напряжение прибавляется по 1. interrupt [_____] void sec (void) {if (PORTB.0==1) // на ножке порта положительное напряжение {a++;} else {a=0;}; |
Автор: | ARV [ Пт май 05, 2017 11:49:00 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
roman.com писал(а): на ножке порта положительное напряжение вы имели ввиду, что надо PINB.0? это да, проглядел
|
Автор: | COKPOWEHEU [ Пт май 05, 2017 16:46:32 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
Фигурные скобки расставлены "своеобразно". Стоит сделать по-человечески, чтобы отражали структуру программы. Переменные, используемые и в прерываниях, и в основном цикле стоит объявить как volatile. |
Автор: | mixon46 [ Вс май 07, 2017 20:52:42 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
как много всяких вариантов предложили. я их просмотрел и даже не представляю какой выбрать ![]() на ножке когда 0 тогда + (я сам не правильно написал) обычно же ножку порта через кнопку к минусу питания |
Автор: | WiseLord [ Сб май 13, 2017 07:34:17 ] |
Заголовок сообщения: | Re: CodeVision AVR в вопросах и ответах |
Имхо, напрямую - никак. Если частоты невелики, можно фронты входного сигнала по прерыванию детектировать, измерять время и выдавать импульсы вдвое меньшей частоты на другом выводе. |
Страница 388 из 415 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |