блин ребят. выхода avss и ares подключены +5в. яж выложил все в архиве выше. протеус 7.10 поставил. в чем может быть проблема,уже все проверил даже потенцинометр сделал 1кОм. результат тот же. побывал после всех вычеслений присвоить data1 значение 15. не выходит. все равно показывает как на фото в спойлере
_________________ Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Возможно, проблемы с Шпротеусом. Попробуйте значение одной из переменных в цикле выводить на свободный порт - увидите, меняется значение ее или нет (смена красных/синеньких квадратиков возле пинов).
_________________ Fucking static initialization order fiasco
спасибо разобрался, вроде все проходит, но значения data1 и data2 не меняются..... Спойлер
и не будут, т.к. вы работаете по флагу ADIF, а его надо сбрасывать принудительно, если не используется соответствующий обработчик прерывания - вы этого не делаете, поэтому считываете из регистра ADCW одно и то же значение еще до завершения преобразования (кроме самого первого), которое просто не успевает обновиться. рекомендую ожидать конца преобразования по состоянию флага ADSC: while(ADCSRA & (1<<ADSC));
надеюсь, после прочтения вы поймете, что получение значения АЦП с определенного входа следует оформить отдельной функцией, отладив которую, вы сможете затем использовать её сколько угодно раз.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
ARV, флаг сбрасывается автоматом последующим запуском другого преобразования. Строчкой ADSRA |= (1<<ADSC);
это вам кто сказал? в даташите написано, что он сбрасывается либо вручную записью 1, либо аппаратно при входе в соответствующий обработчик прерываний. я не вижу обработчика прерываний в коде и не вижу, чтобы в бит ADIF где-либо записывалась единичка. строчка, на которую вы ссылаетесь, не меняет состояние ни одного бита в ADCSRA, кроме ADSC.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
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; // включаем } } } все исправно! Спасибо всем огромное!!!! Теперь остается выбрать передатчик и скрестить его с МК. Об этом чуть позже....
_________________ Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения