Код говно. Что мешает изучить дашик, подобрать необходимый кварц и на таймере самостоятельно сгенерировать необходимую частоту?
Очередной тюнинг Авто?Тогда мультивибратор на двух транзисторах или как Вам сказали генератор на 555 И это код всего этого устройства? Код (C++): void setup() { pinMode(3, OUTPUT); tone(3, 20); } void loop() { }
Взяла я 441 аттиньку и побыренькому написала пару строк: Код (C++): /* * Generator.c * * Created: 04.12.2018 22:09:10 * Author : Andrey */ #include <avr/io.h> #define Bit(bit) (1<<(bit)) #define GEN_pin PINA1 #define GEN_port PORTA #define Prescaler_1 Bit(CS10) // Делитель тактов #define Prescaler_8 Bit(CS11) #define Prescaler_64 Bit(CS10) | Bit(CS11) #define Prescaler_256 Bit(CS12) #define Prescaler_1024 Bit(CS10) | Bit(CS12) #define Set_Prescaler1 Prescaler_8 // Установка предделителя для таймера 1 #define ClearPrescaler GTCCR = Bit(PSR) // Сброс предделителя #define Timer1_Start TCCR1B |= Set_Prescaler1; ClearPrescaler // Пуск таймера1 с очисткой делителя #define Timer1_Stop TCCR1B &= (~(Bit(CS10) | Bit(CS11) | Bit(CS12))) // Останов таймера1 (делитель = 0) #define Timer1_Clear TCNT1 = 0 int main(void) { DDRA = 0xFF; DDRB = 0xFF; // Абсолютно все пины на выход TCCR1A = Bit(COM1A0); // При совпадении значения таймера с блоком сравнения COM1A опрокинется пин TCCR1B |= Bit(WGM12); // Режим СТС TOCPMSA0 = Bit(TOCC1S0); // Привязка блока сравнения COM1A к пину TOCPMCOE = Bit(TOCC1OE); // Разрешаем работу пина от блока сравнения OCR1A = 55555; // Задатчик интервала Timer1_Start; while (1) { } } Всего 130 байт. Надо поработать над оптимизацией (хз какая была выставлена, если честно))) Подключила свой новенький ЛА (UNI-T, сука, хрень показывает) и увиделалала ла ла ла))) Что да как сегодня уже не буду - спать ушел. Ничего не нагрелось, ну и не погорело! На 328 сами перенесете - это домашнее задание!
ну далеко не пару... а порядка 25 -ти... И главное, ну нафига с такой частотй - таймер? Вот этот детский код будет генерить меандр с частотой 17.87 Гц Код (C++): void setup() { pinMode(3, OUTPUT); digitalWrite(3, LOW); while(1) { digitalWrite(3, ! digitalRead(3) ); delay(28); } void loop() { }
зато смотри в компараторе какая цифра висит - 55555 =) Подкрутить любую частоту - вообще не проблема. Дорисовать любой необходимый функционал - тоже - подводных камней нет в виде занятых таймеров. Можно сказать, что СВОБОДА! зато абсолютно всё аппаратно! МК можно в IDLE загнать и всё будет работать. Мне уже лень было писать.
ну почему же - вполне может. Переносимость - очень важное свойство, ради которого имеет смысл пожертвовать призрачной "эффективностью" твоего кода, которая в данном конкретном случае совершенно ни к чему. Если ты не заметил, главная концепция ардуино - именно переносимость. И Вайринг написан таким вовсе не потому, что его создатели криворукие быдлокодеры, а потому что самая главная цель была получить код, одинаково исполняющийся на всем семействе ардуин.
не понял - куда и что надо переносить? Я свой код перепишу под абсолютно любой другой AVR за приемлемое время. Да и под любой другой тоже. Только не понимаю - зачем это? Есть конкретное устройство с конкретным функционалом. Зачем ему совместимость со всеми МК? У АВР вертикальная совместимость не блещет. Яркий пример - 2313A и 2313 между собой не совместимы никак.