Перейти к содержанию

Jalui

Members
  • Постов

    20
  • Зарегистрирован

  • Посещение

Информация о Jalui

  • День рождения 15.10.1989

Информация

  • Пол
    Мужчина
  • Город
    Могилев

Электроника

  • Стаж в электронике
    1-2 года
  • Сфера радиоэлектроники
    микроконтроллеры

Посетители профиля

640 просмотров профиля

Достижения Jalui

Новичок

Новичок (1/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

-1

Репутация

  1. Вкратце, не в порядке выполнения: вернулся к записям типа (PINB & 0b00000001) == 0 исправил переполнение переменной по типу (логика проверки условия АЦП); установил непортативный Proteus (это оказалось важно); код скомпилировал прямо в Proteus с подключением WinAVR. Заработало. Интереса ради создал новый проект в Atmel Studio и он выдал ошибку recipe for target 'main.o' failed Да ну его Всем спасибо!
  2. Создал новый проект - предлагает включить только <avr/io.h> Даже пробовал включить руками <avr/iotn13a.h> - ошибки. Сделал по примеру - без изменений. Похоже надо менять среду разработки... Никакой логики. Я так понимаю: если на PB0 приходит 5 вольт, то для контроллера это 1. Если это так, то результатом "(1 & PB0)" будет "1" - мы это проверяем оператором сравнения же. Или это не так работает? Исходя из вышенаписанного, тут наоборот: пока на входе 0 В - простаиваем.
  3. @aitras попробую пока более простое для понимания, но вашу информацию забрал в заметки, спасибо!) @солар спасибо!) И то верно) Похоже, что компилятор не в курсе, кто такие PB0...PB4 (например, "PB2 = Unknown identifier"). Библиотеки <avr/io.h> недостаточно или что не так? Виснет при попытке входа в "while (1)" же. И чисто в справочных целях: MUX1 пишется только в таком порядке: ADMUX |= (1 << REFS0) | (1 << ADLAR) | (1 << MUX1); ADMUX |= (1 << MUX1); Если в коде: ADMUX |= (1 << REFS0) | (1 << ADLAR); ADMUX |= (1 << MUX1); то MUX1 == 0. Это нормально? Актуальный код: #define F_CPU 9600000UL #include <avr/io.h> #include <util/delay.h> #define D1_ON() PORTB |= (1 << PB1) // Direction 1 #define D1_OFF() PORTB &= ~(1 << PB1) // #define D2_ON() PORTB |= (1 << PB2) // Direction 2 #define D2_OFF() PORTB &= ~(1 << PB2) // int max_current=5000; // max current (mA) int action_delay=3000; // max time for openning/closing (ms) void delay200(void) // delay function { _delay_ms(200); // delay of checking (ms) ADCSRA |= (1 << ADSC); // start conversion while (ADCSRA & (1 << ADSC)); // check for end of conversion } void action(void) // waiting for ending of action { int i; for (i = 0; ((ADCH*1000) < max_current) & (i < action_delay); i += 200) // check for actual current and time { delay200(); } } int main(void) { DDRB |= (1 << PB1) | (1 << PB2); ADMUX |= (1 << REFS0) | (1 << ADLAR) | (1 << MUX1); // Internal Voltage Reference, Left Adjust, Selected Channel is PB4 ADMUX |= (1 << MUX1); ADCSRA |= (1 << ADEN) | (1 << ADPS1) | (1 << ADPS0); // ADC Enabled, Division Factor is 8 while (1) { while ((1 & PB0) == 0); // check for a positive input signal _delay_ms(300); // signal length (ms) if ((1 & PB0) == 1) // check for a true input signal { D1_ON(); // start opening delay200(); if ((ADCH*1000) < max_current) // check for direction { action(); // continue opening D1_OFF(); // end opening } else { D1_OFF(); // end opening D2_ON(); // start closing action(); // continue closing D2_OFF(); // end closing } while ((1 & PB0) == 1); // check for a negative input signal _delay_ms(300); // delay before new signal (ms) } } }
  4. Рукалицо... Спасибо :) Потому что не умеем) Просто смотреть флаг ADIF такое себе? И чисто в справочных целях, если не затруднит. Не нашлось путного. Правильно ли я чищу ADIF просто записывая в него единицу? Даташит говорит "Alternatively, ADIF is cleared by writing a logical one to the flag" при программном отслеживании этого флага... То есть это нормально, что он выставился единицей при завершении конвертации и я в него пишу единицу же?
  5. Jalui

    Отладка ATTiny13A

    Всем доброго дня. Пишется программа для ATTiny13A. Есть проблема при отладке в AVR Studio 7 и симуляции в Proteus 8.9. В в AVR Studio 7: 1) после команды "ADMUX |= 0b01100010;" отладчик показывает, что ADMUX == 0b01100000, пришлось после добавить "ADMUX |= (1 << 1);" почему не с первого раза? 2) команда "ADCSRA |= 0b01000000;" не стартует АЦП, при замене на "ADCSRA |= 0b11000000;" или "ADCSRA |= (1 << ADSC);" тоже самое. Что я делаю не так? 3) Функцию задержки пришлось закомментировать, иначе наглухо виснет при входе в неё. Можно ли как-то иначе решить такую проблему? В Proteus 8.9: После нажатия кнопки на выходе снимается 2,5 В - это вообще как? При переключении нагрузки это происходит на обоих выходах, чего по программе быть никак не должно... Код программы: #define F_CPU 9600000UL #include <avr/io.h> #include <util/delay.h> #define D1_ON() PORTB |= (0x01 << PB1) // Direction 1 #define D1_OFF() PORTB &= ~(0x01 << PB1) // #define D2_ON() PORTB |= (0x01 << PB2) // Direction 2 #define D2_OFF() PORTB &= ~(0x01 << PB2) // int max_current=5000; // max current (mA) int action_delay=3000; // max time for openning/closing (ms) void delay200(void) // delay function { _delay_ms(200); // delay of checking (ms) ADCSRA |= 0b01000000; //ADSC=1; // start conversion ADCSRA |= (1 << ADSC); while ((0b00010000 & ADCSRA) == 0) //(ADIF==0) // check for end of conversion { } ADCSRA |= 0b00010000; //ADIF=1; // reset flag of end of conversion } void action(void) // waiting for ending of action { int i; for (i = 0; ((ADCH*1000) < max_current) & (i < action_delay); i += 200) // check for actual current and time { delay200(); } } int main(void) { DDRB=0b00000001; ADMUX |= 0b01100010; // bit5 = "left adjusting" ADMUX |= (1 << 1); ADCSRA=0b10000011; // bit6 = "start" (ADSC) bit0..2 = "divider" while (1) { while ((0x01 & PINB) == 0x00) // check for a positive input signal { } _delay_ms(300); // signal length (ms) if ((0x01 & PINB) == 0x01) // check for a true input signal { D1_ON(); //PINB.1=1; // start opening delay200(); if ((ADCH*1000) < max_current) // check for direction { action(); // continue opening D1_OFF(); //PINB.1=0; // end opening } else { D1_OFF(); //PINB.1=0; // end opening D2_ON(); //PINB.2=1; // start closing action(); // continue closing D2_OFF(); //PINB.2=0; // end closing } while ((0x01 & PINB) == 0x01) // check for a negative input signal { } _delay_ms(300); // signal length (ms) while ((0x01 & PINB) == 0x01) // check for a true input signal { } } } }
×
×
  • Создать...