Skocz do zawartości

Problem z odczytem stanów czujników CNY70 i atmega8


Grabki

Pomocna odpowiedź

Witajcie,
mam taki problem, że próbuję zapalić diodę jeśli czujnik wykryje czarną linię, a jeśli nie to dioda ma zgasnąć. Niestety wygląda to tak jakby nie działała pętla nieskończona- nie wiem jak to inaczej wytłumaczyć. Po stracie programu dioda się zapala i się świeci neizależnie czy czujnik jest nad linią czy nie. Napięcia sięzmieniają i dlatego nie wiem co tu jest grane. Używam komparatorów lm339.

Tak sprawdzam czujniki:

for(;;)
{


	if(PINC & 0x01)
	{
		LED_ON;

	}
	else
	{
		LED_OFF;

	}
       }

A tak mam ustawione fusebity(rezonator 16MHz):

Czy ktoś wie co tu jest grane? Bardzo proszę o pomoc.

Link do komentarza
Share on other sites

Jeżeli twierdzisz ze od strony elektronicznej wszystko wygląda poprawnie to najprawdopodobniej błąd jest w sofcie, ale w części, której nam nie pokazałeś - przedstaw cały kod programu 🙂

Link do komentarza
Share on other sites

Jestem na 95% pewien że wszystko jest ok bo sprawdzałem napięcia. Oto program:

#include <avr/io.h>
#include <util/delay.h>



//LED
#define LED (1<<PD6)
#define LED_ON PORTD |= LED
#define LED_OFF PORTD &= ~LED






int main(void)
{
  /* Linie portu C będą wejściami z podciągnięciem do VCC */
   DDRC = 0x00;
   PORTC = 0xff; 

/* Ustawienia wyjść portu B */
   DDRB |= ((1<<PB0)|(1<<PB1)|(1<<PB2));

/* Port D 01111111 */
   DDRD = 0x7f;



//Zapal diodę
LED_ON;
PORTB |= ((1<<PB1)|(1<<PB2));






_delay_ms(1000);
LED_OFF;
_delay_ms(1000);
LED_ON;
_delay_ms(1000);
LED_OFF;







//pętla nieskończona

for(;;)
{

	//sprawdzenie czujników
	if(PINC & 0x01)
	{
		LED_ON;


	}
	else
	{
		LED_OFF;

	}



}




}

Wygląda to tak, że dioda się zapala, gaśnie i zapala, i wtedy ciągle się świeci, aż do wciśnięcia przycisku od resetu. Jeśli w if'ie dam żeby dioda gasła else zapalała się to wtedy dioda gaśnie i nie świeci aż do zresetowania.

Oto schemat:

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

Jeśli jest nad linią to między czujnikiem a komparatorem jest około 4,5V, między komparatorem a uc jest 4,8V. Jeśli jest nad białą powierzchnią to między czujnikiem a komparatorem jest około 1-1,5V a między komparatorem a uc jest 0V.

Link do komentarza
Share on other sites

Pisałeś, że napięcia się zmieniają, ale to nie musi znaczyć, że zmieniają się prawidłowo. Po przeglądnięciu softu nie widze błędu. Sprawdziłeś warunek zatem wiadomo że atmega" widzi" stan wysoki na wejściu czujnika. Ja mimo wszystko obstawiam źle ustawiony próg na potencjometrze.

1. Miernikiem sprawdź napięcie na wejściach i wyjściu komparatora ( dokładnie na komparatorze, aby wykluczyć gdzieś przerwe w płytce) i napisz jaki zakres uzyskujesz z czujnika i jakie napięcie z potencjometru.

2. Zewrzyj sprawdzane wyjście bezpośrednio do masy -jak dioda zmieni stan to odpuść "programiście" i gadaj z "elektronikiem" (80-90% szans). Jak będzie bez zmian to w forze daj jeszcze prostsze przypisane PORTD=PINC. Wtedy sprawdzisz wszystkie naraz.

Link do komentarza
Share on other sites

Od strony obsługi portu C i zapalania diody, program masz napisany prawidłowo.

[ Dodano: 24-09-2011, 15:45 ]

Pytanie dodatkowe, choć nie związane bezpośrednio z Twoim problemem: Jak informujesz kompilator o częstotliwości zegara?

I uwaga dodatkowa: Naucz się rysować schematy w taki sposób:

http://mikrokontrolery.blogspot.com/2011/04/jak-projektowac-czytelne-schematy.html

by nie mieć problemów z większymi projektami w przyszłości. Połączenia prowadzone przez symbole układów, to marny pomysł.

[ Dodano: 24-09-2011, 15:49 ]

I jeszcze dwa pytania:

1. Nie masz czasem warningów podczas kompilacji?

2. jaki tryb optymalizacji kodu masz włączony?

[ Dodano: 24-09-2011, 15:52 ]

Ponieważ nie odpowiadasz, a ja idę popatrzeć na F1, to zostawiam Ci link a propos moich ostatnich pytań:

http://mikrokontrolery.blogspot.com/2011/04/bledy-kompilacji-programu.html

Link do komentarza
Share on other sites

bez komentarza... Miałem przerwaną ścieżkę między komparatorem a uc. Bardzo dziękuję za pomoc.dondu, używam AVR Studio, tam się wpisuje częstotliwość, warningów nie mam wszystko już działa. Teraz już tak projektuję schematy jak w linku który mi podałeś, ale ten schemat był projektowany zanim to przeczytałem.

Dobra ja też idę na F1. Jeszcze raz wielkie dzięki.

edit:

Mam jeszcze jedno pytani. Jak widzicie na schemacie, zrobiłem błąd i przycisk mam podpięty pod VCC zamiast GND. Przez to mam na pinie uc stan nieustalony. Czy mogę to jakoś wyeliminować? Czy można np. poprzez jakiś rezystyor podciągnąć do GND? Bo normalnie podciąga się rezystorem do VCC, ale jestem ciekaw czy można tak do GND. A może jest jakiś inny sposób na to?

Link do komentarza
Share on other sites

Mam jeszcze jedno pytani. Jak widzicie na schemacie, zrobiłem błąd i przycisk mam podpięty pod VCC zamiast GND. Przez to mam na pinie uc stan nieustalony. Czy mogę to jakoś wyeliminować? Czy można np. poprzez jakiś rezystyor podciągnąć do GND? Bo normalnie podciąga się rezystorem do VCC, ale jestem ciekaw czy można tak do GND. A może jest jakiś inny sposób na to?

Tak, możesz to zrobić rezystorem np. 1k. Możesz także spróbować większy tak do 10k. Powinno działać bez problemu.

AVR nie mają wewnętrznych pull-down, a szkoda - niektóre uC mają 🙂

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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