Нужна комплексная помощь в освоении АВРок

Обсуждаем контроллеры компании Atmel.
edj90
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср апр 09, 2014 13:53:14
Откуда: Владивосток

Re: Нужна комплексная помощь в освоении АВРок

Сообщение edj90 »

блин ребят. выхода avss и ares подключены +5в. яж выложил все в архиве выше. протеус 7.10 поставил. в чем может быть проблема,уже все проверил даже потенцинометр сделал 1кОм. результат тот же. побывал после всех вычеслений присвоить data1 значение 15. не выходит. все равно показывает как на фото в спойлере
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Реклама
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Нужна комплексная помощь в освоении АВРок

Сообщение Pink-Pank »

Возможно, проблемы с Шпротеусом. Попробуйте значение одной из переменных в цикле выводить на свободный порт - увидите, меняется значение ее или нет (смена красных/синеньких квадратиков возле пинов).
Fucking static initialization order fiasco
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18550
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нужна комплексная помощь в освоении АВРок

Сообщение ARV »

edj90 писал(а):спасибо разобрался, вроде все проходит, но значения data1 и data2 не меняются.....
СпойлерИзображение
и не будут, т.к. вы работаете по флагу ADIF, а его надо сбрасывать принудительно, если не используется соответствующий обработчик прерывания - вы этого не делаете, поэтому считываете из регистра ADCW одно и то же значение еще до завершения преобразования (кроме самого первого), которое просто не успевает обновиться. рекомендую ожидать конца преобразования по состоянию флага ADSC: while(ADCSRA & (1<<ADSC));

рекомендую (но не настаиваю) ознакомиться с моей статьей о том, как разрабатывать программы "с нуля": http://www.simple-devices.ru/articles/7 ... 0-16-40-05

надеюсь, после прочтения вы поймете, что получение значения АЦП с определенного входа следует оформить отдельной функцией, отладив которую, вы сможете затем использовать её сколько угодно раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Нужна комплексная помощь в освоении АВРок

Сообщение Pink-Pank »

ARV, флаг сбрасывается автоматом последующим запуском другого преобразования. Строчкой ADSRA |= (1<<ADSC);
Fucking static initialization order fiasco
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18550
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нужна комплексная помощь в освоении АВРок

Сообщение ARV »

Pink-Pank писал(а):ARV, флаг сбрасывается автоматом последующим запуском другого преобразования. Строчкой ADSRA |= (1<<ADSC);
это вам кто сказал? в даташите написано, что он сбрасывается либо вручную записью 1, либо аппаратно при входе в соответствующий обработчик прерываний. я не вижу обработчика прерываний в коде и не вижу, чтобы в бит ADIF где-либо записывалась единичка. строчка, на которую вы ссылаетесь, не меняет состояние ни одного бита в ADCSRA, кроме ADSC.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Нужна комплексная помощь в освоении АВРок

Сообщение Pink-Pank »

ARV, не горячитесь. Никакого противоречия даташиту. Лучше подумайте, что произойдет, если считать значение регистра, в котором установлен флаг, а затем записать его обратно. Как раз и получается запись 1-цы и сброс флага. т.е. флаг гарантированно можно сбросить вот так: ADCSRA = ADCSRA; или так: ADCSRA |= (1<<ADCSC);
Fucking static initialization order fiasco
Реклама
nirq
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Re: Нужна комплексная помощь в освоении АВРок

Сообщение nirq »

И что выигрывается таким индусом по сравнению с sbi? мгм... хотя да, sbi не шмогла бы два бита сразу. Но индус же.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Нужна комплексная помощь в освоении АВРок

Сообщение Pink-Pank »

sbi - это все-таки ассемблер. Хотя не исключаю возможности, что Си может ADCSRA |= (1<<ADCSC); преобразовать в sbi. Но студия у меня в read-modify-writy делала.
Fucking static initialization order fiasco
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18550
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нужна комплексная помощь в освоении АВРок

Сообщение ARV »

