Нужна комплексная помощь в освоении АВРок
блин ребят. выхода avss и ares подключены +5в. яж выложил все в архиве выше. протеус 7.10 поставил. в чем может быть проблема,уже все проверил даже потенцинометр сделал 1кОм. результат тот же. побывал после всех вычеслений присвоить data1 значение 15. не выходит. все равно показывает как на фото в спойлере
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
- Реклама
Возможно, проблемы с Шпротеусом. Попробуйте значение одной из переменных в цикле выводить на свободный порт - увидите, меняется значение ее или нет (смена красных/синеньких квадратиков возле пинов).
Fucking static initialization order fiasco
и не будут, т.к. вы работаете по флагу ADIF, а его надо сбрасывать принудительно, если не используется соответствующий обработчик прерывания - вы этого не делаете, поэтому считываете из регистра ADCW одно и то же значение еще до завершения преобразования (кроме самого первого), которое просто не успевает обновиться. рекомендую ожидать конца преобразования по состоянию флага ADSC: while(ADCSRA & (1<<ADSC));edj90 писал(а):спасибо разобрался, вроде все проходит, но значения data1 и data2 не меняются.....Спойлер
рекомендую (но не настаиваю) ознакомиться с моей статьей о том, как разрабатывать программы "с нуля": http://www.simple-devices.ru/articles/7 ... 0-16-40-05
надеюсь, после прочтения вы поймете, что получение значения АЦП с определенного входа следует оформить отдельной функцией, отладив которую, вы сможете затем использовать её сколько угодно раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
ARV, флаг сбрасывается автоматом последующим запуском другого преобразования. Строчкой ADSRA |= (1<<ADSC);
Fucking static initialization order fiasco
это вам кто сказал? в даташите написано, что он сбрасывается либо вручную записью 1, либо аппаратно при входе в соответствующий обработчик прерываний. я не вижу обработчика прерываний в коде и не вижу, чтобы в бит ADIF где-либо записывалась единичка. строчка, на которую вы ссылаетесь, не меняет состояние ни одного бита в ADCSRA, кроме ADSC.Pink-Pank писал(а):ARV, флаг сбрасывается автоматом последующим запуском другого преобразования. Строчкой ADSRA |= (1<<ADSC);
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
ARV, не горячитесь. Никакого противоречия даташиту. Лучше подумайте, что произойдет, если считать значение регистра, в котором установлен флаг, а затем записать его обратно. Как раз и получается запись 1-цы и сброс флага. т.е. флаг гарантированно можно сбросить вот так: ADCSRA = ADCSRA; или так: ADCSRA |= (1<<ADCSC);
Fucking static initialization order fiasco
- Сообщения: 758
- Зарегистрирован: Вс фев 10, 2013 15:26:00
И что выигрывается таким индусом по сравнению с sbi? мгм... хотя да, sbi не шмогла бы два бита сразу. Но индус же.
sbi - это все-таки ассемблер. Хотя не исключаю возможности, что Си может ADCSRA |= (1<<ADCSC); преобразовать в sbi. Но студия у меня в read-modify-writy делала.
Fucking static initialization order fiasco
студия - это avr-gcc, компилятор, которому можно доверять. а вопрос был про cvavr, и я не уверен, что он корректно отрабатывает volatile (да и вообще не уверен, volatile ли в нем объявление ADCSRA), так что превращение этой конструкции в sbi вполне допускаю со всеми вытекающими...Pink-Pank писал(а):sbi - это все-таки ассемблер. Хотя не исключаю возможности, что Си может ADCSRA |= (1<<ADCSC); преобразовать в sbi. Но студия у меня в read-modify-writy делала.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Хех, щас чтоб не мучиться скачал статейку и прогнал ее http://www.avrki.ru/articles/content/lesson_5/
так вот лсд значение меняет пееменные в стринг тоже, но дата без изменений, все таки протеус может корячит или я не знаю.
Так все работает....
и вот что еще если int data то вот R-61168: R-61167 Пункт (2 байта на 0xFFFF1110) не в блоке памяти (0x00000460 байт).
если long data то при 0в значение 0, а при +5 значение 1023. как то так........
так вот лсд значение меняет пееменные в стринг тоже, но дата без изменений, все таки протеус может корячит или я не знаю.
Так все работает....
и вот что еще если int data то вот R-61168: R-61167 Пункт (2 байта на 0xFFFF1110) не в блоке памяти (0x00000460 байт).
если long data то при 0в значение 0, а при +5 значение 1023. как то так........
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Даааа размер хекса не впечатляет....
все таки CVAVR кладет все что надо и не надо
то есть? нужно указать для int размер памяти?Vanes писал(а):Даааа размер хекса не впечатляет....все таки CVAVR кладет все что надо и не надо
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Ну с АЦП разобрались..... Продолжим.....
есть 8 кнопок, реально сделать как нить так 0b00000000, каждая кнопка управляет своим ноликом, 4 из которых при нажатие переходят с 0 в 1, при повторном с 1 в 0. А другие 4 переходят с 0 в 1 на время нажатия кнопки.
есть 8 кнопок, реально сделать как нить так 0b00000000, каждая кнопка управляет своим ноликом, 4 из которых при нажатие переходят с 0 в 1, при повторном с 1 в 0. А другие 4 переходят с 0 в 1 на время нажатия кнопки.
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
как то так
#include <delay.h>
void main(void)
{
PORTB=0xFF;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
while (1)
{
PORTD.0=!PINB.0; //первая кнопка
PORTD.1=!PINB.1; //вторая кнопка
PORTD.2=!PINB.2; //третья кнопка
PORTD.3=!PINB.3; //четвертая кнопка
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;
};
}
}
Спойлер
#include <mega8.h>#include <delay.h>
void main(void)
{
PORTB=0xFF;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
while (1)
{
PORTD.0=!PINB.0; //первая кнопка
PORTD.1=!PINB.1; //вторая кнопка
PORTD.2=!PINB.2; //третья кнопка
PORTD.3=!PINB.3; //четвертая кнопка
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;
};
}
}
- Вложения
-
- проект.rar
- (34.74 КБ) 144 скачивания
Интересно, и почему мне кажется, что при нажатии кнопок 4-7 в этом коде соответствующий выход будет не переключаться в противоположное состояние, а генерировать меандр с частотой около 25Гц (20мс задержка)?
это не то что нужно. нужно такое с этой меги где 2 потенценометра и 8 кнопок передаёт на другую мегу8, а она уже на исп. устройства. так вот потенцы преобразуют в число, в зависимости от величины которого изменяется длительность импульса передачи сигнала data1 и data2. а кнопки передают либо 0 либо1, 4 кнопки из которых работают как стент бай. надеюсь правильно объяснил.Vanes писал(а):как то такСпойлер
#include <mega8.h>
#include <delay.h>
void main(void)
{
PORTB=0xFF;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
while (1)
{
PORTD.0=!PINB.0; //первая кнопка
PORTD.1=!PINB.1; //вторая кнопка
PORTD.2=!PINB.2; //третья кнопка
PORTD.3=!PINB.3; //четвертая кнопка
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;
};
}
}
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Кто подскажет???
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;
};
}
}
}
что можно придумать, или все в корне не так???? или для каждой кнопки свою переменную придумать???
Спойлер
#include <mega8.h>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;
};
}
}
}
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Например, как-то так:edj90 писал(а):if (data3==0b00000000) как проверить не все нолики а только второй слева
Код: Выделить всё
if (~data3 & 0b00000010)Спойлер
Код: Выделить всё
#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;
}
}
}
}
Последний раз редактировалось WiseLord Пн авг 04, 2014 10:00:37, всего редактировалось 4 раза.
Спойлер
Код: Выделить всё
#include <mega8.h>
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 <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; // включаем
}
}
}
все исправно! Спасибо всем огромное!!!! Теперь остается выбрать передатчик и скрестить его с МК. Об этом чуть позже....
Спойлер
#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; // включаем
}
}
}
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!



