[ mikikg @ 10.12.2013. 09:43 ] @
Pozdrav,

pokusavam da nateram STM32F3DISCOVERY plocicu sa KEIL ARM da nesto radi.
Uzeo sam prost primer IO_Toggle, kompajlirao, snimio i to radi, izbacuje impulse na izlaz kako sto stoji u programu.

Medjutim, kako dodam moje neko parce code-a u taj vec gotov primer nesto se tu vrlo cudno desava i ne razumem sta.
Dodam prostu funkciju, definisem prototip, sve inace kako se radi.

Umetnem tu moju funkciju u main() i on je nekako skroz ignorise :(
Dodatno mi nedozvoljava da tu postavim breakpoint.
Gledam posle nesto po disasembleru, kao da je nije ni kompajlirao???

Radio sam sa istim tim KEIL ARM na F4Discovery, neki dosta slozeniji program i sve radi kako treba.

U cemu je ovde caka?
Evo slicica cisto da vidite o cemu se radi.

[ yugaja @ 10.12.2013. 09:47 ] @
Optimizacija?
[ bogdan.kecman @ 10.12.2013. 10:11 ] @
brojac=500
while brojac==0

ovo ce da preskoci tu petlju cak i ako nema optimizacije, sa optimizacijom cela ta petlja se izbacuje, ako setujes brojac kao volatile petlja nece biti izbacena ali moras da imas while brojac > 0 a ne while brojac ==0 da bi usao u petlju
[ mikikg @ 10.12.2013. 10:24 ] @
Bah, crce mi ADSL modem ...

To su sad bili pokusaji, pogledacu optimizaciju a bas oko toga nesto ludi jer sam prebacio deo code-a iz druge app za F4, lcd rutine a one nesto muckaju sa delay i praznim petljama.
[ bogdan.kecman @ 10.12.2013. 10:27 ] @
samo deklarises varijablu koju vrtis u praznoj petlji kao volatile i bice ok
[ mikikg @ 10.12.2013. 13:06 ] @
Ovo sa volatile je delimicno pomoglo (ulazi u prazne petlje) ali i dalje nesto ne mogu da nateram LCD2x16 da proradi.
To mi je LIB sa F4, ne znam sto nece na ovom F3 da radi kako treba. Imalo je par razlika oko inicijalizacije portova, to sam promenio ali i dalje zeza LCD.
Linije gde je vezan LCD su iste na oba kontrolera, jedino ako ovaj F3 ima jos neke periferije koje brljave komunikaciju. Kod F4 sam birao klot ciste linije.

Code:
//Interno IME        PORT        PIN        Discovery
#define LCD_D7        GPIOB,    GPIO_Pin_15     //PB15
#define LCD_D6        GPIOB,    GPIO_Pin_13     //PB13
#define LCD_D5        GPIOB,    GPIO_Pin_11        //PB11
#define LCD_D4        GPIOE,    GPIO_Pin_15        //PE15
#define LCD_E        GPIOE,    GPIO_Pin_13        //PE13
#define LCD_RW        GPIOE,    GPIO_Pin_11        //PE11
#define LCD_RS        GPIOE,    GPIO_Pin_9        //PE9
[ bogdan.kecman @ 10.12.2013. 13:40 ] @
citas da li je lcd slobodan ili pravis delay?
[ mikikg @ 10.12.2013. 13:43 ] @
Pravim delay. Imam neku master var koja je osnova za sve delay funkcije i nju sam povecavao ali ne daje rezultate.
Moracu da uhvatim sve iz pocetka da debugiram a mrzi me to da radim a posebno sto sam onomad kad sam pisao lib to sve vec prosao :(
[ bogdan.kecman @ 10.12.2013. 13:57 ] @
mozda ti nije tacan delay, inace ja ne volim te hitachije da vozim sa
delay-em osim ako nije bas bas frka za taj jedan pin, mnogo je
sigurnije, em brze vozis lcd em sigurnije radi
[ mikikg @ 10.12.2013. 16:51 ] @
A jel vazi cekanje busy flaga za sve faze inicijalizacije displeja? I kod onih dugih vremena od 40ms?

Najludje sto sam napisao i tu opciju za drajver, baci samo pogled vidi jel ok …

void LCD_wait_busy_flag (void) {
//postavi R/W na 1
GPIO_SetBits(LCD_RW);

//postavi da D7 bude ulaz
GPIO_Init_Mode(LCD_D7, GPIO_Mode_IN);

//cekaj dok linija D7 ne bude 0
while (GPIO_ReadInputDataBit(LCD_D7) == 0) {}

//vrati da D7 bude izlaz
GPIO_Init_Mode(LCD_D7, GPIO_Mode_OUT);

//postavi R/W na 0
GPIO_ResetBits(LCD_RW);
}
[ bogdan.kecman @ 10.12.2013. 20:51 ] @
deluje ok, ona duga vremena u startu za inicijalizaciju moras da
sacekas, ali pri pisanju koristis wait_busy umesto da radis neki delay()
[ Risto. @ 10.12.2013. 21:33 ] @
Izvinjavam se sada sto se ubacujem u temu. Da ne bi otvarao novu imam par pitanja. Odnose se i na stm32f3 i na keil.

Porucio sam da mi stigne STM32F3 discovery plocicu (onu sa ziroskopom) i treba da mi stigne za neki dan, pa gledam sta treba da ucim kada stigne.
Iskustva sa arm-om su mi slaba, programirao sam malo u mikroc-u STM32f1 discovery, i onu STM32f4 od mikroe plocicu (pin to pin sa 40-pin picom).
Koliko vidim u mikroc je maksimalno pojednostavljen i mnogo se razlikuje od programiranja u Keil-u, ali me keil vise vuce zato sto znam da je ipak profesionalniji alat.

Da li u keilu postoje biblioteke za npr. ADC i ostale periferije ili to moram sve sam da pisem? Vidim da se ovde radi o lcd-u, ali da li je to slucaj i sa perifierijama?
Gledao sam neke primere u keilu pa ne razumem bas sve kako radi, ali o tome cu kada mi bude stigla discovery ploca.

Nadam se da se autor teme ne ljuti sto sam postavio ovde pitanje.
Ako treba otvoricu novu temu posto cu imati sigurno pitanja kad krenem sa programiranjem.


P.S. Koliko vam je dugo stizala posiljka iz bugarske preko comet-a, i koliko je bila postarina?
[ bogdan.kecman @ 10.12.2013. 21:45 ] @
sto se kometa tice postarina je nula a roba stize najduze za 2 nedelje,
obicno se ne zadesi da ti narucujes bas taj dan kad je stiglo vec iz
bugarske pa to bude krace :D (oni svake dve nedelje imaju posiljku iz
bugarske posto su bugarska firma)

mikroc je profesionalni alat, njihova ideja da koriste zatvoreni tip
biblioteka mozda po meni nije profesionalna ali taj alat je vrlo
profesionalan!!! pri tome je cena za mikroc vrlo pristojna

keil je vrlo skupa alatka, razmisli dvaput da li zelis bilo kakav biznis
/ hobi da zasnujes na dostupnosti kreka za extremno skup alat

pored spomenutih, postoje i kompajleri koji ne kostaju nista a nisu
uopste losi, mozda ti je zanimljivo da probas sa njima. za cortex m3
(discovery F3 na primer) CooCox je potpuno dzabe i radi super, za cortex
m4 je CooCox malo limitiran ali i dalje je dzabe!!! codesourcery ima
dzabe kompajler (bez ide-a) za sve arm-ove, a ima brdo primera na netu
kako da ga spojis sa eklipsom da dobijes ide. jedini problem u toj
kombinaciji je debaging koji nije bas jednostavan

direktan odgovor na tvoje pitanje je "da ali ..." :D, uz taj discovery
ti dolaze biblioteke za keil u kojima imas i funkcije za rad sa adc-om,
keil takodje ima neke biblioteke za rad sa adc-om (nisu iste kao te koje
ST isporucuje iz discovery ali su kao univerzalnije, kao radice sa
svakim arm-om - problem je u mnogo puta "kao") tako da biblioteke
postoje, da li su kao mikroC gde iz dropdown-a na projektu odaberes mcu
i onda kazes adc_ovoono i to sve radi, naravno da nisu :D vec moras malo
da poznajes sam mcu i da znas sta hoces i kako to da uradis ... to nema
veze sa tim da je keil "profesionalniji" vec sa tim da je mikroC uzeo
neki drugi pristup u radu sa bibliotekama te zato ima podrsku za manju
grupu mcu-a nego keil (sto opet ne bi trebalo preterano da te tangira,
samo kad kupujes mcu proveris lepo da li ga i kako mikroC podrzava)
[ Risto. @ 10.12.2013. 22:02 ] @
Mikroc je zaista za pocetnike jako jednostavan, bas zbog tih meni-a i podesavanja svega samo klikom. Takodje i primeri i podrska na forumu im je odlicna.
Zbog toga mi se cinilo da nije profesionalan, ali izgleda gresim.

Sto se tice keila nasao sam crack, pa posto ja jos idem u srednju skolu, a zainteresovao sam se za mikrokontrolere i planiram da ih proucim, pogotovo arm sad kad sam video sta sve moze.
Pa sam zato mislio da krenem putem kojim cu najbolje upoznati kako to radi sve ustvari. ( dobro ne bas od assemblera, mozda kasnije :D)
Ali ono da upoznam kako rade te biblioteke, koji bitovi se setuju koji resetuju itd...
Keil mi sad deluje komplikovan, ali tako mi je izgledao i pic kad sam pocinjao, sad mi vise nije zanimljiv :D .

Video sam to za eclipse i free compilere, ali onda sam nasao osvecenu verziju keil-a i rek'o ajde sa njim cu.

Mikroc podrzava mcu, ali mi je problem opet sto nemam placenu verziju, a kreka nema. Mozda kupim mikroc, ali ne uskoro.

Hvala puno na odgovoru.
[ bogdan.kecman @ 10.12.2013. 22:13 ] @
pazi namestanje free kompajlera je znanje koje ce ti se visestruko
isplatiti kasnije!
koristenje krekova je nesto sto ce ti se kad tad obiti o glavu

ti sad sam odluci za dalje
[ macolakg @ 10.12.2013. 22:19 ] @
Bogdane,

STM32F3 Discoverry je cortex M4F, baziran na MCU STM32F303.

M4 je, samo je predisponiran za pwm radnje, sa brutalno brzim A/D i pwm (skoro dvostruko brži od STM32F407 u tom pogledu).

http://www.google.rs/url?sa=t&...3tJw&bvm=bv.57799294,d.bGQ

Pozz

P.S.

Inače mi je bilo na prvi pogled baš interesantno što ima tako brze periferije sa upola kloka u odnosu na STM32F4 Discoverry

[Ovu poruku je menjao macolakg dana 10.12.2013. u 23:30 GMT+1]
[ bogdan.kecman @ 10.12.2013. 22:32 ] @
ne mogu vise da ih povatam

ja sam radio sa ovim CM4:
STM32F4DISCOVERY -> ovo je cortex M4
32F429IDISCOVERY -> i ovo je cortex M4
32F401CDISCOVERY -> i ovo je m4

A ovaj nemam:
STM32F3DISCOVERY -> ovo je isto cortex M4 iako je F3 :D
pretpostavih od F3 da je CM3 a ne CM4 :D

mislio sam na STM32VLDISCOVERY :) po meni najbolji discovery board do sada :)

