Skocz do zawartości
Byciek94

Problem z kodem [AVR]

Pomocna odpowiedź

Witam , chciałbym zaprogramować sowjego minisumo, i coś mi nie idzie.

na początku chciałem zaczać od napisania jednego kodu dla czujnika przeciwnika który gdy pojawi sie przeciwnik spowoduje zaświecenie sie diody.

#include

int main(void)

{

DDRA = 0xFF;

DDRC = 0x00;

PORTC = 0xFF;

while(1)

{

if(!(PINC & 0x08)) PORTA = 0x0F;

}

}

sygnał z sharpa jest podłączony do 4 bitu portu C. ledy są podłączone z jendej strony do zasilania a z drugiej do uC.(bity 5,6,7,8) problem polega na tym że po wgraniu programu te diody swiecą sie odrazu i nie ma żadnej reakcji. sharpy są podłaczone dobrze(sprawdzałem na sucho). Nie wiem czy to wina kodu czy spalenia uC. korzystam z Atmegi 32. Prosze o pomoc

Udostępnij ten post


Link to post
Share on other sites

Jeśli podłączyłeś od PC4 to masz błąd w kodzie bo powinno być:

if(!(PINC & 0x10))

Po drugie skoro to Atmega32 a na tym pinie jest JTAG i dopóki przy pomocy fuse bitów go nie wyłączysz ten pin nie będzie funkcjonował jako wejście/wyjście.

Udostępnij ten post


Link to post
Share on other sites

Wstaw to w funkcji main jeśli nie korzystasz z jtag to wtedy zostanie on wyłączony i będziesz mógł normalnie wykorzystać porty

MCUCSR |= (1<<JTD); 
	MCUCSR |= (1<<JTD); 
	MCUCSR |= (1<<JTD);								//wylaczanie jtag atmega32

Udostępnij ten post


Link to post
Share on other sites

ok, zastosowałem sie do podpowiedzi i działa jak powinno. Mam dwa pytania, o co chodzi z tym całym JTAGiem i czemu przy PINC & ma byc 0x10"??

Udostępnij ten post


Link to post
Share on other sites

Atmega posiada interfejs do programowania typu jtag coś takiego jak spi, i fabrycznie jest on uruchomiony przez producenta i dlatego dopóki nie włączysz go albo fusebitami albo tym kodem co podałem to piny pc2 do pc4 nie nadają się do zwykłego wykorzystania. A ta instrukcja oznacza, że jeżeli na pc4 jest "1" to wykonaj coś, dlaczego? bo 0x10 w szesnastkowym odpowiada 00010000

Udostępnij ten post


Link to post
Share on other sites

ok rozumiem, mam jeszcze pytanie jak zroibc żeby te diody gasły po tym jak obiekt z pola czujnika zniknie, próbowałem zastosowac pp else w tym ifie ale jakos nie działa;/

Udostępnij ten post


Link to post
Share on other sites

Tylko Ty wiesz dlaczego nie działa, bez kodu nic nie poradzimy.

Udostępnij ten post


Link to post
Share on other sites

#include

int main(void)

{

MCUCSR |= (1<

MCUCSR |= (1<

MCUCSR |= (1<

DDRC = 0x00;

PORTC = 0x08F;

while(1)

{

if(!(PINC & 0x08))

{

DDRA = 0xFF;

PORTA = 0x0F;

}

else

{

DDRA = 0xFF;

PORTA = 0xFF;

}

}

}

Udostępnij ten post


Link to post
Share on other sites

Najpierw zacznijmy od tego, że instrukcja DDRX (X dany port) użwamy tylko i wyłącznie na początku programu aby ustawić czy dany pin jest jako wejście czy wyjście, więc nie wiem po co w ifie i else go używasz, stan pinu ustawiasz instrukcją PORTX.

EDIT: pisząc program używaj wcięć bo łatwiej się połapać co do czego.

Udostępnij ten post


Link to post
Share on other sites

Poprawiłem ale nadal diody nie gasną, wiecie może czego to przyczyna ??

#include

int main(void)

{

MCUCSR |= (1<

MCUCSR |= (1<

MCUCSR |= (1<

DDRC = 0x00;

PORTC = 0x08F;

DDRA = 0XFF;

while(1)

{

if(!(PINC & 0x08))

{

PORTA = 0x0F;

}

else

{

PORTA = 0xFF;

}

}

}

Udostępnij ten post


Link to post
Share on other sites
PORTC = 0x08F;

a nie powinno być tam

PORTC = 0x08;

Spr czy sobie miernikiem czy podciąganie do vcc jest aktywne na tym pinie.

Udostępnij ten post


Link to post
Share on other sites

Sterownie mostkami jest bardzo proste. Ustawiać "0" lub "1" na pinach już potrafisz. Tak samo jak zapalałeś/gasiłeś diodę, będzie wybierał kierunek obrotów silnika.

Teraz musisz uruchomić PWM, dzięki któremu będziesz sterował prędkością silników. Na początek możesz jednak tego nie robić i ustawić na wyjściach PWM (a i b) logiczne "1". Wtedy silniki będą działały z maksymalną prędkością.

Udostępnij ten post


Link to post
Share on other sites

czyli aby sterowąc kierunkiem silinika ustawiam 0 lub 1 na AIN i BIN mostka H ??

[ Dodano: 10-01-2014, 20:36 ]

OK, już chyba rozumien. napisałem Kod który gdy przedmiot znajdzie sie w polu czujników włącza silniki a gdy nic nie ma świeca sie ledy. Problem z tym że dizała mi tylko jeden silnik(nie wiem czy to wina kodu czy spalonego mostka(sprawdzałem połączenia i wysztsko jest ok)

int main(void)

{

MCUCSR |= (1<

MCUCSR |= (1<

MCUCSR |= (1<

DDRC = 0X01;

PORTC = 0XFE;

DDRA = 0XFF;

DDRD = 0XFF;

while(1)

{

if(!((PINC & 0X10))|(!(PINC & 0X08)))

{

PORTA = OXFF;

PORTD = OXB8;

}

else

{

PORTD = 0X00;

PORTA = 0X00;

}

}

}

Czujniki podłączone są do PC3 i PC4

dwa kanały pwm PD4 I PD5

Prosze o pomoc

Udostępnij ten post


Link to post
Share on other sites

Sprawdzałeś sobie miernikiem czy pojawia się napięcie 5v jak czujnik zareaguję i czy to dociera do mostka? spróbuj go też testowo odpalić bez procka, ja zawsze na płytce stykowej sprawdzałem czy mostek chodzi żeby potem nie szukać co nie tak.

Udostępnij ten post


Link to post
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!

Gość
Napisz odpowiedź...

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