Всем привет! Есть небольшое устройство для включение ПК, собирал его на ардуине, но для эксплуатации выходит дороговато, решил перенести всё на ATtiny13, небольшие проблемы возникли с языком AVR каким образом можно запускать светодиод, в зависимости от сопротивления фото сенсора? На языке Ардуино всё выглядит так: Код (Text): int led = 2; int sens = 0; void setup(){ analogReference(DEFAULT); pinMode(led, OUTPUT); } void loop(){ int val = analogRead(sens); if(val >= 700){ digitalWrite(led,HIGH); delay(300); digitalWrite(led,LOW); delay(60000); } } А как же это будет в AVR студии, пока сделал ту же функцию, но включение не от аналогового сигнала, а от простого сигнала, подскажите как изменить на код с ардуино, спасибо! Код (Text): #define F_CPU 9600000 //частота Tiny13 #include <avr/io.h> //библиотека AVR #include <util/delay.h> // библиотека задержки времяни int main(void) //иноциализация микроконтроллера { DDRB = 0b110111; /*3-я ножка будет работает на вход цифравого сигнала, остальные на выход.*/ PORTB = 0b001000;//перед началом цикла даём на все ножки 0, кроме входящей ножки while(1) //бесконечный цикл, пока будут выполнятся условия. { if (!bit_is_clear(PINB, 3)) //выполнять условия если на 3-ю ножку поступит сигнал { PORTB = (0 << 2)|(1 << 1)|(0 << 0); //сигнал на ножку PB6. _delay_ms(300); //задержка 300мс. PORTB = 0b000000; //отключаем сигнал _delay_ms(6000); //задержка 6000мс. } } }
дорого - понятие относительное. Купи клон Arduino Mini (в России 320 р. самовывоз, в Китае 90 р. с учетом доставки).
Мне для ИТ проекта, всё нужно преподнести наиболее выгодно коммерческой стороны да и дивайс нужно собрать в плату 1, я не ардуино плату же буду прикреплять к плате своего дивайса) Если только МК вытащить с неё
1. AtTiny можно программировать через IDE со всеми analogRead, digitalRead и проч. Для "помигать светодиодом" памяти хватит. 2. Можно посмотреть на реализацию analogRead в библиотеках Arduino IDE Код (Text): int analogRead(uint8_t pin) { uint8_t low, high; #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) if (pin >= 54) pin -= 54; // allow for channel or pin numbers #elif defined(__AVR_ATmega32U4__) if (pin >= 18) pin -= 18; // allow for channel or pin numbers #elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) if (pin >= 24) pin -= 24; // allow for channel or pin numbers #elif defined(analogPinToChannel) && (defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)) pin = analogPinToChannel(pin); #else if (pin >= 14) pin -= 14; // allow for channel or pin numbers #endif #if defined(__AVR_ATmega32U4__) pin = analogPinToChannel(pin); ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); #elif defined(ADCSRB) && defined(MUX5) // the MUX5 bit of ADCSRB selects whether we're reading from channels // 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high). ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); #endif // set the analog reference (high two bits of ADMUX) and select the // channel (low 4 bits). this also sets ADLAR (left-adjust result) // to 0 (the default). #if defined(ADMUX) ADMUX = (analog_reference << 6) | (pin & 0x07); #endif // without a delay, we seem to read from the wrong channel //delay(1); #if defined(ADCSRA) && defined(ADCL) // start the conversion sbi(ADCSRA, ADSC); // ADSC is cleared when the conversion finishes while (bit_is_set(ADCSRA, ADSC)); // we have to read ADCL first; doing so locks both ADCL // and ADCH until ADCH is read. reading ADCL second would // cause the results of each conversion to be discarded, // as ADCL and ADCH would be locked when it completed. low = ADCL; high = ADCH; #else // we dont have an ADC, return 0 low = 0; high = 0; #endif // combine the two bytes return (high << 8) | low; } В начале идет преобразование номера пина в номер канала АЦП. Потом собственно считывание текущего состояния при помощи АЦП. analog_reference - это номер варианта опорного напряжения (по умолчанию 0) Также можно посмотреть реализацию данной функции в дополнении к Arduino IDE для программирования ATTiny, которая будет, наверное, ближе к требуемому.
Тоесть я могу как то законектить USB asp программатор напрямую к Ардуино студио и шить отуда? А как выбрать плату за основу? или через программатор ардуиновский как-то это можно реализовать? Ну не совсем "помигать светодиодом", помигать транзистором, который в свою очередь помигает релюшкой, ну прицеп тот же. Вобще я хотел узнать существует может какой то конвертер, который мог бы переделать написанное на Ардуине, в скетч который бы поняла AVR Studio, много проектов просто на ардуинке, если браться за их реализацию, в любом случае придётся работать с чистыми микроконтроллерами, я так понимаю наипростейший способ будет это освоить AVR всю, я читал про АЦП, но особо так и не понял как это всё реализовать может подскажите доступную литературу?
Хотите пользоваться функциями библиотеки Wiring - подключайте ее файлы в проект. Arduino IDE делает это автоматически, в других C/C++ IDE это придется сделать ручками. Файлы Wiring лежат в arduino/hardware/arduino/cores/arduino arduino/hardware/variants/*+ библиотеки в arduino/libraries/* .
Хех!Тиня13 мега вешь!Хотя стоит уже и не 25 а 60 рублей.Но заморачиваться с Си а тем более с Wiring не стал бы.Всё проще пишем на Асме компилим в Студии и шьём.Вот здесь занимательные эксперименты с тини13. http://tinyurl.com/kfpuple Всё расписано что как и чем.В вашем случае как то так: .include"tn13def.inc" sbi DDRB, 4 ;РВ4 - выход (светодиод LED) sbi PORTB, 2 ;Включение подтягивающего резистора на РВ2 (кнопка SB) sbic PINB, 2 ;Если РВ2=0 (кнопка нажата), пропустить след. строку sbi PORTB, 4 ;Установка РВ4 в 1 (выключение светодиода) sbis PINB, 2 ;Если РВ2=1 (кнопка отпущена), пропустить след. строку cbi PORTB, 4 ;Установка РВ4 в 0 (включение светодиода) Ножка 3 (РВ4)выход Ножка 7(РВ2)вход Естественно номера ножек можно переписать под Ваши цели.Можно добавить функции задержки если надо Компилим в Студии без проблем!Получилось :020000020000FC :100000000DC0189518951895189518951895189568 :1000100018951895C49A0ED0C4980CD00FE90DBF4E :100020000FEF07BB08BB00E40BBF0ABF01E005BF31 :100030007894FFCF65E15BE44BEB4150504060406A :04004000E0F7089548 :00000001FF Эту байду и шьём в контроллер.На Си код получился бы раза в два больше
А теперь представьте, что вам понадобилось сменить контроллер или встроить реализованный функционал в уже существующую прошивку для какого-нибудь PIC / ARM / etc. Вместо перекомпиляции и легких правок вы получаете полное переписывание от и до. Ассемблер не портируем, ему место в критичных местах программы в библиотеке под соответствующий контроллер. Кроме того, вам понадобилось снабдить программу на асме комментариями, которые в разы больше текста самой программы. А ведь на тех же сях можно сразу писать понятно, чтобы программа читалась как текст на человеческом языке, без особой нужды в комментариях. p.s. Впрочем, для крошечных микроконтроллеров типа ATtiny это, может быть, вполне оправдано, если иначе невозможно реализовать нужную функциональность в их очень ограниченном объеме памяти.
100% Согласен. Кросплатформенность-несомненный Сишный плюс.Просто для мелочи типа т-13 и программ типа ВКЛ/ВЫКЛ ИМХО лучше и проще написать на Асме (для меня во всяком случае)Да и Асм под AVR логичный и понятный если в Си разбираешься то всё Елементарно не то что Асм под PIC.(я его так и не вкурил пишу только на Си)Я это и показал хотя бы сам написал не так а через прерывание INT0. И вообще я бы эту штуку спаял на 2х КТ315 и релюхе. Под Т13 не напишете.Там нет такой платы.Тока Си.И там всё равно те же регистры та же инициализация почти такие же прерывания только операнды другие.