odma posle njega je STM32L-DISCOVERY ta dva su mi bas bas dobri .. ovi ostali su malo budznuti i malo poskupi (cipovi, ne discovery plocke)


elem, sve i dalje stoji jedino sto je coocox malo losija podrska za CM4 nego za CM3 cipove i dalje mislim da ce mu se znanje skupljeno u pravljenju sopstvenog free ide-a isplatiti mnogo vise nego da samo krekne keil, sta ce sutra kada ne bude bilo vise kreka za keil
[ bogdan.kecman @ 10.12.2013. 22:36 ] @
Citat:
macolakg: Bogdane,
M4 je, samo je predisponiran za pwm radnje, sa brutalno brzim A/D i pwm (skoro dvostruko brži od STM32F407 u tom pogledu).
...
Inače mi je bilo na prvi pogled baš interesantno što ima tako brze periferije sa upola kloka u odnosu na STM32F4 Discoverry


pazi sto se samog jezgra tice, jedina razlika izmedju M3 i M4 jezgra je DSP, M4 jezgro je M3 jezgro + DSP instrukcije i to je to ... sada od proizvodjaca cipa zavisi koje ce periferije i kako da okaci na samo jezgro ... ST je ovde kacio malo brze periferije na M4 nego na M3 ali nije obavezno, cesto su periferije identicne.... ono sto mene malo vise "brine" je potpuno odsustvo DSP instrukcija u kodu koji su mi generisali razni kompajleri (keil, codesourcery ..) sto me navodi na misao da se za M4 mora dsp deo raditi u asm-u, a ja moram da priznam da iako sam asm kucao duuuuuuuuuuugo godina, dsp nisam nikad ... voleo bi kad bi kompajler preuzeo na sebe taj deo :(
[ macolakg @ 10.12.2013. 23:03 ] @
Jbg, sa asm je najbrže sve moguće. Jeste gadno, i ja nisam radio u asm bar nekoliko godina, ali da je majka brzine to stoji.
[ bogdan.kecman @ 11.12.2013. 03:03 ] @
pa to koliko je brze je duga prica u koju ne bih ulazio, a dsp u asm-u
zahteva dosta pripreme i mozganja .. nekako bi bilo mnogo korisnije da
kompajler to ume sam
[ mikikg @ 11.12.2013. 04:46 ] @
Citat:
bogdan.kecman:
deluje ok, ona duga vremena u startu za inicijalizaciju moras da
sacekas, ali pri pisanju koristis wait_busy umesto da radis neki delay()


Sta sad znaci wait_busy a nije sa delay? Nisam to razumeo, isto cekam busy flag (sa onom rutinom sto sam pokazao) i kad treba 40ms da sacekam?

Nervira me sto ovaj moj code nece da radi na F3 a radio na F4.

Data linije su sve na istom mestu na konektoru kod obe plocice (imam nosecu proto plocicu sa velikim header konektorima, samo sam zamenio discovery).
Ovde OBRATITI paznju da im se jedno pinovi za GND/3V/5V razlikuju!
Cak sam pomoslio da sam u jednom trenutku spalio LCD jer je bilo to oko napajanja izmesano, poceo cak IC na displeju da se greje, ja rekoh gotov je sad :)
Probao posle isti LCD modul na onom mom Stelarisu za AD9850 i na srecu preziveo je ;)

