Skocz do zawartości

Atmega8 + cny70 + program do tego


kojak

Pomocna odpowiedź

Witam.

Chciałbym sobie oprogramować czujnik CNY70 w C. Nie wiem czy dobrze wszystko rozumiem dlatego mam kilka pytań. Chciałbym, żeby po najechaniu na czarną linię zaświeciła się dioda. Proszę nie krytykować, że schemat był robiony w paincie. Oczywiście całość nie działa. Zasilanie biorę z programatora (5V).

1. Pewnie źle CNY 70 podłączyłem?

2. Proszę sprawdzić program (pewnie też źle)

http://wklej.to/Z2fto

3. W dokumentacji kolektor i emiter są oznaczone tak:

Natomiast na wielu innych stronach jest na odwrót:

Czyli jak to powinno być?

Link do komentarza
Share on other sites

W dokumentacji jest oznaczone poprawnie, a to, że biblioteka w Eagle'u ma obrócony fototranzystor na obrazku schematu bo tak jest wygodniej to co innego. Gdybyś rysował schemat w Eagle'u a nie a paincie to byś zauważył, że na płytce połączenie jest poprawne. Porównujesz nie to co trzeba, schemat z wzorem obudowy z dokumentacji, gdybyś porównał dokumentację z płytką to widziałbyś, że jest dobrze.

Link do komentarza
Share on other sites

Podałeś przykład poprawnego podłączenia z jednej z "wielu innych stron", a na swoim schemacie podłączyłeś czujnik inaczej. Podłącz tak jak na schemacie który dołączyłeś z tej innej strony. Ten program raczej prawidłowy, ale stan na pinie lepiej sprawdzać if(!(PINn & (1<

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Podłącz CNY70 wg tego schematu:

Wtedy zmieni ci się trochę kod.

#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 1000000L 

int main( void ){

	//PD0 dioda
	//PD1 CNy70
	DDRD = 0x01; // 00000001; PD0 wyjscie, PD1 wejscie
	PORTD = 0x02; // PD0 stan niski, PD1 stan wysoki
	int opoznienie = 1000; // jedna sekunda

	while(1)
	{
		if( !( PIND & 0x02 ) ) // 00000010, sprawdzamy (tylko ten jeden bit) czy PD1 zostało zwarte do GND
		{
			PORTD = 0x01; //PD0 stan wysoki	
		}
		else
		{
			_delay_ms(opoznienie);	
			PORTD = 0x00; //PD0 stan niski
		}
	}
return 0; // to powinno być ponieważ, funkcja main jest typu int, więc musimy zwrócić jakąś wartość
}

Tak w ogóle to człowiekowi ciężko czasami operować tylko na liczbach zapisanych szesnastkowo, więc polecam zapisać powyższy kod w ten sposób:

#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 1000000L 

int main( void ){

	//PD0 dioda
	//PD1 CNy70
	DDRD |= (1<<PD0); // 00000001; PD0 wyjscie, PD1 wejscie
	PORTD |= (1<<PD1); // PD0 stan niski, PD1 stan wysoki
	int opoznienie = 1000; // jedna sekunda

	while(1)
	{
		if( !( PIND & (1<<PD1) ) ) // 00000010, sprawdzamy (tylko ten jeden bit) czy PD1 zostało zwarte do GND
		{
			PORTD |= (1<<PD0); //PD0 stan wysoki, w ten sposób ustawiamy tylko PD0, a nie cały port	
		}
		else
		{
			_delay_ms(opoznienie);	
			PORTD &= ~(1<<PD0); //PD0 stan niski
		}
	}
return 0; // to powinno być ponieważ, funkcja main jest typu int, więc musimy zwrócić jakąś wartość
}

Gdy coś nie "ponioł" pisać 🙂

Link do komentarza
Share on other sites

Taka uwaga nie trzeba pisać w kodzie:

return 0; // to powinno być ponieważ, funkcja main jest typu int, więc musimy zwrócić jakąś wartość 

Gdyż ta instrukcja się nigdy nie wykona w powyższym kodzie. Pisanie na uC to nie to samo co pisanie aplikacji np na PC.

Link do komentarza
Share on other sites

W sumie racja, nigdy na to nie zwróciłem uwagi.

Niektóre kompilatory mogą wywalić błąd, jeśli tego nie napiszemy, ale nie jestem pewny. W sumie co to za różnica 🙂

Link do komentarza
Share on other sites

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.