Nefunkcni pocitani vlozenych funkci – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Nefunkcni pocitani vlozenych funkci – Mikrokontroléry – Fórum – Programujte.comNefunkcni pocitani vlozenych funkci – Mikrokontroléry – Fórum – Programujte.com

 

Hanisss0
Newbie
9. 6. 2011   #1
-
0
-

Zdravim, pro nezasvecene, mam nejaky potenciometr, z toho lezou libovolne hodnoty a ja se snazim jejich prubeh vylepsit aby to moc neodskakovalo apod. K tomuto nereste detaily, mam jiny problem, ty filtry co mam v programu napsane mi nechteji pocitat.

Takze ADC1 bere hodnoty z potenciometru a pak hodnoty posila do predem vlozenych funkci a vypocty by mely generovany na PWM signal funcki PWM1. Vsechno ostatni v pragramu je plne funkcni, kdyz tam zadavam hodnoty primo z ADC1 generovani pwm i jeho hardwarove osetreni je v cajku. Problem je kdyz tam dosadim hodnoty z adc upravene danymi funkcemi, vysledek je "stejny" jakoby tam hazeli rovnou to co z toho ADC aniz by probehl vypocet...nevim jestli to tam spatne volam nebo chybi neco v define nebo knihovna??? netusim.... pls help...zkouknete to, beztak to bude nejaka blbost, diky moc!!!!

Nahlásit jako SPAM
IP: 94.113.26.–
KIIV
~ Moderátor
+43
God of flame
9. 6. 2011   #2
-
0
-

To Hanisss : zkousel sis to krokovat?

+ da se docela snadno vyhnout i pointeru... stejnou praci udela bez problemu i index a lip se kontroluje (hlavne z debugeru)

staticke promenne se daji dat globalne (muze v pohode stacit jeden buffer - usetri se misto - stejne nepouzivas vic typu filtrovani naraz)

preruseni nepouzivas takze nemusi byt volatile

Nahlásit jako SPAM
IP: 212.136.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hanisss0
Newbie
10. 6. 2011   #3
-
0
-

To KIIV : Mno nezkousel....a ty pointery neres, ty funkce jsou napsany spravne, mam to potvrzene a nez bych zjistil jak se to dela jinak...

mno a prave proto ze pouzivam vzdycky jen jeden filtr tak je jedno ze tam mam napsane dva buffery...vic mista taky nepotrtebuju...ja proste vim ze toto funguje, ze to je spravne, chci se zamerit na to kde je chyba, indexy a jine, s tim si budu hrat a naucim nekdy az bude cas...

Mno jasne preruseni nepouzivam, to jsem tam zrusil a spravilo se tim i to PWMko ktere jsem predtim resil, delalo mi to tam jen bordel, ted vim ze elektronika uz je plne funkcni, program by taky mel byt, az na to ze to nepocita....

ale zkousel jsem tohle, napsat to oklikou.

int main(void)
{

uart_init();
init_port();
init_PWM1();
init_PWM2();

prumer = avg(read_ADC1()/4);

while(1){
PWM1(prumer);
//PWM1(read_ADC1()/4);
//PWM1(avg(read_ADC1())/4);
//PWM1(gauss(read_ADC1()));
PWM2(read_ADC2());

}
}

vysledkem byly nizke hodnoty s temer konstantnim prubehem,...je to dobre takto napsane? myslim ze jo...je to ale divne, melo by to byt to same, jako kdyz to tam mam napsane primo ne? ale tgrosku by se tim dalo vysvetlit proc to (kdyz to je napsane primo) ma stejny prubeh jak bez filtru, ze to nasobi malou konstantni hodnotou...mozna, mozna ne, ja nevim...

Takze mysdlis ze volani tech funkci je ok? ja si totiz pak rikal ze to mam tam treba nejak spatne...nebo v define nikde nic nechybi? knihovna? Diky moc za odpoved...

Nahlásit jako SPAM
IP: 89.29.123.–
KIIV
~ Moderátor
+43
God of flame
10. 6. 2011   #4
-
0
-