Jbg, nemam logic analizator da ispratim tacno sve linije, muka je pipkati sa osciloskopo jedno po jedno, pa po debugeru kljuckati zilion puta da gledam sta tacno izbacuje :(
A i sa kljuckanjem korak-po-korak (dakle izbacujem problem sa delay) nije isto hteo da mrdne LCD. Jedino ako mu u nekom trenutku ne odgovara predugo vreme izmedju komandi, mada to nebi smelo jer je staticna logika u pitanju (ima latch u LCD).

Evo u prilogu i ta moja LIB cisto da se vidi sta ona radi.

A primer koriscenja bi bilo ovako nesto (kao sto rekoh to mi sve tako radi na F4)

Code:
    LCD_Init_pins();
    LCD_Display_init();
    LCD_cursor_control (0, 0);
    LCD_send_string("Neki text");
    LCD_goto_home_line2();



[Ovu poruku je menjao mikikg dana 11.12.2013. u 06:00 GMT+1]
[ ha_23 @ 11.12.2013. 14:31 ] @
Citat:
bogdan.kecman:
Citat:
macolakg: Bogdane,
M4 je, samo je predisponiran za pwm radnje, sa brutalno brzim A/D i pwm (skoro dvostruko brži od STM32F407 u tom pogledu).
...
Inače mi je bilo na prvi pogled baš interesantno što ima tako brze periferije sa upola kloka u odnosu na STM32F4 Discoverry


pazi sto se samog jezgra tice, jedina razlika izmedju M3 i M4 jezgra je DSP, M4 jezgro je M3 jezgro + DSP instrukcije i to je to ... sada od proizvodjaca cipa zavisi koje ce periferije i kako da okaci na samo jezgro ... ST je ovde kacio malo brze periferije na M4 nego na M3 ali nije obavezno, cesto su periferije identicne.... ono sto mene malo vise "brine" je potpuno odsustvo DSP instrukcija u kodu koji su mi generisali razni kompajleri (keil, codesourcery ..) sto me navodi na misao da se za M4 mora dsp deo raditi u asm-u, a ja moram da priznam da iako sam asm kucao duuuuuuuuuuugo godina, dsp nisam nikad ... voleo bi kad bi kompajler preuzeo na sebe taj deo :(


Al nije mi jasno ako treba cist ASM zosto sluzi ovaa CMSIS DSP Software Library?
http://www.keil.com/pack/doc/cmsis/DSP/html/index.html
[ bogdan.kecman @ 11.12.2013. 14:42 ] @
yup KeilARMPackARMCMSIS3.20.3CMSISLibARM
ali probaj da nadjes source tog lib-a, imas .a i .lib .. bas zato sto je
cukano u asm-u, to sto su oni napisali vec nekoliko funkcija u asm-u je
lepo od njih ali ja ne mogu taj lib da prebacim na gcc na primer no nije
to problem, cela fora je sto ako ja napises a = b * c + d kompajler nece
koristiti DSP instrukcije koje ce to odraditi x puta brze iako je to
moguce, o tome kukam.. ima brdo gotovih biblioteka da se skine i za fft
i svasta nesto no ja pricam o mogucnostima kompajlera ne o dostupnosti
komada koda koji nesto radi
[ mikikg @ 11.12.2013. 16:59 ] @
Jao koji sh*** sa ovim plocicama :) Pa "smaknuti" su portovi za po jedan pin F3 vs F4 :)
Ja jos kao gledam, tu su svi lepo poredjani ali mucak, smaknuto :)

Sto bre nisu to lepo poredjali isto kad vec pravili iste dimenzije, isti konektor … Izgubih vreme za dzabe …

Ustvari sad kad jos bolje pogledam, sve im bre izmesano, nesto je smaknuto, nesto na svom mestu :)

Sad cu to da prebudzim, mora da proradi :)

UPDATE:
I naravno proradilo je odmah iz prve, samo sam precukao definiciju portova … Eto, da znate da ima i ta razlika izmedju portova :)

[Ovu poruku je menjao mikikg dana 11.12.2013. u 18:15 GMT+1]
[ ha_23 @ 11.12.2013. 20:20 ] @
Citat:
bogdan.kecman:
yup KeilARMPackARMCMSIS3.20.3CMSISLibARM
ali probaj da nadjes source tog lib-a, imas .a i .lib .. bas zato sto je
cukano u asm-u, to sto su oni napisali vec nekoliko funkcija u asm-u je
lepo od njih ali ja ne mogu taj lib da prebacim na gcc na primer no nije
to problem, cela fora je sto ako ja napises a = b * c + d kompajler nece
koristiti DSP instrukcije koje ce to odraditi x puta brze iako je to
moguce, o tome kukam.. ima brdo gotovih biblioteka da se skine i za fft
i svasta nesto no ja pricam o mogucnostima kompajlera ne o dostupnosti
komada koda koji nesto radi


