Всем привет!Хочу спросить, почему не работает этот код в тини85? В программирование я полный нуль. Вот этот код: Код (C++): #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> #include <util/delay.h> #define X1_BIT PB0 #define X2_BIT PB1 //Сколько времени должа быть //катушка под напругой #define ENERGISE_TIME 60 // global variable to count the number of overflows volatile uint16_t tot_overflow; volatile uint8_t polarity = 0; void tick(void) { PORTB |= (1 << X1_BIT); PORTB &= ~(1 << X2_BIT); } void tock(void) { PORTB |= (1 << X2_BIT); PORTB &= ~(1 << X1_BIT); } void reset(void) { PORTB &= ~(1<< X1_BIT); PORTB &= ~(1<< X2_BIT); } // Отправьте импульс на //тактовый модуль void pulseClock(void) { if (polarity == 0) { tick(); _delay_ms(ENERGISE_TIME); reset(); polarity = 1; } else { tock(); _delay_ms(ENERGISE_TIME); reset(); polarity = 0; } } // initialize timer, interrupt and variable int timer0_init(void) { // set up timer with prescaler = 256 TCCR0B |= (1 << CS02); // initialize counter TCNT0 = 0; // enable overflow interrupt TIMSK |= (1 << TOIE0); // enable global interrupts sei(); // initialize overflow counter variable tot_overflow = 0; } ISR(TIMER0_OVF_vect) { // keep a track of number of overflows tot_overflow++; } int main(void) { // connect led to pin PC0 DDRB = (1<<X1_BIT)|(1<< X2_BIT); reset(); // initialize timer timer0_init(); // loop forever while(1) { // check if the timer count reaches 53 if (TCNT0 >=135) { // check if no. of overflows = 12 if (tot_overflow >= 915) { pulseClock(); TCNT0 = 0;// reset counter tot_overflow = 0;// reset overflow counter } } } }
Это нужно для управления вторичными часами.На катушку часов нужно подовать импульсы. Вот я и подумал что таймеры и прерывания будут точней.
millis() тоже отсчитывается прерываниями и delay() тоже. Главное запустить МК от кварца, а не от внутреннего генератора импульсов. В идеале еще сделать коррекцию по температуре, но это уже для перфекционистов. )
На двигатель часов нужно подавать импульсы чередующейся полярности длительностью примерно 100 мс. Каждый импульс перемещает минутную стрелку на одну минуту.К примеру:"PB0=1,PB1=0"через 100мс на портах нули. Через минуту:"PB0=0,PB1=1" через 100мс нули.
Делал такие часы башенные, правда не на AVR, а на плате для компа. Сейчас не вспомню название мотор-редуктора уже. А подводить как думаете? У меня они автоматом догоняли или ждали при запуске, смотря что быстрее.
И да, силенок у пина хватит на стрелку сдвинуть? Я не помню сколько там в мА. Или у вас схема с транзисторами? Можно и порт спалить на раз два.
Компа под рукой нет, поэтому нормально оформить не могу и проверить тоже. Попробуйте В сетап: Код (C++): DDRB = 0b00000011;[ PORTB = 0; В луп: Код (C++): PORTB = 1; delay(100); // длительность имульса в мм PORTB = 0; delay(59900); // ждем до полной мин (60000-импульс) PORTB = 2; delay(100); PORTB = 0; delay(59900); Это самый простой вариант "в лоб". Можно по разному. А вообще в часах много чего кроме тикалки обычно требуется.
А, пардоньте, раз в минуту дергать стрелками, значить вместо delay(900) ставим delay(59900). Сами переключения и джамп выполняются за наносекунды, ими можно принебречь.
Классный у нас форум.Пишем коды компилим.Еще бы по воздуху прошивать как esp8266.Я вон тоже за 2 дня 2 скетча выдал на гора.Ни думать не хотят ни учиться ни хотя бы погуглить.
Бред про отвертку. Там оно для первоначальной установки. Вряд ли вы будете после каждого сбоя питания бегать подводить на всём шлейфе вторичные часы. Непрактично и неудобно, да и ставит вопрос об адекватности решения. В интернете гуглом находятся куда как более корректные автоматизированные решения. Например у Кота на форуме https://radiokot.ru/circuit/digital/home/122/
Всем спасибо! По совету ostrova прошил мк и заработало! warman шлейфа не будет.Это ради спортивного интереса.