prave proto, kdyz mi neco nefunguje jak ma, pripichnu jtag a pekne si to odkrokuju.. hodi se breakpoint na zacatek te funkce a nechas si zobrazit vsechny promenny a to pole, samozrejme to predpoklada aspon megu 16 (a ze nebudes ty vstupy menit - je to takhle o dost pomalejsi - hlavne kdyz se zastavuje na breakpointu)

Nahlásit jako SPAM
IP: 212.136.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hanisss0
Newbie
10. 6. 2011   #5
-
0
-

To KIIV : ok, polopate prosim:-) co mam pripojit, kde to mam sehnat, jtag je jen rozhrani podporovane procesorem, to vim, takze cos tim myslel. A co myslis ze nebudu menit vstupy, ja zadne vstupy nemenim...Tak rekni co a jak a ja hned jak to vykutim ti zpetne reknu, diky moc.

Nahlásit jako SPAM
IP: 89.29.123.–
KIIV
~ Moderátor
+43
God of flame
10. 6. 2011   #6
-
0
-

To Hanisss : no jtag byva u vsech 40 a vice pinovych Atmega procesoru (obvykle cast portu C)
na to, abys mohl debugovat potrebujes nejaky jtag debugger (avr dragon, jtag ice, jtag ice mk II... ) a avr studio (+ win avr - tj port gcc)
pak uz to jen pospojovat.. ale pokud nemas tak mas vicemene smulu a budes muset ladit jinak

- da se pripadne rozjet seriovej port a posilat hodnoty na nej
- da se pridat display a zobrazit na nem
- da se to proste zobrazovat primo na jeden nebo dva porty (pres led) - tady ale budes potrebovat aspon neco cim to zastavovat
mozna by se dalo pouzit externi preruseni a krokovat si jednotlive hodnoty (pak uz bys to pole ale musel mit globalni a volatile)

Nahlásit jako SPAM
IP: 212.136.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hanisss0
Newbie
10. 6. 2011   #7
-
0
-

To KIIV : no ten procak mam, ale to by znamenalo ze bych to musel napajet na nejaky ten port...coz s elektrem se mi moc uz delat nechce, ta deska uz je ted v takove stavu, muzel bych to tam napajet a nastavit porty a jtag atd, ze?

seriovy port tam mam, ale pokud jen posilat hodnoty to muzu pres jednu vecicku, podle ni rikam jaky to ma prubeh a asi bych mohl to tam zmenit abych videl i cisla, jenze ty jsou pro me neuzitecna a bylo by to i neuzitecne v zjistovani problemu...mam to jen graficky.

JA potrebuju spis videt ty pole, tech bufferu...jestli to tam chodi a tak. aaachjo...mno a co si myslis o tom volani tech funkci a o tom jak jsem psal jak jsem to napsal oklikou a co to delalo, myslis ze kdyz to mam primo ze by to melo byt dobre? a vis proc to delalo to co delalo kdyz jsem to napsal jinak? nebo myslis? Mam urcite hodne zkusenosti, u me nejsou da se rict zadne tak co si myslis o tom zapisu, diky moc...

Nahlásit jako SPAM
IP: 89.29.123.–
KIIV
~ Moderátor
+43
God of flame
10. 6. 2011   #8
-
0
-

To Hanisss :
1. pres jtag si muzes trasovat vsechno (i promenne)
2. pres seriovy port muzes posilat vsechny cisla ne jen to vysledny (zalezi jen na tobe co tam narves)

3. jakou oklikou? tim ze si je zakomentoval? nebo myslis to jak si tu funkci hodil uplne mimo hlavni cyklus - tj. vicemene taky zakomentoval?

Nahlásit jako SPAM
IP: 212.136.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hanisss0
Newbie
10. 6. 2011   #9
-
0
-

To KIIV : jo sorac, tohle jsem tady nenapsal, mno ja pak zkusil tohle:
...
prumer = avg(read_ADC1()/4);