Razumem te , togas dzabe cela prica od mogucnosti na M4 arhitekturi ako nije potkrepeno od strana kompajlera!
[ bogdan.kecman @ 12.12.2013. 04:06 ] @
pa ono nije dzabe, ima dosta biblioteka koje rade "ovo i ono" i asm je
dobro dokumentovan pa mozes da zamesas .. svakako ostaje los ukus ...

nije ARM jedini, nigde ja jos nisam video da kompajler ume lepo da
koristi dsp instrukcije kod "mesanih" mcu-a
[ mikikg @ 12.12.2013. 07:43 ] @
Dobro to verovatno stoji, a sta je sa funcijama / blbliotekama koje su specificno uradjene za DSP, poput FIR/IIR/FFT i ostalo?

To bi trebalo da su namuljili da koristi sve maksimalno masinske instrukcije (MAC i slicno).
Bar kod dsPIC takve lib su pisali sve u ASM, nisam zalazio jos u to kod ARM, nema razloga da nije tako.
[ bogdan.kecman @ 12.12.2013. 07:47 ] @
ma ima tih matis funkcija gotovih i sve naravno koriste asm nije to
problem ... doduse kod dspica imas onaj app (nikad nisam probao,
zaboravih i kako se zove) gde ti nacrtas digitalne filtere a on ti
izgenerise dsp kod koji ubacis u svoj app, nisam vidjao slicno za m4 no
ne bi me cudilo da postoji
[ mikikg @ 12.12.2013. 08:15 ] @
Probao sam ja tu app za filtere za PIC-eve. Radi dobro.
Tehnicki ta ista app bi mogla da se koristi za bilo koji procesor.
Ono sto je srz te app je da ti izracuna koeficijente na osnovu tvog zahteva za filterom, to je jedna tablica sa brdo FP brojeva. To sve isto moze da radi i Mathlab ili neka treca app.
Tu je jedino zgodno sto ta app moze da ti napravi skeleton sa definicijom bufera, labela i slicno pa posle uradis samo copy/paste u svoj dsPIC code.
[ bogdan.kecman @ 12.12.2013. 08:21 ] @
zar ne ubaci i parce asm koda pored tih tabela
[ mikikg @ 12.12.2013. 08:27 ] @
Ubaci nesto sitno, da skoci tamo-vamo ali nije to core procesiranja, core je u bibliotekama koje daje Microchip.

Cek da iskopam jedan taj fajl da vidis primer …

Dodao sam primer, to je neki 64-redni FIR sa Kaiser-Window estimacijom (nebitni detalji), sve se na kraju svodi na skup tih koeficijenata koje procesor mnozi (tu se koristi MAC) kroz cirkularni buffer i to je cela nauka :)
Znaci samo do skupa koeficijenata trebas da dodjes / izracunas pomocu nekog CAD programa (Computer Aided Design) ostalo je manje vise prosto.

[Ovu poruku je menjao mikikg dana 12.12.2013. u 10:25 GMT+1]
[ macolakg @ 12.12.2013. 08:30 ] @
Ma sa ovim stm32f3 ljudi svašta prave. Verovatno može dosta toga da se nadje ako se prekopa.

http://www.youtube.com/watch?v=5DV3xepNI_k

http://www.youtube.com/watch?v=ZlAsKF1ClNE

http://www.youtube.com/watch?v=DtDB8aFacBs

http://www.youtube.com/watch?v=0iQxp3EQX0I

http://www.youtube.com/watch?v=m-gM7RY1swU




Evo one simpatične spravice za pin konfig:

http://www.youtube.com/watch?v=_H9G6UvWg8Y

Evo nađoh i video uputstvo oko DSP na M4:

http://www.youtube.com/watch?v=mf8oOG0woeI



[Ovu poruku je menjao macolakg dana 12.12.2013. u 09:42 GMT+1]
[ bogdan.kecman @ 12.12.2013. 09:46 ] @
@miki, ha on zove blockfilter funkciju

@macola, sve je to super lepa je to plocka, ono sto mene nervira je sto ako ja uradim a = sqrt((b*c+d-e)*f^g/h); on nece iskoristiti ni jednu jedinu dsp instrukciju - a mogao bi... sad umesto sqrt mogu da uvezem njegov dsp lib pa da kazem stm32_v_sqrt(), umesto b*c da kazem stm32_v_imul(b,c) etc etc .. no to je upravo ono sto me nervira .. kompajler je potpuno nesvestan dsp instrukcija (a u velikom procentu slucajeva nesvestan je i postojanja fpu-a)
[ macolakg @ 13.12.2013. 11:31 ] @
Nisam se još dohvatio STM-a, nemam vremena, ali ako je tako onda je baš bezveze.

No šta ćemo, ko zna za šta to može biti dobro (to kažem uvek kad nešto nije po želji) :-).
[ mikikg @ 13.12.2013. 13:39 ] @
Dobro je bar da se zna da je takva situacija.

Nisam oko toga obracao paznju a bas sam se cudio sto mi "trosi" mnogo vremena mnozenje (kod dsPIC), trebao sam dakle da iskoristim specificne funkcije umesto da pisem klasicne iskaze poput a=b*c.
[ bogdan.kecman @ 13.12.2013. 13:43 ] @
to je ono sto mene iritira... ceo taj dsp trip na normalnim mcu-ima je
podrzam samo kroz lib, kompajler to nista ne konta .. e sad znam da
postoje c kompajleri za cisto dsp procesore i tu umeju da koriste tako
da nije problem u moze ili ne vec bem li ga ... nisam probao mikroC za
dspic mozda su oni malo to inteligentnije uradili, da li je neko probao?
[ bogdan.kecman @ 13.12.2013. 14:01 ] @
btw za gcc za arm sam siguran, za ostale nisam testirao!!! da ne bude
posle "bogi reko .." :D

gcc ima opciju -mdsp i -mdspr2, e sad to sljaka za mips ne znam da
postoji varijanta za druga jezgra

e sad, microchip je radio ozbiljan revamp svojih kompajlera XC8 je na
zalost po meni znacajan korak unazad ali XC16 i XC32 bi trebalo da budu
koraci unapred (bazirani na originalnom gcc based kompajleru pa
dobudzeni, nasminkani...).
Negde sam, ako se dobro secam, procitao da od v1.2 XC16 ume da
generise dsp asm instrukcije ako se koristi -O3 ili -Os
ali to nisam
probao (nisam jos stigao da se zezam sa XC16 vec sam presao na ARM)
[ ha_23 @ 13.12.2013. 14:08 ] @
Ja ga nisam ga koristio no ne verujem da to postoi u MikroE kompajler, ali mikroC za dspic ima sve dsp biblioteke i DSP Built-in Routines.
http://www.mikroe.com/mikroc/dspic/libraries/
Spored mene ovo sa DSP Built-in Routines mogli su da ugrade u sam kompajler.
[ npejcic @ 13.12.2013. 15:11 ] @
Citat:
bogdan.kecman:
e sad, microchip je radio ozbiljan revamp svojih kompajlera XC8 je na
zalost po meni znacajan korak unazad


