Skocz do zawartości

[C]problem z wywołaniem funkcji


kermit

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

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

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

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

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

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

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.