Skocz do zawartości

[Atmega48][C] Problem z portami


nynciu

Pomocna odpowiedź

Witam

Mam do zaprogramowanie układ, który podesłał mi znajomy. Poniżej tabelka, jak uruchamiać odpowiednie silinik:

Już mecze się 3 dni i udaj mi się uruchamiać silniczki, ale każde osobno. Gdy próbuje włączyć, żeby do przodu jechały lewy i prawy.. to kręci się tylko prawy i strzelają przekaźniki.

// porty
DDRC = 0xFF;
DDRB = 0xFF;
DDRD = 0xFF;

//jeden silnik prawy
	PORTB = 0b00010000;
	PORTD = 0b00000010;
//drugi
	PORTC = 0b00000110; 

Chyba, że żle programuję te porty?

Czy może to być związek z PWM, że silnik się nie kręci?

Z góry dziękuje za pomoc i pozdrawiam

Maricn

Link do komentarza
Share on other sites

Powyższy KOD, to chciałem pokazać, które piny włączam..czy dobrze to robie..

Aktualny program, który znalazłem i dopasowałem do tej tabelki. Silnik prawy, wg tej tabelki śmiga ładnie, w prawo i w lewo. Silnik lewy natomiast działa tylko w jedną stronę i kompletnie nie działa, jak chce jechać do przodu, czyli muszę włączyć silnik prawy i lewy :/. Mam wrażenie, ze to coś z tą płytką jest nie tak..albo też wnioskuje, że autor płytki, źle uzupełnił tabelkę..

#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdlib.h>


#define cbi(sfr, b) (sfr &= ~(1<<b)) 
#define sbi(sfr, b) (sfr |= (1<<b))  


void lkp() { cbi(PORTC,2);  sbi(PORTC,0); sbi(PORTD,1); } // lewe koło przód
void lkt() { sbi(PORTC,2);  cbi(PORTC,0); sbi(PORTC,1); } // lewe koło tył
void lks() { cbi(PORTC,0);  cbi(PORTC,2); cbi(PORTC,1); } // lewe koło stop

void pkt() { sbi(PORTC,3);  cbi(PORTB,4); sbi(PORTD,1); } // prawe koło tył
void pkp() { cbi(PORTC,3);  sbi(PORTB,4); sbi(PORTD,1); } // prawe koło przód
void pks() { cbi(PORTC,3);  cbi(PORTB,4); sbi(PORTD,1); } // prawe koło stop

  //sterowanie jazdą
void przod() { lkp(); pkp(); } // jazda do przodu
void tyl()   { lkt(); pkt(); } // jazda do tyłu
void lewo()  { lkt(); pkp(); } // skręt w lewo
void prawo() { lkp(); pkt(); } // skręt w prawo
void stop()  { lks(); pks(); } // wyłącz silniki


int main(void)
{

 DDRB  = 0xff; // port B jako wyjscie
 DDRC  = 0xff; // port C jako wyjscie
 DDRD  = 0xff; // port D jako wyjscie

przod();  
}

Schemat:

6npv1okcvp.png

Inne silniczki mniej więcej działają(wieżyczka,armata)... walczyłem i udało mi się uruchamiać. Natomiast nie mogę uruchomić lewy..z pinami na port C.

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

Czy to jest schemat, który jest faktycznie wykonany w tym czołgu?

Jeżeli chodzi czy tableka ma być do tego schematu, to odpowiadam tak. Chociaż mam wrażenie, że chyba te tabelka nie bardzo się zgadza z tym schematem. Ale to dostałem od Kolegi. Jedyna róznica jest taka, że w tym schemacie jest Atmega8, a nie 48. Ponieważ kolega powiedział, że w programie który porjektował nie ma "tego" modelu. Więc użył podobnego.

Link do komentarza
Share on other sites

Jeżeli więc schemat jest faktycznie taki:

Schemat: Obrazek

to zawiera błędy, które uniemożliwiają jego prawidłową pracę.

1. brak podłączenia do GND emiterów tranzystorów Q10-Q13

2. brak podłączenia przekaźników K2-K6 do napięcia zasilania.

