Skocz do zawartości

Pomiar czasu trwania impulsu - ATTiny13


radek_w

Rekomendowane odpowiedzi

Witam.

 

Chciałbym zmajstrować sobie mały układzik, który włączałby jakąś funkcję ( np. oświetlenie modelu ) po przełączeniu przełącznika w nadajniku.

Tak sobie wymyśliłem że wspomniany w tytule AtTiny13 mógłby pracować jako dekoder impulsów z odbiornika i generator impulsów do diód LED.

 

Wiem, pierwszym krokiem jest dokonanie pomiaru długości trwania impulsów wysyłanych przez odbiornik ... jednak nie potrafię tego w prawidłowy sposób zrobić :-(

 

Próbowałem w BASCOMIE użyć funkcji pulsein ale coś nie działa.

Może ktoś coś podpowie ?

 

 

Pozdrawiam

Radek

Odnośnik do komentarza
Udostępnij na innych stronach

Generalnie tak, jak koledzy piszą. Z tym, że nie trzeba zatrzymywać timera, wystarczy zapamiętać jego wartość. "Większe" AVR-y, niż attiny13 (np. 2313) mają wejścia Input Capture, w których wartość licznika jest przepisywana do specjalnego rejestru w chwili zmiany stanu na odpowiednim wejściu. Tym się mierzy impulsy bardzo dokładnie.

 

Można się pokusić o więcej. Ja dorobiłem 6 przycisków do aparatury, które wysyłam w jednym kanale, jako 7-mio pozycyjny przełącznik (7 położeń serwa) i napisałem kod na attiny 2313, który może sterować 6-ma rzeczami. Docelowo: oświetleniem, w innej inkarnacji aparatem, albo jakimś komputerem pokładowym. Albo opcjami OSD. Łotewer.

Przycisków równie dobrze mogło by być 8, ale nie wiedziałem gdzie miałbym jeszcze dziury w nadajniku wiercić, a 6 to i tak w końcu dużo.

Właśnie zamieściłem w tym wątku filmik z działania tego dekodera.

Tam jest opisane przeróbka Optica, ale układ się nada w sumie do każdego nadajnika.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 8 miesięcy temu...

Tez udalo mi sie kiedys wyprodukowac taki RC switch, ale oparlem go ATTINY25

 

Tutaj opis wyprowadzen scalaka i hex do pobrania: http://mifau.com/wp/?p=8

 

Przykladowy kod zrodlowy dla procesora (pierwsza wersja kodu dla switcha)

 

 

 

/*
RC-SWITCH
Michal Maciakowski
2009

ATTINY25 @ 8MHz
*/


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

const char VERSION[] = "RC-SWITCH Michal Maciakowski 2009 v1.1";


#define sbi(port,pin)   port |=   _BV(pin)	//stan wysoki
#define cbi(port,pin)   port &= ~(_BV(pin)) //stan niski

#define _PORT_IN 		PINB
#define _PORT_OUT 		PORTB
#define _PIN_WE			PB2
#define _PIN_STAN1 		PB5	
#define _PIN_STAN2 		PB3	
#define _PIN_STAN3 		PB4
#define _PIN_ALARM 		PB0
#define _PIN_ALARM2 	PB1		// NEG(ALARM+STAN3)


volatile uint32_t licznik = 0;
volatile uint8_t licznik_ok = 0;

ISR(TIMER0_OVF_vect) {
licznik++;
}


ISR(INT0_vect) {
GIMSK  = 0b00000000; //wylaczamy int0

if (bit_is_set(_PORT_IN,_PIN_WE)){//stan wysoki - rozpoczynamy pomiar
	TCNT0 = 0;	
	licznik = 0;
}else{

	if ((licznik>25)&&(licznik<80)){ //wstepne zawezenie pomiaru

		if (licznik_ok>4){   //5 poprawnych odczytow pod rzad
			cbi(_PORT_OUT,_PIN_ALARM); //wylaczenie alarmu
			sbi(_PORT_OUT,_PIN_ALARM2);

			if (licznik>54){
				sbi(_PORT_OUT,_PIN_STAN3);
				cbi(_PORT_OUT,_PIN_ALARM2);
			}
			else cbi(_PORT_OUT,_PIN_STAN3);

			if ((licznik>=42)&&(licznik<=54)) sbi(_PORT_OUT,_PIN_STAN2);
			else cbi(_PORT_OUT,_PIN_STAN2);	

			if (licznik<42)	sbi(_PORT_OUT,_PIN_STAN1);
			else cbi(_PORT_OUT,_PIN_STAN1);	

			licznik_ok=0;
		}
		licznik_ok++;
	}else{ //bledny sygnal
		 licznik_ok=0;
		 sbi(_PORT_OUT,_PIN_ALARM); //wlaczenie alarmu
		 cbi(_PORT_OUT,_PIN_ALARM2);
	}

}

GIMSK  = 0b01000000; //wlaczamy int0
}



int main(){
//konfiguracja portow
_PORT_OUT = 0b00000000; //
	DDRB  = 0b00111011; //

//konfiguracja timera
TCCR0B = 0b00000001; //timer 0

//konfiguracja zewnatrznych przerwac
MCUCR = 0b00000001;	//int0 wywolany dowolna zmiana stanu
GIMSK  = 0b01000000; //int0
GIFR = 	 0b01000000;

sbi(TIMSK,TOIE0);	//wlaczenie timera

sei();

sbi(_PORT_OUT,_PIN_STAN2); //defaultowy stan kanalu

//defaultowo alarm jest wlaczony
sbi(_PORT_OUT,_PIN_ALARM);
cbi(_PORT_OUT,_PIN_ALARM2);

while(1){
	if (licznik>4000) { //zabezpieczenie w przypadku braku sygnalu RC
		sbi(_PORT_OUT,_PIN_ALARM);
		cbi(_PORT_OUT,_PIN_ALARM2);
		licznik=0;
	}

}

}

 

 

Ciekawa implementacja RC switcha byl przelacznik video na potrzeby FPV: http://rc-cam.info/viewtopic.php?t=746

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 rok później...

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ę.