Da li si hardverski dobro rije¹io sklop? Ja sam jednom zaboravio staviti kondenzator (100nF) kod mikrokontrolera i de¹avale su mi se svakakve gluposti, a bio sam uvjeren da ne¹to ne valja sa programom. Ima¹ li stabiliziranih 5V, kako upravlja¹ motorom?
za sada koristim 4 pina na pic-u, koristim neku shemu rotacije brojaca na PORTA: 1,2,4,8 kojom mjenjam =
stanje PORTA i to koristim kao ulaz na H-mostu l298. inkrementacijom =
steper ide u jednom smjeru i obrnuto. ako mi se ucini da je potrebno imati jaci steper, ili to trzanje bude =
preocito, onda cu kupiti nesto ovakvo za 13-15 dolara, iako jos ne znam = =
sta njemu treba... pretpostavljam jedan pin koji daje "idi sad" i jedan = =
pin koji kaze smjer
formatting link
sh=3Ditem1e71b9174a
za sada to moram pustiti i posvetiti se PC-softveru pa se vratim ovoj =
problematici nekad kasnije. inace, procitao sam na jednom forumu da je kod timera (a koristim timer = za =
vrijeme kad se steper pokrece) potrebno program sloziti da bude:
if INTCON.TMR0IF then TMR0=3D195 'setiranje vremena timera INTCON.TMR0IF =3D 0 ' clear the flag '------------------------ 'rutina koja obradjuje stvar '------------------------ end if
a ne ovako:
if INTCON.TMR0IF then '------------------------ 'rutina koja obradjuje stvar '------------------------ TMR0=3D195 'setiranje vremena timera INTCON.TMR0IF =3D 0 ' clear the flag =
end if
-ne znam koliko ima veze, ali isprobat cu to tek kad nadjem vremena, iak= o, =
kako kaze "chupo", taj pic je dovoljno brz da mu taj redosljed stvari ne= =
U prvom slucaju bi se, ako bi ti trajanje rutine bilo predugo mogo propustiti jedan interrupt. Jer, ako bi se za vrijeme dok se jos izvrsava obrada desi novi timer overflow pa bi ga ti na kraju rutine resetirao, onda bi se morao cekati novi overflow, a ako flag resetiras odma na pocetku i ako se overflow desi za vrijeme obrade, ce se novi interrupt generirati odmah nakon izlaska iz obrade prethodnog. Ali rutina za obradu ne smije trajati vise vremena nego sta je vrijeme izmedju timer overflow-a. Ako se npr. TMR interrupt generira 1000 puta u sekundi, onda se ne smije desiti da ti rutina traje vise od 1/1000 s.
Ima veze - naime, u drugom sluèaju se timer re-inicijalizira tek po izvr¹enju rutine. Ako vrijeme izvr¹avanja zbog nekog razloga nije uvijek isto (npr. ima nekakvih if-else uvjeta i slièno), niti vrijeme izmeðu dva timer-overflowa neæe biti isto. U prvom sluèaju se timer re-inicijalizira na poèetku, uvijek jednako, bez obzira na ono ¹to se izvr¹ava iza toga, pa æe i vrijeme izmeðu overflow-a biti isto. U tvojoj aplikaciji, to æe dati "glatki" rad motora jer æe step-impulsi biti uvijek pravilno razmaknuti.
Inaèe, pravilo je da interrupt service rutine budu èim je kraæe (i br¾e) pa bih ja to napravio ovako:
- timer interrupt rutina iz mem.lokacije proèita novo stanje porta (ili vi¹e njih) i postavi nekakav flag. Glavni program u petlji detektira postavljeni flag, izraèuna novo stanje za portove i upi¹e u mem.lokaciju iz koje æe ih int. rutina "pokupiti". Jedini uvjet da ovo radi savr¹eno je da glavni program zavr¹i sa raèunom prije slijedeæeg interrupta.
--
- while (1);
"I don't believe anything I hear and only half of what I see..."
Krivo sam napisao - ovo sta je napisao while(1) je tocno.
Moj komentari bi vrijedili ako bi prvi slucaj bio:
if INTCON.TMR0IF then TMR0=195 'setiranje vremena timera '------------------------ 'rutina koja obradjuje stvar '------------------------ INTCON.TMR0IF = 0 ' clear the flag end if
a drugi:
if INTCON.TMR0IF then TMR0=195 'setiranje vremena timera INTCON.TMR0IF = 0 ' clear the flag '------------------------ 'rutina koja obradjuje stvar '------------------------ end if
U svakom slucaju, najprije treba reinicijalizirati timer (brojac) a ako je rutina napisana ispravno (ako traje manje od vremena izmedju dva timer overflow-a), onda nema veze da li ces flag resetirati na pocetku ili na kraju.
Atmeli recimo imaju CTC (Clear Timer on Compare Match (Auto Reload)) mode pa se u tom mode-u reinicijalizacija rjesava automatski, a svaki interrupt ima svoj vector pa se ne mora zezati s odgonetavanjem zbog kojeg je interrupt-a rutina pozvana. Ovaj PIC kojeg koristis ima interrupt priority mode pa bi se s tim (vjerojatno) moglo postici da tvoje 2 interrupt rutine budu odvojene, a u datasheet-u vidim poglavlje 'Module Reset on CCP Special Event Trigger' - cini se da je to nesta ko Atmelov CTC mode (pa da se nakon interrupta timer reinicijalizira automatski). Nisam radio s 18F2450 pa ne znam 100% ali mi izgleda ko da se radi o istoj stvari.
Kod njega je situacija malo specificna jer mu za TMR1 vrijeme izmedju interrupt-a nije konstantno nego se svaki put unutar interrupt rutine na osnovu parametara (PWM) za svaki od serva izracunava vrijednost s kojom ce se timer inicijalizirati ali to je samo nekoliko linija koda na 16 MHz a i ta mu rutina izgleda ne radi probleme. U rutini za TMR0 sam previdio da se najprije zove potprogram pa se tek onda inicijalizira timer - cini se da bi to mogo biti uzrok trzanja.
Gledam mailove i ne vidim da smo diskutirali o tom redoslijedu ali sad kad ponovo gledam source, vidim da najprije pozivas step1_MOVE a tek onda reinicijaliziras TMR0, moguce da je to uzrok - reinicijalizaciju timera obavezno stavi na vrh pa javi da li je nestalo trazanja...
Nije problem u brzini (baud rate), veæ u Windowsima. Ako misli¹ upravljati koracima step-motora izravno preko RS232 i Windowsa, zaboravi. Tu je latencija Windowsa jednostavno prevelika. I jo¹ je gore preko USB-RS232 konvertera. A osim toga, generiranje vi¹ih frekvencija (>10Hz) iz Win7 (kao ¹to si i sam primjetio) takoðer ba¹ ne ide. Windowsi jednostavno NISU za real-time aplikacije (mada postoje RT-kerneli za iste, no to je veæ druga prièa). Upravo zato se najèe¹æe i koriste pametni kontroleri kojima, umjesto izravnih komandi za svitke motora, ¹alje¹ naredbe tipa "naprijed 150 koraka" ili slièno.
Alternativa je da napi¹e¹ vlastiti driver za RS232 port i kontrolu motora ili da krene¹ putem MACH3 softvera...
--
- while (1);
"I don't believe anything I hear and only half of what I see..."
Pa kad veæ ima¹ mikrokontroler, za¹to u njemu ne implementira¹ kompletno upravljanje motorima, a iz PC-a ¹alje¹ samo ¾eljenu poziciju? To æe sigurno raditi bolje...
--
- while (1);
"I don't believe anything I hear and only half of what I see..."
da, nema druge pa evo, radio sam danas na tome. as of today, PC moze poslati:
-poziciju stepera
-brzinu stepera
-steper enable (...i ostalo sto nije povezano s ovim...)
a pic moze poslati:
-trenutnu poziciju stepera
-stanje 4 switcha (krajnje mrtve tocke)
pic moze:
-sam inkrementirati dok ne dovede ili motore ili steper u zeljenu ili =
krajnju poziciju
-sam prekinuti inkrementaciju pri nailasku na neki od swicheva
pic jos uvijek ne moze:
-zapamtiti gdje je bio u koje vrijeme ili bi mogao, ali bi to previse =
zakompliciralo sve (recimo mem kartica bi trebala)
-sam prepoznati kad je dobro vrijeme da steperu smanji struju (odnosno, = =
upali PWM) dok samo stoji na mjestu
-imati glatke prijelaze (recimo neka kubna funkcija) izmedju naglih =
promjena pozicije koju dobiva s PC-a
-u ovisnosti o jednom proizvoljnom parametru (steper pozicija) mjenjati = =
drugu (servo x)
-...
........................................................... s obzirom na kolicinu problema, skuzio sam zasto svaki softver ima tolik= o =
bagova i updatea. zato jer je bitno napraviti makar nesto da radi, pa se= =
poslije vracati onome sto nije dovoljno dobro :) od svega ovoga najvise me iznenadilo ovo s PC-em dakle, ideja svega ovoga sto radim jest ponovljivost. korisnik ce jednom= =
nesto napraviti, bez neke pravilnosti, a sistem bi trebao moci zapamtiti= =
sve to i ponoviti radnju proizvoljan broj puta (ocekuje se uvijek dostup= an =
PC). sada, ta ponovljivost ce biti rezultat PC funkcije koja snima stanje =
svakih 50ms.
a sad opet O.T. jos jedna stvar koju sam naucio u vezi PC-a:
-standardni mis (od 100 kn) na windowsima je prilicno neprecizan, odnosn= o, =
"skakutav" je! ako se on koristi kao REAL_TIME davac inputa (koristenjem slider kontrol= e =
u .NET-u), dobije se trzava stvar. mozda je neki gejmerski mis bolji, al= i =
koji korisnik ima gejmerski mis?
drugo: mislim da cu morati prouciti direct-x da vidim kakvo je stanje s =
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.