Skocz do zawartości

Wzmacnianie czujnika IR


Pomocna odpowiedź

Nie mam zamiaru tego zauważać, ale jeśli pod OCR1A wpiszę 8000000 to powinno migać raz na pół sekundy (to da się zauważyć 😋 ) a mimo to świeci ciągłym światłem.

Czyli jak wygląda program do migania co dajmy na to sekundę?

Chcesz wysyłać sygnał 36kHz co 1 sekundę?

Jeśli tak, to po prostu:

while(1)
{
OCR1A = 111;
_delay_ms(1000);
OCR1A = 0;
_delay_ms(1000);
}

Nie do końca o to mi chodziło. Raczej o coś co zamiast migać 36k razy na sekundę migało sobie raz na sekundę. Chcę sprawdzić czy to wina diody czy uC.

Mily2001, ustaw sobie preskaler na 1024 - bity CS12, CS10.

I wtedy masz: 8000000 / 1024 = 7812. Spróbuj to wpisać do OCR1A i wtedy dioda powinna migać z ok. f=1Hz. Nie obiecuje, bo nie mam teraz jak przetestować, ale próbuj.

edit:

Albo po protu zapal diodę na sekundę następnie zgaś, bez timera, na samych _delay'ach. 🙂

Mi to wygląda na błąd programu:

#include <avr/io.h>
#include <util/delay.h>
void zapal(int ktore)
{
PORTA|=(1<<ktore);
}
void zgas(int ktore)
{
int tmp;
tmp=PORTA;
tmp&=(1<<ktore);
tmp^=PORTA;
PORTA=tmp;
}
int main(void)
{
PORTB=0xFF;
DDRD=0xFF;
DDRA=0xFF;

DDRD |= 0x08;                              
 OCR1A = 111;
 TCCR1A |= (1 << COM1A0);
 TCCR1B |= (1 << WGM12) | (1 << CS10);

 while(1)
{
	if((PINB &0x10))
	{
		zgas(1);
	}else if(!(PINB &0x10))
	{
		zapal(1);
	}
} 
return 0;
}

Dioda jest podłączona pod PD3 (0x08) i po załadowaniu tego programu do uC na diodzie nie ma napięcia. Dioda świeci jeśli zamiast

DDRD |= 0x08;                              
 OCR1A = 111;
 TCCR1A |= (1 << COM1A0);
 TCCR1B |= (1 << WGM12) | (1 << CS10);

wstawię

PORTD=0x08

Sam TSOP działa bo sprawdzałem go używając pilota.

Jeśli ktoś ma jakieś pomysły to proszę o pomoc.

Coś tu jest pokręcone. W ATmega16 wyjścia Timera 1 są na PD4 i PD5. Ty używasz wyjścia OC1A (tak wynika z kodu) więc powinieneś podłączyć diodkę nadawczą pod PD5. Jakim cudem diodka świeci gdy używasz PORTD = 0x08 ?

A czy mruga jeśli wstawisz takie coś:

PORTD = 0x08;

_delay_ms(500);

PORTD = 0x00;

_delay_ms(500);

Bo jeśli nie, to znaczy, że to nie bit PD3 nią steruje a jeśli mruga, to Timer 1 nie ma do niej dostępu.

BTW:

W funkcji zgaś() toś namotał. Kod z XORem jest OK, ale wystarczy jedna linia:

PORTA &= ~(1<

Tak, miga. Dzięki za uwagę co do funkcji. Przydatne 😃

Co mam w takim razie zrobić dalej żeby timer1 działał jak trzeba?

Albo gdzie podłączyć diodę?

No to jeśli miga to.. czytałeś? Timer 1 nie ma dostępu do tej nóżki. Proponuję, byś najpierw zajrzał do danych katalogowych tego procesora:

http://www.atmel.com/Images/doc2466.pdf

Tam leżą odpowiedzi na większość Twoich pytań. Najlepiej zacznij od pierwszych kilku stron. Na przykład na stronie 2 narysowany jest Twój procesor. Gdzie widzisz wyjście OC1A? To tam właśnie podłącz swoją diodkę nadawczą, bo tą nóżką potrafi machać do Ciebie Timer 1. Tą i tą obok (OC1B) ale żadną inną.

  • Pomogłeś! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...