Da, čudna priča je oko tih novih kompajlera. Tračari se po forumima da su uzeli indijce da rade sintezu Hi-Tech i MCP kompajlera.
Ja lično sam bio iznenađen da sve što sam podrazumevao da radi pod XC8, ono nije, a ono što sam sumnjao da će raditi
(kompleksna matematika na PIC16) je radilo odlično..... šta reći....

Citat:
ali XC16 i XC32 bi trebalo da budu koraci unapred (bazirani na originalnom gcc based
kompajleru pa dobudzeni, nasminkani...).
Negde sam, ako se dobro secam, procitao da od v1.2 XC16 ume da
generise dsp asm instrukcije ako se koristi -O3 ili -Os
ali to nisam
probao (nisam jos stigao da se zezam sa XC16 vec sam presao na ARM)


Koristimo ih često. Iskreno nismo nešto osetili boljitak na ovim novim revizijama. Samo podršku za nove kontrolere.
Nisam imao prilike da probam -O3.

U svakom slučaju skoro smo imali "veselu" situaciju sa dsPIC33EP256MU806. Neznam više ni sam da li je do dsPIC-a ili do kompajlera.

U interpatu smo koristili članove iz look-up tabele koja je logično bila u Flash memoriji kontrolera.
Mikrokontroler je prskao često (resetovao se). Rešenje je bilo da prebacimo ISTU tu look-up tabelu u RAM!!! oko 8kBy.
Da ne pričam šta ovo donosi kao potencijalni problem....

Uzgred, MCHP kompajleri za dsPIC, PIC24 i PIC32-ke su u jednom trnutku bili besplatni, ali su biblioteke koje dolaze uz njega bile te koje koštaju :) Neznam kako je sada.
[ mikikg @ 13.12.2013. 15:53 ] @
Probacu ako stignem danas ja ove opcije sa -O3 ili -Os kod XC32 posto imam sve vec tu spremljeno (za dsPIC PID regulator), pa javim da li ima razlike.
[ bogdan.kecman @ 13.12.2013. 15:55 ] @
dspic tera XC16 ne XC32 ?!
[ npejcic @ 13.12.2013. 16:08 ] @
dsPIC i PIC24 imaju 16bit core, znači XC16

PIC32xxx koriste XC32
[ mikikg @ 13.12.2013. 16:10 ] @
U pravu ste, moja greska, XC16 je za dsPIC.

Probacu malo kasnije samo neke majstore da ispratim ...
[ Risto. @ 13.12.2013. 17:15 ] @
Ne znam da li ste videli biblioteke od mikroc-a for ARM za taj dsp.
Uploadovao sam sve posto nisam nasao na internetu, da cujem sta mislite o njima.

Stigla mi je f3discovery plocica juce.
Nisam se jos snasao najbolje u keil-u, treba mi jos dosta ucenja C-a, zbog onih struktura itd...
Da podesim eclipse sam probao ali vidim da taj codesourcery compiler nije free nego ima 30 dana probe. Pa nisam ni pokusavao dalje.
Mozda nisam nasao taj compiler o kojem pricate...

Inace vidim da je izasla nova verzija mikroc-a za arm 4.2.0.
[ mikikg @ 13.12.2013. 18:17 ] @
Citat:
mikikg: Probacu ako stignem danas ja ove opcije sa -O3 ili -Os


Probao sam, ovako na prvu ne vidim razliku, mozda je za "dlaku" brzi sa -Os. Dakle merio sam vreme sa osc trajanja te moje PID rutine.

Uzgred ovo su "optimisation level" swicevi, dostupni iskljucivo u XC16 PRO verziji.

Znaci nema od toga nista da kompajler umesto mene sam iskoristi DSP funkcije, mora da se drugacije napise code ako se hoce ubrzanje.
[ mikikg @ 14.12.2013. 08:39 ] @
Par pitanja/saveta u vezi STM32F3Dicsovery, hocu jedan mali enkoderic/pot (ima i taster na osovini) da ukacim sad tu na moj projekat za zadavanje nekih vrednosti koje se ocitavaju na LCD2x16, kako najlakse to osposobiti, da idem na dedicated HW kvadraturni enkoder ulaz (kad ga vec ima) ili na obicne ulaze? Imam I/O na pretek, mogu bilo sta da iskoriastim samo sta je lakse u SW da se odradi?

Drugo pitanje, jel ima neki standardan programski patern za baratanje menijem? Znam da je to smor malo pisati, gomila uslova nego da proverim pre nego sto to pocnem da pisem. Ili mozda neki primer (makar u vidu algoritma) kako se to inace radi?
[ bogdan.kecman @ 14.12.2013. 08:47 ] @
ja obicno enkoder vezem na interapt pin (A na interapt B na bilo koji
input pin) i onda na interapt proveravam dal je + i - i menjam neku
globalnu varijablu (tj 2, jedna je uvek =1 u interaptu a druga se menja
u + ili u - u zavisnosti od toga na koju stranu enkoder ide).. a onda u
glavnoj petlji programa u meni ulazim samo ako je ta ==1, tu je i vratim
na nulu, a meni je klasicna state masina .. ja volim da implementiram
state masinu sam mada imas brdo vec gotovih resenja za to na netu (no
izadje jednostavnije da implementiras sam)
[ mikikg @ 14.12.2013. 09:43 ] @
Ok hvala, nadam se da cu se snaci.
[ macolakg @ 14.12.2013. 10:14 ] @
Miki,
Evo ti jedno parče koda za inkrementalne enkodere, na 8 bit PIC, gde viši nibl B porta ima sposobnost provociranja hardverskog interrupta na bilo kakvu promenu.

Nije direktno ono što ti treba, ali će kao moguć pricip poslužiti.

Bio mi je potreban niži nibl od B porta, pa zato pravim gomilu šiftovanja.

U suštini to može i kraće kada se tretiraju samo potrebni pinovi.

Pozz




Code:


////////////////////////////////////////////
#define enc_blink        RC3
#define a_in               RB4
#define b_in               RB5 
#define z_in               RB6  
//ulevo se povecava broj encoder_count, za obrnuto zameniti a i b
///////////////////////////////////////////////////////////////////

