Skocz do zawartości

Problem z kodem [AVR]


Pomocna odpowiedź

Napisano

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

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.

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

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"??

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

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;/

#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;

}

}

}

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.

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;

}

}

}

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

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

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.

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