Pink-Pank писал(а):sbi - это все-таки ассемблер. Хотя не исключаю возможности, что Си может ADCSRA |= (1<<ADCSC); преобразовать в sbi. Но студия у меня в read-modify-writy делала.
студия - это avr-gcc, компилятор, которому можно доверять. а вопрос был про cvavr, и я не уверен, что он корректно отрабатывает volatile (да и вообще не уверен, volatile ли в нем объявление ADCSRA), так что превращение этой конструкции в sbi вполне допускаю со всеми вытекающими...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
edj90
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср апр 09, 2014 13:53:14
Откуда: Владивосток

Re: Нужна комплексная помощь в освоении АВРок

Сообщение edj90 »

Хех, щас чтоб не мучиться скачал статейку и прогнал ее http://www.avrki.ru/articles/content/lesson_5/
так вот лсд значение меняет пееменные в стринг тоже, но дата без изменений, все таки протеус может корячит или я не знаю.
Так все работает....
и вот что еще если int data то вот R-61168: R-61167 Пункт (2 байта на 0xFFFF1110) не в блоке памяти (0x00000460 байт).
если long data то при 0в значение 0, а при +5 значение 1023. как то так........
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Аватара пользователя
Vanes
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Вт июл 08, 2014 14:27:38
Откуда: Славянск-на-Кубани

Re: Нужна комплексная помощь в освоении АВРок

Сообщение Vanes »

Даааа размер хекса не впечатляет.... :shock: все таки CVAVR кладет все что надо и не надо
Изображение Истина где то рядом :-)
edj90
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср апр 09, 2014 13:53:14
Откуда: Владивосток

Re: Нужна комплексная помощь в освоении АВРок

Сообщение edj90 »

Vanes писал(а):Даааа размер хекса не впечатляет.... :shock: все таки CVAVR кладет все что надо и не надо
то есть? нужно указать для int размер памяти?
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
edj90
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср апр 09, 2014 13:53:14
Откуда: Владивосток

Re: Нужна комплексная помощь в освоении АВРок

Сообщение edj90 »

Ну с АЦП разобрались..... Продолжим.....
есть 8 кнопок, реально сделать как нить так 0b00000000, каждая кнопка управляет своим ноликом, 4 из которых при нажатие переходят с 0 в 1, при повторном с 1 в 0. А другие 4 переходят с 0 в 1 на время нажатия кнопки.
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Аватара пользователя
Vanes
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Вт июл 08, 2014 14:27:38
Откуда: Славянск-на-Кубани

Re: Нужна комплексная помощь в освоении АВРок

Сообщение 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;
};
}
}
Вложения
проект.rar
(34.74 КБ) 143 скачивания
Изображение Истина где то рядом :-)
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Нужна комплексная помощь в освоении АВРок

Сообщение WiseLord »

Интересно, и почему мне кажется, что при нажатии кнопок 4-7 в этом коде соответствующий выход будет не переключаться в противоположное состояние, а генерировать меандр с частотой около 25Гц (20мс задержка)?
edj90
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср апр 09, 2014 13:53:14
Откуда: Владивосток

Re: Нужна комплексная помощь в освоении АВРок

Сообщение edj90 »

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;
};
}
}
это не то что нужно. нужно такое с этой меги где 2 потенценометра и 8 кнопок передаёт на другую мегу8, а она уже на исп. устройства. так вот потенцы преобразуют в число, в зависимости от величины которого изменяется длительность импульса передачи сигнала data1 и data2. а кнопки передают либо 0 либо1, 4 кнопки из которых работают как стент бай. надеюсь правильно объяснил.
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
edj90
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср апр 09, 2014 13:53:14
Откуда: Владивосток

Re: Нужна комплексная помощь в освоении АВРок

Сообщение edj90 »

Кто подскажет???
Спойлер#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: Нужна комплексная помощь в освоении АВРок

Сообщение WiseLord »

edj90 писал(а):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 раза.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Нужна комплексная помощь в освоении АВРок

Сообщение Pink-Pank »

Спойлер

Код: Выделить всё

#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
edj90
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср апр 09, 2014 13:53:14
Откуда: Владивосток

Re: Нужна комплексная помощь в освоении АВРок

Сообщение edj90 »

вот что вышло, не без вашей помощи:
Спойлер#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; // включаем
}
}
}
все исправно! Спасибо всем огромное!!!! Теперь остается выбрать передатчик и скрестить его с МК. Об этом чуть позже....
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Ответить

Вернуться в «AVR»