unsigned char old_count=0,temp_count=0;
signed long encoder_count; //izlazna varijabla

const signed char table[] = {0,-1,+1,0,+1,0,0,-1,-1,0,0,+1,0,+1,-1,0};


void interrupt int_hand (void)
{    
    if(RBIF&&RBIE){
    temp_count=PORTB;
    if(temp_count & 0b01000000)encoder_count=0;
    temp_count <<= 2;
    temp_count >>= 6;
    old_count = (old_count | temp_count);
    encoder_count += table[old_count];
    old_count <<= 6;
    old_count >>= 4; 
        enc_blink^=1;  //RC4, test pin

        // citanje sve 4 tranzicije enkodera, max. 111KHz, tj. 9uS (za sve 4 tranzicije), kada je encoder_count int
        // kada je encoder_count long, onda max. 95KHz, tj. 10,5uS.
        // za letvu od 5um, max. brzina je 475mm/sek.
  }
  RBIF = 0;
}
//moguca je dodatna optimizacija, koriscen je ceo BPORT, nizi nibl se koristi za druge stvari.
//to je razlog ovih silnih siftovanja.



P.S.

Moguće je znatno ubrzanje i ovog kako stoji, korišćenjem asm SWAP za niži i viši nibl, no mrzelo me da pišem, a ovo mi je zadovoljavalo potrebe.

P.P.S.

Zaboravih,

U pitanju je bio PIC18F4620 na 40MHz (HSPLL)

[Ovu poruku je menjao macolakg dana 14.12.2013. u 11:30 GMT+1]

[Ovu poruku je menjao macolakg dana 14.12.2013. u 11:38 GMT+1]
[ mikikg @ 14.12.2013. 10:36 ] @
Hvala puno, bice od koristi sigurno, shvatam sta treba uraditi za enkoder.

Nego nesto me vise brine ovaj menu i state machine, koliko vidim morace tu malo OOP da se koristi …
Ne znam odakle da pocnem, moram valjda prvo da definisem zahtev kakav menu hocu i sta on da radi pa da onda definicija tranzicija i … Nisam to radio do sad na takav nacin. Da crtam UML, ne znam gde da teram :)

Mislim nebitno sto mi mozda za ovaj projekat treba 2-3 parametra da menjam, interesuje me da to skontam za buduce projekte, mozda sa vecim display i slicno.


[Ovu poruku je menjao mikikg dana 14.12.2013. u 11:48 GMT+1]
[ tomam @ 14.12.2013. 10:55 ] @
Pogledaj ovaj link :) mozda pomogne
http://winavr.scienceprog.com/...ects/avr-lcd-menu-routine.html
[ goran_68 @ 14.12.2013. 10:57 ] @
Miki,

Kad već imaš dosta slobodnih pinova što ne uzmeš neki touchscreen TFT? Pogubićeš malo više vremena ali ćeš za ubuduće imati gotovo rešenje. Da ne pričamo o prednosti nad 2x16 LCD. Moram da potražim malo po netu ali koliko znam ima i gotovih aplikacija koje te rešavaju muka oko menija.
[ mikikg @ 15.12.2013. 05:33 ] @
Poterao sam enkoder, kao sto sam i ocekivao to je proslo bez problema.

Nisam koristio interapt na ulaz vec preko tajmera a razlog je zbog toga sto ovi enkoderi u obliku potenciometra jako prljav signal daju (zvoni, krcka), nije to "pravi" opticki enkoder gde je signal cist kao staklo.
Znaci oko 2kHz interapt rutina (super se ponasa tako kao filter smetnji) sa par IF uslova i to je to.

Evo i parce code kako izgleda ta logika:

Code:

        encoder_current = GPIO_ReadInputDataBit(ENC_a);
        if (encoder_last == 0 && encoder_current == 1) {
            if (GPIO_ReadInputDataBit(ENC_b) == 0) {
                moj_brojac ++;
            } else {
                if (moj_brojac > 0) {//necu u minus
                    moj_brojac --;
                }
            }
        }
        encoder_last = encoder_current;


Za MENU logiku sam odlucio da ovom prilikom resim to nesto prosto jer mi treba svega par parametra da podesavam, nekom drugom prilikom kad budem imao vise vremena cu se pozabaviti detaljnije sa tim.
Imam trenutno bitnije stvari da proguram a to je DAC i na kraju PWM modul.

@goran_68 Slobodne I/O imam ali touchscreen TFT trenutno nemam :) Docice i to na red verovatno pocetkom sledece godine ;)
[ mikikg @ 15.12.2013. 07:32 ] @
Imam jos jedan mali problemcic, resio sam ga drugacije ali me cisto interesuje sto to nece da radi kako ocekujem.

Dakle radi se o pointerima i prenosenju adrese umesto vrednosti (sad sam resio sa vrednostima), evo kako to izgleda:

Code:
//proto
void povecaj (int *ptr);

//func
void povecaj (int *ptr) {
    *ptr ++;
}

//main
int brojac = 10;

povecaj (&brojac);
//ovde ocekujem da brojac ima vrednost 11 ali se to ne desi, ostane 10, zasto?


Ako to ima veze mozda, ova funkcija povecaj() mi je u interapt rutini.
[ bogdan.kecman @ 15.12.2013. 12:42 ] @
ovako:

Code:

void povecaj (int *ptr) {
    (*ptr) ++;
}


i naravno optimizacija, volatile etc etc gde treba
[ mikikg @ 15.12.2013. 18:54 ] @
Da, tako radi. Nikad se nebi setio da mora zagrada!
Hvala.

Sta kao bez zagrade prvo inkrementuje pointer pa onda uzme adresu i u prazno onda sve ode? :)
[ bogdan.kecman @ 15.12.2013. 23:52 ] @
da, ++ ima veci prioritet
[ mikikg @ 16.12.2013. 00:10 ] @
Dobro napredujem lagano sa ovim F3, razlikuje se od F4 u dosta nekih sitnih detalja.
Sad sam progurao i ADC. Menu, Encoder i LCD sam skockao.

Nego kad si vec tu, nesto ne mogu da se pohvatam za prioritetima interapta.
Dakle imam dva tajmera, TIM2 i TIM3 (TIM1 i TIM8 ce mi trebati kasnije za PWM), hocu recimo da mi TIM3 i njegova rutina bude najveceg prioriteta, dakle dok se njegova rutina ne zavrsi nista me drugo ne sme prekidati posto ce to bitni moja glavna PID petlja pa su mi precizna vremena tu vrlo bitna (eventualno od PWM, ali nisam dotle dosao jos, ne znam trenutno).