while(1){
//PWM1(prumer);
...

vysledkem byl nizky konstantni prubeh....nezavisly na zmenach potenciometru, nebo mozna nejak , nevim ted uplne presne, ale dase rict ze to davalo "nic"....coz by mozna mohlo vysvetlit proc pri primem zapisu PWM1(avg(read_ADC1())>4) se to chova stejne jako bez filtru ze to nasobi nizkou konstantou = to same..ja nevim, zas je to asi blbost kdyz by oba zapisy mely delat to same, ne? diky

dobre, takze s tim jtagem, musim si sehnat nejaky debugger a pripajet to na prislusne nozky, to bych si vycetl s datasheetu, co pak:-)

a pres ten serial, jak tam mam hazet jine hodnoty? pole, bufferr, atd? a v jakem programu to mam cist?

Nahlásit jako SPAM
IP: 89.29.123.–
KIIV
~ Moderátor
+43
God of flame
10. 6. 2011   #10
-
0
-

To Hanisss : uvedomujes si, ze to co je mimo while cyklus se vykona jen pri startu a uz nikdy jindy

Nahlásit jako SPAM
IP: 212.136.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hanisss0
Newbie
10. 6. 2011   #11
-
0
-

ok ja jsem si myslel ze to je blbost....ja jen zkousel....mno takze napsat to dolu tak by to delalo to same ze? takze myslis ze v tom to asi neni...

Nahlásit jako SPAM
IP: 89.29.123.–
KIIV
~ Moderátor
+43
God of flame
10. 6. 2011   #12
-
0
-

To Hanisss : kdybys to napsal dovnitr cyklu tak bys tu hodnotu nacital znova a znova... ted ji nactes jednou, vyhodnotis a pak uz tam davas furt to samy

Nahlásit jako SPAM
IP: 212.136.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hanisss0
Newbie
10. 6. 2011   #13
-
0
-

To KIIV : jo to ja vim, to uz bylo jasne z toho prvne cos napsal...ale kdybych to dal dolu tak melo by oboji delat to same zE? takze nevidis problem v tom zapisu volani tech funkci? a jak jsem se ptal na ten jtag a jkak posilat ty ostatni hodnoty a v jakem programu pres ten serial...nevim jak na to takze by se mi hodila rada nebo odkaz, fakt nevim v cem by mela byt chyba, skoda ze tam nic nevidis...

Nahlásit jako SPAM
IP: 89.29.123.–
AB
~ Anonymní uživatel
41 příspěvků
12. 6. 2011   #14
-
0
-

Zkoušel jsem tvůj kód:

Připojil jsem potenciometr 10k mezi GND a VCC (+5V)
Střed jde na ADC0 . (vypni pull-up na adc vstupech)

K výstupu PWM1 (OC0, u tebe PB3) jsem připojil Led v serii s odporem proti zemi a voltmetr.

1. Kód

int main(void) 

{
init_port();
init_PWM1();
init_PWM2();

while(1){

PWM1(read_ADC1()/4);
}
} /code]
funguje podle očekávání.
Potenciometrem se dá nastavit jas diody od nuly do maxima.
Napětí výstupu se při tom mění od 0 do 5V.

Úplně stejně to funguje když místo
PWM1(read_ADC1()/4);
použiju
PWM1(avg(read_ADC1())/4);

Takže v čem je problém?

Ale vyvíjet program takhle naslepo není dobré.
Přidej k tomu nějaký převodník uart/rs232 aby sis na PC terminálu mohl zobrazovat hodnoty při běhu programu.

Nahlásit jako SPAM
IP: 217.115.249.–
AB
~ Anonymní uživatel
41 příspěvků
12. 6. 2011   #15
-
0
-

Vytisklo se to nějak jinak než jsem chtěl, ale nemám možnost to editovat.

Nahlásit jako SPAM
IP: 217.115.249.–
Hanisss0
Newbie
14. 6. 2011   #16
-
0
-

