Skocz do zawartości

Sterowanie migawką aparatu z nadajnika - układ na ATtiny13


Bartek

Rekomendowane odpowiedzi

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:

69dbc059ce8c0c65.png

 

A oto płytka drukowana:

228971096b8bd06c.png

 

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:

b9d4d7761d3ed1f6.jpeg

 

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

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.