Ja sam tu nesto butao sa NVIC_IRQChannelPreemptionPriority i NVIC_IRQChannelSubPriority ali nesto me ne konta ili ja njega :)
Stavio sam za sad u rutini od TIM3 toggle jednog pina ali vidim jitter, dakle nije bas on "glavni" baja, ulece mu prekid od TIM2.

Ja se izvinjavam, malo sam dosadan sa silnim pitanjima ali ovo mi je prva malo ozbiljnija app na ovoj platformi.

Sad nesto razmisljam, mozda sam trebao u startu da izaberem neki RTOS ali tek sa tim nisam radio :(
[ bogdan.kecman @ 16.12.2013. 00:29 ] @
meni se sad malo mesa implementacija izmedju 16bit pic i msp430, mips i
cortex jezgra no ako se dobro secam nvic na cortex-u radi tako sto dok
traje higher prio interrupt ovi nizeg prioriteta se stekuju i onda se
izvrse kada se zavrsi ovaj high prio interrapt + za razliku od klasicnog
vic-a cortex ima tu neku trailing foru da kada zavrsi high prio
interrupt ako postoji na cekanju lower prio interrapt on umesto da vrati
sve sa steka, pa turi opet sve sto treba na stek on samo prodje u drugi
interrapt i tu cuva nekih 12tak taktova u odnosu na "normalan" vic ..
takodje ima foru da kada pocne manje bitan interapt ako se desi high
prio interapt tokom pripreme za ulazak (setap steka, dizanje na stek
cega treba etc) cortex ce odma da uleti u high prio umesto da zavrsi sta
je poceo i udje u low prio pa njega prekine (kao sto rade normalni
vicevi) ... e sad detalja se bas ne secam a i moguce da je ovo cela
prica vezana za npr mips a da sam je ja dodelio cortex-u :D mada mislim
da je to cortex prica ...

inace sa samom implementacijom i koristenjem toga nemam veliko iskustvo
posto ja za ove moje potrebe imam onaj glavi core clock koji uzima svega
nekoliko taktova i jedan timer i to je to ... ostalo su externi hw
interapti koji su sami po sebi spori
[ mikikg @ 16.12.2013. 23:02 ] @
Joj sto je "dosadan" ovaj F3 sa svojim cakama, mislio sam da sam ADC prosao ali cim sam hteo jos kanala da dodam nastao je problem.
Vrtim se oko toda i ne mogu da ga pohvatam sto nece da radi.
Ne mogu da nadjem ni jedan normalan primer oko toga, sve sto sam nalazio je bilo za jedan kanal.
Ja sam na F4 to resio ali mi taj code isto nece radi na F3, zaglavi se na cekanju nekog flaga i nece dalje da ide.

Da li imate neki primer mozda za to?

Da li mozda ima varijanta da radi u kontinualnom modu stalno a ja recimo samo da iscitam prvi, drugi, x-ti registar od kanala?

UPDATE:
Uspeo sam da proguram preko DMA! Sad to radi kako treba, u "pozadini" nezavisno, puni jedan buffer i posle samo iscitavam ;)
Ovaj primer me je povadio, mada sam morao da prepravljam malo za ADC1/2 dok je u primeru koriscen ADC3/4 zbog OP-AMP-ova:
http://www.pezzino.ch/stm32-monitoring-multiple-analog-channels/

[Ovu poruku je menjao mikikg dana 17.12.2013. u 02:07 GMT+1]
[ mikikg @ 02.01.2014. 13:55 ] @
Citat:
bogdan.kecman:
meni se sad malo mesa implementacija izmedju 16bit pic i msp430, mips i
cortex jezgra no ako se dobro secam nvic na cortex-u radi tako sto dok
traje higher prio interrupt ovi nizeg prioriteta se stekuju i onda se
izvrse kada se zavrsi ovaj high prio interrapt + za razliku od klasicnog
vic-a cortex ima tu neku trailing foru da kada zavrsi high prio
interrupt ako postoji na cekanju lower prio interrapt on umesto da vrati
sve sa steka, pa turi opet sve sto treba na stek on samo prodje u drugi
interrapt i tu cuva nekih 12tak taktova u odnosu na "normalan" vic ..
takodje ima foru da kada pocne manje bitan interapt ako se desi high
prio interapt tokom pripreme za ulazak (setap steka, dizanje na stek
cega treba etc) cortex ce odma da uleti u high prio umesto da zavrsi sta
je poceo i udje u low prio pa njega prekine (kao sto rade normalni
vicevi) ... e sad detalja se bas ne secam a i moguce da je ovo cela
prica vezana za npr mips a da sam je ja dodelio cortex-u :D mada mislim
da je to cortex prica ...

inace sa samom implementacijom i koristenjem toga nemam veliko iskustvo
posto ja za ove moje potrebe imam onaj glavi core clock koji uzima svega
nekoliko taktova i jedan timer i to je to ... ostalo su externi hw
interapti koji su sami po sebi spori


Posle male pauze vratio sam se na STM32F3 …

Elem, ovo sa prioritetima interapta me je zekilo jer nisam konfigurisao kako treba.

Ja sam se bezuspesno vrteo oko ovoga:

Code:

  ...
  NVIC_InitTypeDef NVIC_InitStructure;
    
  /* Enable the TIM3 gloabal Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //nije imalo efekta sta god stavio
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //nije imalo efekta sta god stavio
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
    
  NVIC_SetPriority(TIM3_IRQn,0); //OVO JE BILO NEOPHODNO!
  ...


Dakle trebalo je da se doda NVIC_SetPriority() nakon cega je ta interapt rutina tj IRQ linija kojoj sam dodelio 0 postala "glavna". Ostalim linijama je naravno postavljen nizi prioritet (1,2,3 …).
U toj rutini sam za debugiranje imao toggle jednog izlaznog pina i sad je to vremenski "zakucano u mestu", nema jitter i ostalih problema koje sam imao pre nego sto sam to dodao!
[ mikikg @ 02.01.2014. 22:36 ] @
Sad je DAC dosao na red :)

Ovog puta necu da postavljam pitanja :) nego da postavim najprostiju mogucu varijantu za koriscenje internog DAC-a, bez DMA i bez TIMera.
Ja ovo pisem da bi eventualno drugi clanovi imali bar neke koristi od toga a i samom sebi kao mali podsetnik ;)

Code:

#include "stm32f3_discovery.h"

void dac_init() {
  
  DAC_InitTypeDef DAC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStruct;

  /* DAC Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

  /* GPIOA clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  /* GPIO CONFIGURATION of DAC Pin PA4 */
  GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_4;
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AN;
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* DAC channel 1 Configuration */
  DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
  DAC_Init(DAC_Channel_1, &DAC_InitStructure);

  /* Enable DAC Channel 1 */
  DAC_Cmd(DAC_Channel_1, ENABLE);

}

void dac_update(uint16_t dac_value) {
    
    /* Set DAC Channel1 DHR12L register */
    DAC_SetChannel1Data(DAC_Align_12b_R, dac_value); 
    
}


Dakle pozove se jednom dac_init() i posle npr dac_update(2048) da postavi 1/2 izlaznog napona / reference na PA4 pinu.

Komplikovanije primere sa DMA i TIMerima mozete naci naravno u Peripheral_Examples.

Sad treba samo malo da iscackam kako da uglavim jednu referencu za ADC i DAC (LM385Z 2.5V) posto bez toga je besmisleno raditi, mnogo je prljav 3V3 rail.
Na F4 je to bilo prosto, zaletuje se preko jednog kondenzatora, nadam se da je i ovde slicno.

UPDATE:
Vezano za dodatnu spoljnu referencu sa LM385Z, za DiscoveryF4 se ona samo zaletuje preko tantal 1uF kondenzatora C23 jer tu vec ima jedan 47ohm otpornik R23.
Za DiscoveryF3 se zaletuje preko takodje 1uF tantal kondenzatora C16 ali MORA da se skine kratkospojnik R31 i da se stavi isto recimo 47ohm otpornik na njegovo mesto, dakle predvideli su za "budzenje" ;)

[Ovu poruku je menjao mikikg dana 03.01.2014. u 00:22 GMT+1]
[ Risto. @ 06.01.2014. 21:50 ] @
mikikg, da li mozes da mi posaljes ako nije problem tu biblioteku sto si napisao za lcd, na f3discovery.
Pokusavam da napisem, ali da bar vidim kako treba da izgleda kod.
[ mikikg @ 07.01.2014. 07:15 ] @
Evo zip arhiva u prilogu.

Nije bas neki savrsen primer ali ces se snaci u svakom slucaju sta i kako treba da odradis.
Jos ako bi odradio preko SysTickTimer-a one delay funkcije to bi bilo drasticno bolje a mozes i da sherujes taj code ;)

Koristi se ovako:
Code:

    //Inicijalizuj LCD
    LCD_Init_pins();
    LCD_Display_init();
    LCD_cursor_control (0, 0);
    LCD_send_string("[DSP SMPS + PID]");

    LCD_goto_home_line2();
    LCD_send_string("Plese wait ...");


BTW: Malo sam ja "uleteo" u ovaj STM32 na brzinu, dosta stvari sam manje-vise napamet radio i tek sad neke stvari pocinjem dosta detaljnije da shvatam posle citanja ove knjige:
The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors, 3rd Edition
Odlican prirucnik za pocetnike a i verovatno za iskusnije korisnike, sve detalje su prosli i jako lepo opisali + dosta su se vezali bas za Keil okruzenje.
Srdacno preporucujem da "nabavite" ovu knjigu.
Citajuci tu knjigu kontam da je ovo M4 fenomenalno jezgro za "control" aplikacije. Veoma veoma ozbiljan procesor!

[Ovu poruku je menjao mikikg dana 07.01.2014. u 08:44 GMT+1]
[ Risto. @ 07.01.2014. 10:33 ] @
E hvala to mi treba.
A da odradim preko busy flag-a umesto delaya?
[ mikikg @ 07.01.2014. 13:59 ] @
Delay ti treba u svakom slucaju u prvih nekoliko koraka inicalizacije a cekanje busy flaga ima odradjeno tu u LIB ali nesto mi nije radio kako treba, ne znam sto (zato je taj deo logike disablovan).
[ Risto. @ 07.01.2014. 14:21 ] @
Aha tek sad vidim nejasan im je ovaj datasheet.
Pokusacu da poteram busyflag i da zamenim sa systicktimer delay-om, pa cu da objavim kod.
Dobro ti je ovo sa bitwiseAND da saljes jedan nibble ja se toga nikad ne bih setio :D.

Da ti nije mozda ovo greska
Code:

void LCD_wait_busy_flag (void) {
    //postavi R/W na 1
    GPIO_SetBits(LCD_RW);
    
    //postavi da D7 bude ulaz
    GPIO_Init_Mode(LCD_D7,     GPIO_Mode_IN);
    
    //cekaj dok linija D7 ne bude 0
    while (GPIO_ReadInputDataBit(LCD_D7) == 0) {}  // ti bi trebao da se vrtis u petlji dok je lcd_d7== 1 a ne 0 ?
                                                      // znaci while (GPIO_ReadInputDataBit(LCD_D7) == 1) {}
    
    //vrati da D7 bude izlaz
    GPIO_Init_Mode(LCD_D7,     GPIO_Mode_OUT);

    //postavi R/W na 0
    GPIO_ResetBits(LCD_RW);    
}


P.S. Ne radi ni sa tim...

[Ovu poruku je menjao Risto. dana 07.01.2014. u 15:36 GMT+1]
[ mikikg @ 08.01.2014. 02:56 ] @
Mozda je opet tu neki glup problem sa optimizacijom iz kompajlera pa ignorise tu petlju (jer je prazna), mada nebi trebalo, ne znam.

Ili je mozda problem na nivou HW-a, neki pull-up/down otpornik ili tako nesto.

Nezgodno je to ispratiti kada je sve vec ispisano, mora detaljno da se ide korak po korak i pratiti sta se tacno desava.

Zaboravio sam sad tacno ali mislim da mi je na nekim mestima (u nekim delovima cele te procedure pisanja na LCD) ona radila a da mi je iskrso problem kada sam hteo to svuda da implementiram.
To je pitanje na koje nisam nasao odgovor (jer se nisam dovoljno posvetio analizi problema) tj da li moze da se oslonimo na cekanje busy flag-a u svim fazama inicalizacije i pisanja na LCD.

Meni je tako kako stoji sa delay radilo sa stotinama FPS osvezavanjem pa se zato nisam mnogo ni bavio tim problemom, bilo mi je to vise nego dovoljna brzina a naravno i da je sve ispalo sporije nebi me mnogo tangiralo jer vremenski kriticni taskovi/funkcije nisu u vezi sa tim rutinama, tj ne cekam ja da zavrsi pisanje nego radim te sve stvari odvojeno po intereptima.

Naravno valjalo bi da se sve to lepo skocka da bude jedna fina univerzalna LIB ali jednostavno nisam stigao to sve da odradim.