блин ребят. выхода avss и ares подключены +5в. яж выложил все в архиве выше. протеус 7.10 поставил. в чем может быть проблема,уже все проверил даже потенцинометр сделал 1кОм. результат тот же. побывал после всех вычеслений присвоить data1 значение 15. не выходит. все равно показывает как на фото в спойлере
_________________ Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Возможно, проблемы с Шпротеусом. Попробуйте значение одной из переменных в цикле выводить на свободный порт - увидите, меняется значение ее или нет (смена красных/синеньких квадратиков возле пинов).
_________________ Fucking static initialization order fiasco
спасибо разобрался, вроде все проходит, но значения data1 и data2 не меняются..... Спойлер
и не будут, т.к. вы работаете по флагу ADIF, а его надо сбрасывать принудительно, если не используется соответствующий обработчик прерывания - вы этого не делаете, поэтому считываете из регистра ADCW одно и то же значение еще до завершения преобразования (кроме самого первого), которое просто не успевает обновиться. рекомендую ожидать конца преобразования по состоянию флага ADSC: while(ADCSRA & (1<<ADSC));
надеюсь, после прочтения вы поймете, что получение значения АЦП с определенного входа следует оформить отдельной функцией, отладив которую, вы сможете затем использовать её сколько угодно раз.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
ARV, флаг сбрасывается автоматом последующим запуском другого преобразования. Строчкой ADSRA |= (1<<ADSC);
это вам кто сказал? в даташите написано, что он сбрасывается либо вручную записью 1, либо аппаратно при входе в соответствующий обработчик прерываний. я не вижу обработчика прерываний в коде и не вижу, чтобы в бит ADIF где-либо записывалась единичка. строчка, на которую вы ссылаетесь, не меняет состояние ни одного бита в ADCSRA, кроме ADSC.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
ARV, не горячитесь. Никакого противоречия даташиту. Лучше подумайте, что произойдет, если считать значение регистра, в котором установлен флаг, а затем записать его обратно. Как раз и получается запись 1-цы и сброс флага. т.е. флаг гарантированно можно сбросить вот так: ADCSRA = ADCSRA; или так: ADCSRA |= (1<<ADCSC);
_________________ Fucking static initialization order fiasco
sbi - это все-таки ассемблер. Хотя не исключаю возможности, что Си может ADCSRA |= (1<<ADCSC); преобразовать в sbi. Но студия у меня в read-modify-writy делала.
_________________ Fucking static initialization order fiasco
sbi - это все-таки ассемблер. Хотя не исключаю возможности, что Си может ADCSRA |= (1<<ADCSC); преобразовать в sbi. Но студия у меня в read-modify-writy делала.
студия - это avr-gcc, компилятор, которому можно доверять. а вопрос был про cvavr, и я не уверен, что он корректно отрабатывает volatile (да и вообще не уверен, volatile ли в нем объявление ADCSRA), так что превращение этой конструкции в sbi вполне допускаю со всеми вытекающими...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Хех, щас чтоб не мучиться скачал статейку и прогнал ее http://www.avrki.ru/articles/content/lesson_5/ так вот лсд значение меняет пееменные в стринг тоже, но дата без изменений, все таки протеус может корячит или я не знаю. Так все работает.... и вот что еще если int data то вот R-61168: R-61167 Пункт (2 байта на 0xFFFF1110) не в блоке памяти (0x00000460 байт). если long data то при 0в значение 0, а при +5 значение 1023. как то так........
_________________ Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Ну с АЦП разобрались..... Продолжим..... есть 8 кнопок, реально сделать как нить так 0b00000000, каждая кнопка управляет своим ноликом, 4 из которых при нажатие переходят с 0 в 1, при повторном с 1 в 0. А другие 4 переходят с 0 в 1 на время нажатия кнопки.
_________________ Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Интересно, и почему мне кажется, что при нажатии кнопок 4-7 в этом коде соответствующий выход будет не переключаться в противоположное состояние, а генерировать меандр с частотой около 25Гц (20мс задержка)?
if (PINB.4==0) //пятая кнопка { delay_ms(20); PORTD.4=!PORTD.4; }; if (PINB.5==0) //шестая кнопка { delay_ms(20); PORTD.5=!PORTD.5; }; if (PINB.6==0) //седьмая кнопка { delay_ms(20); PORTD.6=!PORTD.6; }; if (PINB.7==0) //восьмая кнопка { delay_ms(20); PORTD.7=!PORTD.7; }; } }
это не то что нужно. нужно такое с этой меги где 2 потенценометра и 8 кнопок передаёт на другую мегу8, а она уже на исп. устройства. так вот потенцы преобразуют в число, в зависимости от величины которого изменяется длительность импульса передачи сигнала data1 и data2. а кнопки передают либо 0 либо1, 4 кнопки из которых работают как стент бай. надеюсь правильно объяснил.
_________________ Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
long int data3; void main (void) { PORTD=0b11111111; DDRD= 0b00000000; while (1) { if (PIND.0==0)\\ проверяем состояние кнопки 1 { if (data3==0b00000000) \\проверяем состояние вкл выкл { data3=data3+0b00000001; \\ включаем если выкл } else { data3=data3-0b00000000;\\ выключаем если вкл }; } if (PIND.1==0) \\здесь все тоже самое только вторая кнопка { if (data3==0b00000000) как проверить не все нолики а только второй слева { data3=data3+0b00000010; } else { data3=data3-0b00000010; }; } } }
что можно придумать, или все в корне не так???? или для каждой кнопки свою переменную придумать???
_________________ Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
if (data3==0b00000000) как проверить не все нолики а только второй слева
Например, как-то так:
Код:
if (~data3 & 0b00000010)
P.S. Вот пример более-менее "чистого" и хорошо переносимого кода для avr-gcc, по возможности избавленного от "примочек" CodeVision. Спойлер
Код:
#include <avr/io.h>
#define BTN_1 (1<<0) // Или 0b00000001 #define BTN_2 (1<<1) // Или 0b00000010
#define BTN_PIN PIND #define BTN_PORT PORTD #define BTN_DDR DDRD
unsigned char data3;
void main (void) { BTN_DDR &= ~(BTN_1 | BTN_2); // Устананавливаем выводы порта с кнопками в качестве входа BTN_PORT = (BTN_1 | BTN_2); // Подвешиваем Pull-up резисторы на эти выводы
while (1) { if ((BTN_PIN & BTN_1) == 0) { // проверяем состояние кнопки 1 if (data3 & 0b00000001) { // проверяем состояние вкл выкл data3 &= ~0b00000001; // выключаем если вкл } else { data3 |= 0b00000001; // включаем если выкл } } if ((BTN_PIN & BTN_2) == 0) { // здесь все тоже самое только вторая кнопка if (data3 & 0b00000010) { // как проверить не все нолики а только второй слева data3 &= ~0b00000010; } else { data3 |= 0b00000010; } } } }
Для Codevision можно использовать (PIND.0 == 0) вместо ((BTN_PIN & BTN_1) == 0), а в остальном - то же самое.
Последний раз редактировалось WiseLord Пн авг 04, 2014 10:00:37, всего редактировалось 4 раз(а).
long int data3; void main (void) { PORTD=0b11111111; DDRD= 0b00000000; while (1) { if (PIND.0==0)\\ проверяем состояние кнопки 1 { if (data3&0b00000001) \\проверяем состояние вкл выкл { data3|=0b00000001; \\ включаем если выкл } else { data3&=~0b00000001;\\ выключаем если вкл }; } if (PIND.1==0) \\здесь все тоже самое только вторая кнопка { if (data3&0b00000010) как проверить не все нолики а только второй слева { data3|=0b00000010; } else { data3&=~0b00000010; }; } } }
_________________ Fucking static initialization order fiasco
вот что вышло, не без вашей помощи: Спойлер#include <mega8.h> #include <delay.h>
long int data1; long int data2; long int data3; void main (void) { PORTD=0b11111111; DDRD= 0b00000000; /***Настройка АЦП***/
ADCSRA |= (1 << ADEN) //Включение АЦП (все ножки порта С) |(1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 128 (16.000\128=125 КГц) ADMUX |= (0 << REFS1)|(0 << REFS0); // внешний ИОН (ножка AREF) while (1) { ADMUX = 0b00000000;// вход РС0 ADCSRA |= (1 << ADSC); //Начинаем преобразование while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования data1=ADCW;// запись результата в data1
ADMUX = 0b00000001;// вход РС1 ADCSRA |= (1 << ADSC); //Начинаем преобразование while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования data2=ADCW;// запись результата в data2
data3 &= ~0b11110000; \\ сбрасываем 4 кнопки
if (PIND.0==0)\\ проверяем состояние кнопки 1 { delay_ms (20); if (data3 & 0b00000001) { // проверяем состояние вкл выкл data3 &= ~0b00000001; // выключаем если вкл } else { data3 |= 0b00000001; // включаем если выкл }
} if (PIND.1==0) \\здесь все тоже самое только вторая кнопка { delay_ms (20); if (data3 & 0b00000010) { // проверяем состояние вкл выкл data3 &= ~0b00000010; // выключаем если вкл } else { data3 |= 0b00000010; // включаем если выкл } } if (PIND.2==0) \\здесь все тоже самое только третья кнопка { delay_ms (20); if (data3 & 0b00000100) { // проверяем состояние вкл выкл data3 &= ~0b00000100; // выключаем если вкл } else { data3 |= 0b00000100; // включаем если выкл } } if (PIND.3==0) \\здесь все тоже самое только четвертая кнопка { delay_ms (20); if (data3 & 0b00001000) { // проверяем состояние вкл выкл data3 &= ~0b00001000; // выключаем если вкл } else { data3 |= 0b00001000; // включаем если выкл } } if (PIND.4==0) \\здесь все тоже самое только 5 кнопка { delay_ms (20); data3 |= 0b00010000; // включаем } if (PIND.5==0) \\здесь все тоже самое только 6 кнопка { delay_ms (20); data3 |= 0b00100000; // включаем } if (PIND.6==0) \\здесь все тоже самое только 7 кнопка { delay_ms (20); data3 |= 0b01000000; // включаем } if (PIND.7==0) \\здесь все тоже самое только 8 кнопка { delay_ms (20); data3 |= 0b10000000; // включаем } } } все исправно! Спасибо всем огромное!!!! Теперь остается выбрать передатчик и скрестить его с МК. Об этом чуть позже....
_________________ Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения