Skocz do zawartości
Zaloguj się, aby obserwować  
kermit

[C]problem z wywołaniem funkcji

Pomocna odpowiedź

otóż jestem w trakcie pisania programu do mojego minisumo i jako ,że C dopiero się ucze to już na samym początku napotkałem problem z którym nie mogę sobie w żaden sposób dać rady ,a mianowicie konfiguracje portów i PWM do sterowania silnikami chciałem napisać w osobnych funkcjach i tak też zrobiłem ,ale niestety takie rozwiązanie za nic nie chce działać .Sprawa wygląda inaczej gdy zawartość funkcji wkleje do funkcji głównej ,czyli main ,wtedy wszystko działa bez zarzutu ,czyli silniki zaczynają kręcić się do przodu

#include <avr/io.h>

#define F_CPU 8000000L
#define D1 PA3
#define D2 PA4
#define D3 PA5


void _tim1_set(void){
TCCR1A |= (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);
TCCR1B |= (1<<WGM12)|(1<<CS11);
DDRB |= (1<<PB5)|(1<<PB6);

}



}

void jazda_przod(void) {  //
DDRD |= (1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD5); //porty silników- wyjściowe
OCR1AL = 50;  //ustawienie wypełnienia pwm 50/255-silnik lewy
OCR1BL = 50; //silnik prawy
PORTD |= (1<<PD3)|(1<<PD4); // kanały do sterowania silnikami - obroty do przodu

}


int main(void) //program główny
{

_tim1_set(); //uruchomienie timera oc1 i konfiguracja pwm
jazda_przod(); //ustawienie wypełnienia PWM i ustawienie portów sterujących mostkiem(silnikami)


while (1)
{
;
}

}

aha program jakiego używam to avr studio 5

aha ogólnie próbowałem testować też inne funkcje czyl np _delay_ms() -oczywiście po dodaniu odpowiedniego pliku nagłówkowego ,niestety ta funkcja też nie działa ,a dziwi mnie to tym bardziej,że po symulacji w sumulatorze program działa normalnie czyli wykonuje skoki do tych funkcji.Bawię się z tym już od 2dni i już powoli tracę cierpliowośc ,mam nadzieję ,że ktoś będzie w stanie mi z tym pomóc i odrazu z góry dziękuje

Udostępnij ten post


Link to post
Share on other sites

Program się nie kompiluje, czy się kompiluje ale nie działa??

Jakiego procka używasz??

Spróbuj zamienić

OCR1AL = 50;

OCR1BL = 50;

na

OCR1A = 50;

OCR1A = 50;

Wstaw do pętli while jakąś dowolna instrukcje. Np.: PORTB |= (1<

A i spróbuj nie zaczynać nazw funkcji od podkreślenia _ chyba można go tam używać ale w sumie po co ryzykować. jest tyle różnych liter przecież.

Udostępnij ten post


Link to post
Share on other sites

@davidpi

niestety umieszczenie instrukcji w pętli ,zmiana nazw instrukcji ani nazwa rejestrów na OCR1A i OCR1B 😕 ogólnie już zaczyna mi brakować pomysłów,wcześniej kombinowałem też z wrzuceniem tych funkcji do osobnego pliku .h też bez efektu

Aha zapomniałem napisać ,że procek to atmega128 i ,że program kompiluje się bez problemu ogólnie cały ten problem można streścić w jednym zdaniu : poza funkcją main instrukcji nie chcą sie wykonywać

Udostępnij ten post


Link to post
Share on other sites

Zakładając, że poprawie skonfigurowałeś timer, widze brak w pętli głównej: sei(); , który zezwala na przerwania 🙂. W pętle nieskończoną wstaw coś np. gaszenie/zapalanie diody.

@EDIT dodaj kanały PWM jako wyjscie, bo narazie są ustawione piny tylko do sterowania silnikami. Dodaj jakieś info o PWM(ilu bitowy, preskaler etc.)

Udostępnij ten post


Link to post
Share on other sites

kanały pwm są ustawione na wyjścia ,ogólnie wszystko jest skonfigurowane ok,ponieważ bo wycięciu kodu z tych obydwu funkcji i wklejeniu ich bezpośrednio do funkcji main wszystko jest tak jak być powinno czyli silniki się uruchamiają ,wstawienie do pętli głównej instrukcji nic nie daje , próbowałem już tego zgodnie z radą davidpi ,w sumie to wygląda tak ,bawiłem sie teraz zapalaniem diod które mam na tej płytce i wychodzi na to ,że mega wiesza się jak napotka na wywołanie funkcji ,poniważ jak wstawie instrukcje zapalenia diody przed wywołaniem tych funkcji dioda się zapala, a jeśli za nimi dioda nie odpowiada.Ogólnie zastanawiam się czy problemem nie jest to ,że uzywam atmegi 128A ,a w AVR studio wybrałem Atmega128 ,z tego względu ,że Atmegi128A nie ma w avrstudio5 , z tego co wyczytałem w google to powinny być zgodne ,ale pewien nie jestem.

Aha ,zezwolenia na przerwania ,czyli instrukcji sei() nie wstawiałem ,z tego względu ,że jak narazie przerwań nie używam

Udostępnij ten post


Link to post
Share on other sites

W fuse bitach musisz odznaczyć bit odpowiedzialny za kompatybilność ATmega128 z Atmeag103.

Wtedy ruszy na 100% 🙂

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

@nes86 - no i o to chodziło ,teraz wszystko śmiga bez problemu 😋 wielkie dzięki za pomoc 🙂

Udostępnij ten post


Link to post
Share on other sites

@nes86 nieźle kolego 😉 . W życiu bym o tym nie pomyślał

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!

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.

Zaloguj się, aby obserwować  

×
×
  • Utwórz nowe...