No tak na svitivosti led bys ty filtry stejne nepoznal...spis poustet nejaky signal a vzit si oscilator nebo tak neco (ja neco na ten zpusob praqve delam a bez filtru je to stejne jako s...Ale diky ze to tak zkousis, vim ze mi to funguje, vse je nekolikrat predelavane a odzkousene, jen ty funkce (prestoze jsou dobre napsane) mi nehcteji pocitat...

Nahlásit jako SPAM
IP: 89.29.123.–
AB
~ Anonymní uživatel
41 příspěvků
14. 6. 2011   #17
-
0
-

No tak na svitivosti led bys ty filtry stejne nepoznal


Nerozumím jaké filtry?

PWM1(read_ADC1()/4);
Tady se nic nefiltruje, jenom se výstup nastaví podle hodnoty ADC.

PWM1(avg(read_ADC1())/4);
Tady se děje totéž, jenom hodnota ADC se průměruje z 16-ti měření.
Průměrování funguje, zkoušel jsem v simulátoru.

Filtr se dává až na výstup pro vyhlazení průběhu PWM.

ty funkce (prestoze jsou dobre napsane) mi nehcteji pocitat


Které funkce konkrétně?

Chápu dobře, že napětí na výstupu PWM má být úměrné hodnotě ADC vstupu?
Pokud ano, tak můj test ukazuje že to tak funguje.


Nahlásit jako SPAM
IP: 217.115.249.–
Hanisss0
Newbie
15. 6. 2011   #18
-
0
-

Funguje to prumerovani? mno funkcemi neboli filtry jsem myslel prave ten klouzavy prumer a toho gausse...

No na ADC vstupu je 0-5V a PWMko generuje taky 0-5, s vice AVR nepracuje. Na vstupu desky je ale ve skutecnosti mala hodnota napeti, ktera je na tech 0-5 zvysena operacnim zesilovacem. Stejne pak potom na vystupu je tech 0-5 zvetseno na 0-10. Tim se ale vubec netrap:-)

Ja mam vytvoreny potenciometr, po kterem jezdim kovovou kulickou, ktera dotvari obvod a tyto hodnoty vstupuji do toho ADC. Jenze dochazi k odskokum a sumu atd. Prave tento signal chci temi filtry filtrovat. vyhlazeni odesilaneho PWM me nezajima, tam je potom nejaky RC clanek, me jde o ten vstupni signal. Pred vstupem do AVR je taky nejaky RC clanek, ktery to trosicku poupravi, neni to spatne, ale chtel jsem pouzit i na ukazku nejaky programovy filtr. Jedine co z te karty vidim je graficky prubeh pohybu pred jakoukoliv filtraci a potom na srovnani co leze i z toho mikroprocesoru. Takze kdyz naprogramuju desku primo s pobranim hodnot z ADC ukazuje to jen vlastnosti toho RC clanku. A kdyz to preprogramuji s tim avg nebo gaussem, kde se to prumeruje anebo upravuje podle funkce normalniho rozdeleni, mel by se ten prubeh trosku zmenit, ne? Mel bych tam videt rozdil oproti tomu primemu....bohuzel mi to ale pripada uplne, ale uplne stejne...

vychazel jsem z navrhu v programu matlab, ktery posilam v priloze. Je tam manualne vlozenych par vstupnich hodnot a zobrazene vypocty jak by to vypadalo s avg a s gaussem.

Nahlásit jako SPAM
IP: 94.113.26.–
Hanisss0
Newbie
15. 6. 2011   #19
-
0
-

Taky kdyz jsem resil jestli mam ten prumer a toho gausse dobre napsane, napsali mi, ze vazne je to dobre a poslali mi prubeh filtrace jedne sinusovky. taky prikladam.

Prave proto ze jsem ujistovan ze to mam dobre napsane premyslim jestli neni chyba ve volani tech funkci nebo nekde jinde...takhle nemuzu porovnat filtracni metody kdyz to ukazuje "to stejne":-)

Nahlásit jako SPAM
IP: 94.113.26.–
KIIV
~ Moderátor
+43
God of flame
15. 6. 2011   #20
-
0
-