3. Co mają na celu rezystory R5,R6, R9-R12 oraz kondensatory C10-C15?

PIN RESET

Wykorzystujesz pin PC6(RESET) do sterowania tranzystora Q8. Jakim programatorem programujesz ten mikrokontroler?

Pytanie dość istotne ponieważ (o ile dobrze pamiętam), aby móc wykorzystać ten pin jako PC6 musisz wyłączyć RESET w fusebitach, a to uniemożliwi programowanie przez ISP które masz pokazane na schemacie. Coś tu jest "nie teges".

Pomijam już niepotrzebne komplikowanie układu sterowania silnikami za pomocą przekaźników i tak dużej ilości tranzystorów, tym bardziej, że nie wykorzystujesz PWM, a przynajmniej nie PWM sprzętowy.

PS.

Zamieszczaj obrazki zgodnie z regulaminem, a nie na zewnętrznych serwerach.

Link do komentarza
Share on other sites

Właśnie się dowiedziałem, że ten schemat nie jest aktualny i niestety prędko nie dostane "aktualnej" wersji. Ale chyba powyższe przypuszczenia są prawdziwe. Z tą płytką jest coś nie tak. Nie mogę uruchomić jednocześnie "2 silników". Silnik lewy działa tylko wtedy jak inne wyłączę. Więc nie wiem co robić 😥

Rozumiem, że pewnie bez aktualnego schematu ciężko będzie coś mądrego powiedzieć.

Jedyne pytanie jakie mogę mieć to:

#define cbi(sfr, b) (sfr &= ~(1<<b)) // bit 0 na pin portu
#define sbi(sfr, b) (sfr |= (1<<b))  // bit 1 na pin portu

   void lkp() { sbi(PORTC,2);  sbi(PORTC,1); cbi(PORTD,1);  } // lewe koło przód
   void lkt() { sbi(PORTC,0);  sbi(PORTC,1); cbi(PORTC,2); } // lewe koło tył 
void lks() { cbi(PORTC,0);  cbi(PORTC,1); cbi(PORTC,2); } // lewe koło stop

   void pkt() { cbi(PORTD,1);  sbi(PORTD,1); sbi(PORTC,3); } // prawe koło tył
   void pkp() { cbi(PORTC,3);  sbi(PORTB,4); sbi(PORTD,1); }
   void pks() { cbi(PORTC,3);  cbi(PORTB,4); sbi(PORTD,1); } 

void wiezal() { cbi(PORTC,5);  sbi(PORTD,2); } 
void wiezap() { cbi(PORTD,2);  sbi(PORTC,5); }

przy wywołaniu w main:

pkp();lkp(); 

Zgodnie z schematem powinny działać dwa silniczki jednocześnie i dobrze uruchamia porty?

Podobno osoba projektująca płytkę przestawiła fusebit, tak. Więc powinno działać.

Link do komentarza
Share on other sites

Właśnie się dowiedziałem, że ten schemat nie jest aktualny i niestety prędko nie dostane "aktualnej" wersji. Ale chyba powyższe przypuszczenia są prawdziwe. Z tą płytką jest coś nie tak. ... Więc nie wiem co robić 😥

Jak rozumie masz płytkę - na jej podstawie rozrysuj schemat samodzielnie.

Link do komentarza
Share on other sites

Nareszcie udało mi się dojść po płytce co i jak uruchamiać. Troszkę okazało się, że złe silniczki były i kręciły się tylko w 1 stronę. Teraz mam kolejny problem..chce by sygnał wysłany z pilota( dowolny klawisz) uruchamiał silniczek. Napisałem program zgodnie z kursem na hobby i niestety nic nie dzieję się :/

Mogliśbyście obejrzeć co jest nie tak :/. Program prawie przepisany, jedynie zmieniłem port, bo taki port odbierac sygnał z USB, w której jest irda. Do usb jest podłaczona irda z (3 nożkami, ręczna robota). Kolega mówił, że nie powinno być problemu, a jednak nie drga. Portu raczej jestem pewny.. coś chyba z programem jest nie tak.

// EDIT

Właśnie znalazłem stary pilot z Video i śmiga 🙂

Pozdrawiam

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.