Skocz do zawartości

Problem z kodem [AVR]


Byciek94

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

Link do komentarza
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.

Link do komentarza
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
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

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

Link do komentarza
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;/

Link do komentarza
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;

}

}

}

Link do komentarza
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.

Link do komentarza
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;

}

}

}

Link do komentarza
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ą.

Link do komentarza
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

Link do komentarza
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.

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.