To Hanisss : jenze to co ukazujes je nekde v matlabu.. jak se to ale bude chovat v jednocipu?

Nahlásit jako SPAM
IP: 212.136.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hanisss0
Newbie
15. 6. 2011   #21
-
0
-

Ja vim, necekam neco primo tak jak jsem poslal, je tam jen par hodnot, me jich to za sekundu nacte mnohem vic, i tak jsem ale cekal nejaky rozdil, , melo by to byt jeste plynulejsi nebo mozna i mensi, u avg bych ocekaval trosku skokovy signal, naopak u gausse ze by to bylo pekne vyhlazene, roztazene...ja nevim, nebo myslis ze to je tim ze tech par hodnot z toho filtru co to filtruje se uda za par milisekund a tim padem to vypada stejne? co se s tim da delat? buffer uz natahnout vice nemuzu, to by avrko nespocitalo...takze jestli je to opravdu dobre tak nicmoc asi...ja nevim...ale kdyz jsem to hledal a zjistoval co a jak, vsude meli prumery nebo ruzne filtry s pocitanim jen na par poslednich hodnotach...

Nahlásit jako SPAM
IP: 94.113.26.–
KIIV
~ Moderátor
+43
God of flame
15. 6. 2011   #22
-
0
-

par poznamek:
* spocitat jak sou dlouhy ty zakmity ( na to by ale byl potreba prinejmensim osciloskop )
* spocitat si, jak rychle nacitas data ? ( dejme tomu vygenerovat impuls pri kazdem pocitani a pak to zmerit citacem )

dale:
* nevyplati se nacitat data jen dejme tomu 100x za sekundu? ted muzes mit klidne 16tisic/s
* pri velke vzorkovaci frekvenci budes mit tak jak tak problemy - filtr zachyti jen opravdu rychly zmeny
* co jednoduchy RC filtr na vstupu ?

Nahlásit jako SPAM
IP: 212.136.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hanisss0
Newbie
15. 6. 2011   #23
-
0
-

Jednoduchy RC tam mam...a jako je to docela pekne. Ale mam udelat i toto na ukazku a porovnani...

tak ono mi to nejspis celou dobu funguje...:-):D

tak mam tam hodit nejake delay nebo neco? s tema taky moc pracovat neumim, navedes me, pls?:-) mohl bych to pak jeste v pondeli odzkouset...

Nahlásit jako SPAM
IP: 94.113.26.–
KIIV
~ Moderátor
+43
God of flame
15. 6. 2011   #24
-
0
-

chce to najit funkce jako delay() potrebujes tak 10ms na jedno kolo
nebo to hod jako free running mode a pres preruseni

Nahlásit jako SPAM
IP: 212.136.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hanisss0
Newbie
15. 6. 2011   #25
-
0
-

Jo, takze myslim ze staci jen na konec programu pozkouset delay a melo by to fungovat? Kdyz jsem predtim prevadel ten vystup pwm na jiny port pomoci preruseni, dost se mi tam predtim bilo jedno s druhym. Vystup pwm nefungoval jak mel, cteni jednoho ADC se bilo s druhym a ja zkousel zpozdovat at ma na jednotlive veci cas atd a mel z toho takove nervy ze mam i na ten delay averzi:D:D:D Tak jestli to staci jen na konec, tak to v pondeli pozkousim a snad to pujde, hlavne ze vim ze mi to jinak funguje:-) Tak dik

Nahlásit jako SPAM
IP: 94.113.26.–
AB
~ Anonymní uživatel
41 příspěvků
15. 6. 2011   #26
-
0
-

Zkoušel jsem jak tvůj program zpracuje dva vstupní signály.
Jeden je schodovitý, druhý kolísá kolem pevné hodnoty.
Výsledek je v xls v příloze.

Nahlásit jako SPAM
IP: 217.115.249.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Počítání Sessions — založil Bryant

Počítání metody — založil lekejs

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý