Bartek Opublikowano 6 Września 2007 Udostępnij Opublikowano 6 Września 2007 Zainspirowany tym wątkiem z zaprzyjaźnionego forum, postanowiłem wykonać własny układzik pozwalający na sterowanie migawką z nadajnika. Zgodnie z tym co pisze Zbig na tamtym forum układ może służyć do bardzo wielu funkcji, w zależności od tego jaki program wgramy do mikrokontrolera ATtiny13. Ja postanowiłem wykorzystać na początek możliwość sterowania migawką aparatu. Schemat połączeń jest podobny jak w moim poprzednim układziku , tzn. do złącza TRIG_OUT podłączamy przewody prowadzące do przycisku migawki aparatu, natomiast do złącza SIG_IN sygnał z odbiornika wraz z zasilaniem. Układ jest podłączany do odbiornika podobnie jak serwo. Pozostałe złącza (RESET, MISO i MOSI) służą do programowania mikrokontrolera, ale też mogą posłużyć jako wejścia lub wyjścia do innych funkcji tego układu. Oto schemat ideowy układu: A oto płytka drukowana: Oto napisany przeze mnie program sterujący mikrokontrolera. Zawarłem w nim procedury usypiania mikrokontrolera w celu obniżenia poboru prądu, ale chcę jeszcze nad nim popracować, żeby bardziej obniżyć pobór prądu. Przenieść obsługę sygnału z INT0 na PCINT1, dzięki czemu procesor będzie się mógł budzić nie tylko ze stanu Idle, ale także ze stanu Power Down, który charakteryzuje się znacznie mniejszym poborem energii. /********************************************* File : main.c Author : Bartosz Kilian bkilian@interia.pl Chip type : ATtiny13 Clock frequency : 4.8 MHz (set the value of define F_CPU) *********************************************/ // defines section // definitions for MCU Clock Frequency; adapt the MCU clock frequency in Hz to your target #ifndef F_CPU #define F_CPU 4800000UL #endif // enable routines that allow to reduce power consumption #define POWER_REDUCTION_ON // includes section // standard IO routines #include // interrupts #include // for sleep mode #include // function bodies /************************************************************************* Interrupt: External Interrupt Request 0 Purpose: called when a change occurs on INT0 pin depending on ISC01 and ISC00 bits in MCUCR **************************************************************************/ SIGNAL(SIG_INTERRUPT0) { if (MCUCR & ((1 << ISC01) | (1 << ISC00))) { // The rising edge generated an interrupt request // Reset counter register TCNT0 = 0; // Start counting // set prescaler division factor // CS00, CS01: select clock from prescaler: frequency = F_CPU / 64; // at F_CPU=4.8MHz Tmin=0,0133ms Tmax = Tmin * 2^8 = 3,413ms // T=1.0ms : TCNT0 = 75 // T=1.5ms : TCNT0 = 112 // T=2.0ms : TCNT0 = 150 TCCR0B |= (1 << CS01) | (1 << CS00); //Set The falling edge of INT0 generates an interrupt request. MCUCR = (MCUCR | (1 << ISC01)) & !(1 << ISC00); } else { // The falling edge generated an interrupt request // Stop counting TCCR0B &= !((1 << CS02) | (1 << CS01) | (1 << CS00)); if (TCNT0 > 112) { #ifdef POWER_REDUCTION_ON sleep_disable(); // Clear the SE (sleep enable) bit. #endif // set logical 1 on Port B bits 3 and 4 PORTB |= (1 << PORTB3) | (1 << PORTB4); } else { // set logical 0 on Port B bits 3 and 4 PORTB &= !((1 << PORTB3) | (1 << PORTB4)); #ifdef POWER_REDUCTION_ON sleep_enable(); // Set the SE (sleep enable) bit. #endif } // Reset counter register TCNT0 = 0; //Set The rising edge of INT0 generates an interrupt request. MCUCR |= (1 << ISC01) | (1 << ISC00); } } /* * @brief Main function body * @return none */ int main(void) { // Set Port B pin 3 and 4 as output DDRB = (1 << DDB3) | (1 << DDB4); // Init Timer/Counter0 // COM0x1=0 and COM0x0=0 : Normal port operation, OC0A and OC1B disconnected. // WGIM02=0 and WGM01=0 and WGM00=0 : Timer/Counter Mode of Operation: Normal // CS02=0 and CS01=0 and CS00=0 : Timer/Counter stopped TCCR0A &= !((1 << COM0A1) | (1 << COM0A0) | (1 << COM0B1) | (1 << COM0B0) | (1 << WGM01) | (1 << WGM00)); TCCR0B &= !((1 << WGM02) | (1 << CS02) | (1 << CS01) | (1 << CS00)); // Init Interrupt on INT0 // Set The rising edge of INT0 generates an interrupt request. MCUCR |= (1 << ISC01) | (1 << ISC00); // External Interrupt Request 0 Enable GIMSK |= (1 << INT0); #ifdef POWER_REDUCTION_ON sleep_enable(); // Set the SE (sleep enable) bit. set_sleep_mode(SLEEP_MODE_IDLE); // Select a sleep mode: Idle #endif sei(); // enable interrupts while(1) { #ifdef POWER_REDUCTION_ON sleep_mode(); // Put the device in sleep mode. #endif } return 0; } A oto zdjęcie zmontowane, zaprogramowanego i działającego układu: Tu umieściłem kod żródłowy programu, wsad do procesora, Makefile oraz płytkę i schemat w formacie Eagle: autom_mig.tar.gz Uwaga - Fusebity w procesorze należy ustawić tak, aby procesor był taktowany zegarem wewn. 4,8MHz bez dzielnika przez 8. Prawidłowe wartości fusebitów są w Makefile. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Zarchiwizowany
Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.