Нужна комплексная помощь в освоении АВРок
Re: Нужна комплексная помощь в освоении АВРок
блин ребят. выхода avss и ares подключены +5в. яж выложил все в архиве выше. протеус 7.10 поставил. в чем может быть проблема,уже все проверил даже потенцинометр сделал 1кОм. результат тот же. побывал после всех вычеслений присвоить data1 значение 15. не выходит. все равно показывает как на фото в спойлере
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
- Реклама
- Pink-Pank
- Опытный кот
- Сообщения: 721
- Зарегистрирован: Ср июн 11, 2014 09:43:13
- Откуда: США
- Контактная информация:
Re: Нужна комплексная помощь в освоении АВРок
Возможно, проблемы с Шпротеусом. Попробуйте значение одной из переменных в цикле выводить на свободный порт - увидите, меняется значение ее или нет (смена красных/синеньких квадратиков возле пинов).
Fucking static initialization order fiasco
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18550
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Нужна комплексная помощь в освоении АВРок
и не будут, т.к. вы работаете по флагу ADIF, а его надо сбрасывать принудительно, если не используется соответствующий обработчик прерывания - вы этого не делаете, поэтому считываете из регистра ADCW одно и то же значение еще до завершения преобразования (кроме самого первого), которое просто не успевает обновиться. рекомендую ожидать конца преобразования по состоянию флага ADSC: while(ADCSRA & (1<<ADSC));edj90 писал(а):спасибо разобрался, вроде все проходит, но значения data1 и data2 не меняются.....Спойлер
рекомендую (но не настаиваю) ознакомиться с моей статьей о том, как разрабатывать программы "с нуля": http://www.simple-devices.ru/articles/7 ... 0-16-40-05
надеюсь, после прочтения вы поймете, что получение значения АЦП с определенного входа следует оформить отдельной функцией, отладив которую, вы сможете затем использовать её сколько угодно раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Pink-Pank
- Опытный кот
- Сообщения: 721
- Зарегистрирован: Ср июн 11, 2014 09:43:13
- Откуда: США
- Контактная информация:
Re: Нужна комплексная помощь в освоении АВРок
ARV, флаг сбрасывается автоматом последующим запуском другого преобразования. Строчкой ADSRA |= (1<<ADSC);
Fucking static initialization order fiasco
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18550
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Нужна комплексная помощь в освоении АВРок
это вам кто сказал? в даташите написано, что он сбрасывается либо вручную записью 1, либо аппаратно при входе в соответствующий обработчик прерываний. я не вижу обработчика прерываний в коде и не вижу, чтобы в бит ADIF где-либо записывалась единичка. строчка, на которую вы ссылаетесь, не меняет состояние ни одного бита в ADCSRA, кроме ADSC.Pink-Pank писал(а):ARV, флаг сбрасывается автоматом последующим запуском другого преобразования. Строчкой ADSRA |= (1<<ADSC);
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
- Pink-Pank
- Опытный кот
- Сообщения: 721
- Зарегистрирован: Ср июн 11, 2014 09:43:13
- Откуда: США
- Контактная информация:
Re: Нужна комплексная помощь в освоении АВРок
ARV, не горячитесь. Никакого противоречия даташиту. Лучше подумайте, что произойдет, если считать значение регистра, в котором установлен флаг, а затем записать его обратно. Как раз и получается запись 1-цы и сброс флага. т.е. флаг гарантированно можно сбросить вот так: ADCSRA = ADCSRA; или так: ADCSRA |= (1<<ADCSC);
Fucking static initialization order fiasco
Re: Нужна комплексная помощь в освоении АВРок
И что выигрывается таким индусом по сравнению с sbi? мгм... хотя да, sbi не шмогла бы два бита сразу. Но индус же.
- Pink-Pank
- Опытный кот
- Сообщения: 721
- Зарегистрирован: Ср июн 11, 2014 09:43:13
- Откуда: США
- Контактная информация:
Re: Нужна комплексная помощь в освоении АВРок
sbi - это все-таки ассемблер. Хотя не исключаю возможности, что Си может ADCSRA |= (1<<ADCSC); преобразовать в sbi. Но студия у меня в read-modify-writy делала.
Fucking static initialization order fiasco
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18550
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Нужна комплексная помощь в освоении АВРок
студия - это avr-gcc, компилятор, которому можно доверять. а вопрос был про cvavr, и я не уверен, что он корректно отрабатывает volatile (да и вообще не уверен, volatile ли в нем объявление ADCSRA), так что превращение этой конструкции в sbi вполне допускаю со всеми вытекающими...Pink-Pank писал(а):sbi - это все-таки ассемблер. Хотя не исключаю возможности, что Си может ADCSRA |= (1<<ADCSC); преобразовать в sbi. Но студия у меня в read-modify-writy делала.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Нужна комплексная помощь в освоении АВРок
Хех, щас чтоб не мучиться скачал статейку и прогнал ее 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. как то так........
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
- Vanes
- Первый раз сказал Мяу!
- Сообщения: 27
- Зарегистрирован: Вт июл 08, 2014 14:27:38
- Откуда: Славянск-на-Кубани
Re: Нужна комплексная помощь в освоении АВРок
Даааа размер хекса не впечатляет....
все таки CVAVR кладет все что надо и не надо
Re: Нужна комплексная помощь в освоении АВРок
то есть? нужно указать для int размер памяти?Vanes писал(а):Даааа размер хекса не впечатляет....все таки CVAVR кладет все что надо и не надо
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Re: Нужна комплексная помощь в освоении АВРок
Ну с АЦП разобрались..... Продолжим.....
есть 8 кнопок, реально сделать как нить так 0b00000000, каждая кнопка управляет своим ноликом, 4 из которых при нажатие переходят с 0 в 1, при повторном с 1 в 0. А другие 4 переходят с 0 в 1 на время нажатия кнопки.
есть 8 кнопок, реально сделать как нить так 0b00000000, каждая кнопка управляет своим ноликом, 4 из которых при нажатие переходят с 0 в 1, при повторном с 1 в 0. А другие 4 переходят с 0 в 1 на время нажатия кнопки.
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
- Vanes
- Первый раз сказал Мяу!
- Сообщения: 27
- Зарегистрирован: Вт июл 08, 2014 14:27:38
- Откуда: Славянск-на-Кубани
Re: Нужна комплексная помощь в освоении АВРок
как то так
#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 КБ) 143 скачивания
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нужна комплексная помощь в освоении АВРок
Интересно, и почему мне кажется, что при нажатии кнопок 4-7 в этом коде соответствующий выход будет не переключаться в противоположное состояние, а генерировать меандр с частотой около 25Гц (20мс задержка)?
Re: Нужна комплексная помощь в освоении АВРок
это не то что нужно. нужно такое с этой меги где 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;
};
}
}
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Re: Нужна комплексная помощь в освоении АВРок
Кто подскажет???
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;
};
}
}
}
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нужна комплексная помощь в освоении АВРок
Например, как-то так: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 раза.
- Pink-Pank
- Опытный кот
- Сообщения: 721
- Зарегистрирован: Ср июн 11, 2014 09:43:13
- Откуда: США
- Контактная информация:
Re: Нужна комплексная помощь в освоении АВРок
Спойлер
Код: Выделить всё
#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
Re: Нужна комплексная помощь в освоении АВРок
вот что вышло, не без вашей помощи:
#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; // включаем
}
}
}
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!



