DIY Electronic projects
ATmega168 7-Segmentni Display - Printable Version

+- DIY Electronic projects (https://forum.yu3ma.net)
+-- Forum: Mikrokontroleri (https://forum.yu3ma.net/forumdisplay.php?fid=52)
+--- Forum: Atmel (https://forum.yu3ma.net/forumdisplay.php?fid=55)
+--- Thread: ATmega168 7-Segmentni Display (/showthread.php?tid=1847)

Pages: 1 2 3 4 5 6 7 8 9 10


RE: ATmega168 7-Segmentni Display - gorankg - 04-02-2018

Stavi hex i poslednji source pa da pogledamo.
Drajver za lemilicu je radio Bogdan. Evo ovde imaš više o tome:

http://forum.yu3ma.net/showthread.php?tid=779
http://forum.yu3ma.net/showthread.php?tid=873&highlight=soldering


RE: ATmega168 7-Segmentni Display - Macola - 04-02-2018

Ronovar,

Vidim da se brineš da li taj kontroler (Atmega168) može postići to što želiš, pošto je osmobitni...

Nema potrebe za brigom.

Mada nikada nisam radio sa Atmelovim MCU, iz preliminarnih pregleda doc. znam da su bazirani na 8051 arhitekturi i da imaju dosta bolje organizovane tajmere nego PIC MCU, vektorisan interrupt, takođe sa nižom frekvencijom kvarca urade isti broj instrukcija, jer se kod PIC fclk deli sa 4 i to je brzina instrukcija a timeri su dosta nezgrapnije organizovani.
Ni jedan nije bolji MCU od tih 8 bit, da me pogrešno ne shvatiš, već svaki bude dobar za neku vrstu primene.

Osmobitni PIC na 20MHz (interna brzina instrukcijskog clk je na 5MHz svega) "vozi" DC servo motor sa enkoderom od 500 impulsa po krugu, do 6000 RPM i pritom mu je interrupt "dužan" da radi na 50KHz min. Vozi brzu PID regulacionu petlju i uz sve to ima serijsku komunikaciju, I2C EEPROM i bargraf displej od 10 LED.

https://www.google.rs/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0ahUKEwiU04e-jpzaAhUCCZoKHfhZCnkQFgg6MAI&url=http%3A%2F%2Fww1.microchip.com%2Fdownloads%2Fen%2FAppNotes%2F00696a.pdf&usg=AOvVaw3i9siA9i75y-W2tQwVJa1n

Atmel sa svojim bolje organizovanim tajmerima i vektorisanim isr najverovatnije može više od toga a u najmanju ruku bar isto.

To pak znači da tvoj Atmega168 uz 7 segment displej sa nekoliko cifara (možda 4cifre x 2 (zadata i ostvarena vrednost)) može "hladno voziti" termoregulator sa PID-Fuzzy regulacijom sa autotuning i pritom kontrolisati dva kanala dual-slope AD konvertera koji kritično zavisi od preciznosti vremena u MCU. Sve to direktno iz MCU uz par pomoćnih CMOS kola i možda jednog boljeg op-amp...
-----------------------
Uz put, kad si već pomenuo op-amp:
Za primene merenja temperature pomoću TC, radi se o svega par desetina mV za full-scale i LM324 i slični nisu za te stvari jer im je već ofset reda nekoliko mV i imaju izlaz u B klasi sa jakim crossover izobličenjima.
Ta merenja su osetljiva, ali i ne posebno brza, te ti tu preporučujem izvrsni i vrlo jevtin OP07, a u najgorem slučaju od višestrukih jevtinih a preciznih (single supply) MC33272 ili MC33274. Naravno da sada postoje i vrhunski single supply rail to rail op-amps sa "svemirskim" osobinama, ali stari i odlični OP07 možeš naći maltene i na trafici.
------------------------
Nije lako "zagušiti" jedan 8 bit MCU vrlo složenim zadacima, ali tako ga je lako "ugušiti" neoptimalnim pisanjem koda.
Poenta je u tvom napretku optimizovanog pisanja, što će doći vremenom i neophodnim radom.

Davne sedamdeset i neke je se pojavio 6502 CPU u civilstvu. "Spušten" iz vojne industrije (Rockwell ga je koristio) kada su dobili bolji.
Prethodno je asistirao u vođenju projektila sa svojih 8 bit i 2MHz...
Sa njim je kasnije za smrtničke civilne potrebe napravljen maleni Comodore 64 :-)

Tvoj Atmega168 je "zver na treći stepen" za tu napravu i sa njim se mogu vrlo ozbiljne stvari napraviti.

Ako ti je na primer instrukcijski ciklus reda 250nS ti imaš 4 instrukcije po uS, ili 4000 instrukcija po mS.
U prevodu, ako ti interrupt "zuji" na 1KHz ti možeš pravo čudo od koda napisati u isr rutini.
Četiri kilo instrukcije je prilično veliki kod koji može užasnu količinu toga uraditi...

U interupt rutini ne treba nikako pozivati nikakve funkcije jer to troši masivno vreme, takođe ne koristiti nikakve petlje i delay.
Tu se štedi vreme tako što se radi sa if-else, nekom osrednjom matematikom, inkrementovanjem varijabli i slično tome i obeležavanjem flagova na osnovu kojih se pokreće ili isključuje nešto "dole" u glavnom programu.
To ti je onako uprošćeno uputstvo za baratanje interruptom.

Evo ti neki primer (u C, pošto sam baš odavno napustio Basic) gde sam recimo poprilično natrpao interrupt na 8 bit MCU, sa varijabilnom vrednosti timera prema potrebnoj brzini sinhrovanizovanih par servo motora i nekih pneumatskih organa.
To vozi nekakvu mašinu za posebnu vrstu kesa, sa nekoliko servo-motora i nekoliko pneumatskih organa gde se sve obavi u jednom okretaju mašine.

Videćeš lako na osnovu imena i komentara da se tu dosta toga velikom brzinom obavlja i da ima dosta koda, a u stvari kontrolom sam utvrdio da ni pri najvećim brzinama nisam okupirao ni 30% vremena interrupta...

Code:
/*-------------------------- INTERRUPT HANDLER -----------------------------------------------*/
/*----------------- merenje vremena ili wdt..---------*/
bit timeout, tmr0_blink=0;
UBYTE rec_count=0;    
UWORD timer;
UWORD Timer0H,Timer0L;
   
void interrupt int_hand (void)
{    
    if(TMR0IF&&TMR0IE){  
        TMR0H=Timer0H;   //osvezavaju se iz calculate_tmr0(0-255 kao 1/t);
        TMR0L=Timer0L;
        //---------------------------
        tmr0_blink^=1; // moze se postaviti kao pin za kotrolu frekvencije
        //-------------------------------------------------------------------------------------------------
        if(tmr0_blink)pulse=1;                                 //impulsi simulacije celog kruga od 360*
        else {pulse=0; pulsezero_flag=1;}
        if(pegla_motor_flag && pulse)pegla_pulse=1;
        else pegla_pulse=0;
        if(en_pom_var && pom_var_flag && pulse)pom_var_pulse=1;
        else pom_var_pulse=0;
        //-----------------------------------------------------------------------------------------------    
        if((pulse)&&(pulsezero_flag)){pulse_count++; pulse1_count++; pulsezero_flag=0;}    
        //pulse_count je trenutni ugao, pulse1_count je za motor igala(max 720, tj. 2 kruga pegle)
        //-----------------------------------------------------------------------------------------------
        if((pulse_count>(recData[stop_vuce]*2)) && (pulse_count<(recData[start_vuce]*2))){
            virt_prozor=0; takt=0;
        }//prozor dodav
        else {virt_prozor=1; takt=1;}
        //-----------------------------------------------------------------------------------------------
        if(igle_flag)P3=pulse; //motor igala
        else P3=0;
        if(igle_flag){  
            if(pulse1_count>504 && !fotoigle)igle_flag=0; //ako je vise od 70% fotomaske
            if(pulse1_count>720)igle_flag=0;                //max. 2 kruga pegle
        }    
        if(!tast_igle){pulse1_count=0; igle_flag=1;}//rucni taster, efektivan uvek!    
        //-----------------------------------------------------------------------------------------------
        if(en_zumbe){                                                                             //zumba
            if(pulse_count>(recData[start_zumbe]*2) && pulse_count<(recData[stop_zumbe]*2)){
                if(pegla_motor_flag || bez_pegle_flag){zumba=1;}
                else {zumba=0;}
            }
            else {zumba=0;}            
        }
        if(en_zumbe1){                                                                            //zumba1
            if(pulse_count>(recData[start_zumbe1]*2)&&pulse_count<(recData[stop_zumbe1]*2)){
                if(pegla_motor_flag || bez_pegle_flag){zumba1=1;}
                else {zumba1=0;}
            }
            else {zumba1=0;}            
        }
        if(pulse_count>(recData[stop_tr_vaz]*2)&&pulse_count<(recData[start_tr_vaz]*2)){tr_vaz=0;}//tr_vaz
        else {
            if(pegla_motor_flag){tr_vaz=1;}
            else{tr_vaz=0;}
        }            
        //--------------------------------------------------------------------------------------------------
        if(pulse_count>=360){  //nula kruga, tj. gmt.,eksternim pulse_count=0; se postavlja na zeljenu poziciju
            pulse_count=0;
            if(jedan_krug && jedan_krug_flag){krug_count=0; sync_strt=1;}
            if(sync_strt){                  //sinhroni start u gmt. virtuelne rotacije
                //if(pom_var_en)pom_var_flag=1; //fleg za direktno asinhrono pokretanje motora pomocnog vara
                //else pom_var_flag=0;
                pom_var_flag=1;
                if(!bez_pegle_flag)pegla_motor_flag=1;   //fleg za direktno asinhrono pokretanje motora pegle
                jedan_krug=0;
                sync_strt=0;
            }
            if(krug_count==1 && jedan_krug_flag)stop_gmt_flag=1;
            if(stop_gmt_flag){              //sihroni stop u gmt
                pegla_motor_flag=0;           //moguce eksterno asinhrono iskljucenje motora ovim flagom
                pom_var_flag=0;               //moguce eksterno asinhrono iskljucenje motora ovim flagom
                jedan_krug_flag=0;
                stop_gmt_flag=0;
                if(en_igle_flag){
                    pulse1_count=0;   //brojac igala, dva kruga pegle max.
                    igle_flag=1;      //start igala
                }
                en_igle_flag=0;
            }
            if(pegla_motor_flag)krug_count++;
        }
        //---------------------------------------------------------------------------------------------------    
        int_temp++;
               TMR0IF = 0;
    }  
}

/*-----------------------------------------------------------------------------------------*/


/*-------------------------------------------------*/
void calculate_tmr0(UBYTE brzina) //podesavanje perioda TMR0
{                                 //primena moze biti vrlo raznovrsna
    long result=0;
    //if(brzina < 20)brzina=20;
    result=103560 / brzina;      
    time_lcd= 65535 - result;
    Timer0H=byte1(time_lcd);        //postavljanje frekvencije TMR0
    Timer0L=byte0(time_lcd);        //time_lcd zato sto se moze pogledati na LCD, po potrebi.
    //-----------------------------    
}
Eto vidiš da izgleda dosta komplikovano, ali 8 bit MCU može daleko više od toga.
Dakle, ukoliko radiš na optimizovanom pisanju, nećeš tako lako moći da "zagušiš" 8 bit MCU sa dosta složenijim poslom od tog koji želiš.
Jedan od mojih prvih predloga je da polako pređeš na C jezik (videćeš da je čak i jednostavnije) jer je optimizovaniji od Basic za 8 bit MCU i uverio sam se da pravi značajno manje koda i brže se sve izvršava oko takvih potreba. Kad jednom pređeš na C nikad se više nećeš vratiti na Basic na MCU.
Pozdrav

Edit:


Ukoliko želiš termoregulaciju sa TC kao sondom, srdačno ti preporučujem gotov ADC za te namene, poput MAX31855 koji se ima jevtino kupiti spakovan na maleni modul, ili možda znatno moćniji dualni ADS1118 koji je odvratno sićušan za normalno lemljenje, ali odličan.
Mislim da ćeš se daleko lakše i brže izboriti sa SPI ili I2C nego sa analognim front-end za takve stvari...

Ukoliko nameravaš da radiš hiperprodukciju termoregulatora, onda koristiš ultra jevtini diskretni dual-slope kao i ostali Kinezi sa takvom produkcijom i ne gine ti front-end i 4052 :-)


RE: ATmega168 7-Segmentni Display - ronovar - 04-02-2018

(04-02-2018, 07:57 PM)gorankg Wrote: Stavi hex i poslednji source pa da pogledamo.
Drajver za lemilicu je radio Bogdan. Evo ovde imaš više o tome:

http://forum.yu3ma.net/showthread.php?tid=779
http://forum.yu3ma.net/showthread.php?tid=873&highlight=soldering

 http://forum.yu3ma.net/showthread.php?tid=1847&pid=83388#pid83388

 Samo mi se osvjezavaju 000 a poanta je da iz Do Loop petlje bude uzimao vrijednost varijable i i kod interrupta prikaze tu varijablu i na displayu...dakle counter od 000 do 254 za probu.

 @Macola
 Ja sam uvijek mislio da tih 8-bitni MCU je dosta "spori" i ako mu nabacas periferiju koristis oba timera, pa malo preko serijeske sabirnice da ce da bude to previse za malisana...ali po ovome kodu sto sam vidio i sto ti radis sa MCU mocna je to stvar..kako si i rekao najbitnija je struktura i optimizacija programa...jer to je ono sto radi u pozadini...ja dugo nisam znao za timere a fenomenalna su stvar...prije sam koristio u Do Loop petlji WaitMs ili Wait i mislio sam da je to program napisani kako treba...sad tek ovo malo sto radim sa timerima vidim da sam neoptimizirano trosio CPU vrijeme i ako bih stavio vise peripetija na MCU i koristio u svakoj funkciji WaitMs ubrzo bih ubio MCU i to bi bili sporo ako bi se i uopce pokrenulo Smile

Ostajem na FastAVR jer mi najbolje lezi...nije problem prijeci na C (koji je napredniji i mocniji) ali FastAVR ima vecinom sve funkcije i dobar manual pa samo treba citati i experimentirati sa kodom i uz pomoc znalaca rjesiti problem...sve je to isto jer svaki jezik prevodi c ili bascom ili pascal ili fortron u asm kod koji se onda pretvara u hex kod koji MCU razumije...a i kod fastavra mi je zgodno da mi kompalirani bascom kod pretvara u asm pa mogu i asm direkt da kompiliram a i da vidim kako radi low level pisanje programa...pa mogu onda kasnije i asm kod malo preraditi da bude jos brzi ako negdje se ne izvrsava brzo...ima i odlican AVR simulator...mozda jednog dana kupim i za njega licencu dodje samo $29 a nudi debugger assembler i basic compiler i jos imas step by step debuger da se vide zastavice koja se postavi...odlicno..ali zasad sam na fastavru jer bitna je logika i optimizirano pisanje programa...badava mi c ako sam nefikasan u pisanju programa...Smile


RE: ATmega168 7-Segmentni Display - Macola - 04-02-2018

C ti je krajnje jednostavan jezik, a istovremeno može biti jako moćan.

Kada prvi put budeš zagrebao po C kodovima videćeš dauopšte nije teško.

Programiranje je posao za sebe i nema suštinsku vezu sa jezikom na kom pišeš. Kada naučiš da dobro pišeš onda je relativno lagano preći na drugi jezik koji nije previše suprotan od prethodnog.

Sa Basic nije teško preći na C. Teže je obrnuto. Ima raznih Basic verzija, ali ona koju sam nekad koristio, iskompajlira skoro dvostruko više HEX od onog sa C kompajlerima raznih tipova. moguće je da je taj tvoj basic dosta optimalniji, ne mogu znati to.
Saznaćeš tek kada istu stvar napišeš u oba i iskompajliraš njihovim kompajlerima.

U svakom slučaju je programiranje zanat koji ne zavisi od jezika kojim pišeš. Uvek se svodi na traženje optimalnijeg pisanja i izvršenja u bilo kom jeziku.
Pozz


RE: ATmega168 7-Segmentni Display - Milan94 - 04-02-2018

Iznecu svoje neko iskustvo PicBasic Pro za Pic MCU generise manji HEX kod od neoptimizovanog Microchip MPLAB XC kompajler koji je besplatan verujem da licencirana verzija kompajlira manji kod  ali ona i kosta pa je nisam ni probao.

Vecina kompajlera koji imaju ogranicenu velicinu koda u besplatnoj verziji rade jednako dobro kao i kupljena licenca koja nema ogranicenje jedina razlika je samo u tome.

Tamo gde igra uloga optimizacija onda u besplatnim verzijama guraju svasta kako bi ispao veci HEX a pored toga zamajavaju MCU nekim glupostima i tako ga usporavaju da je za neke stvari tesko upotrebljiv ali im je ta zastita kao najbolja jer tesko ce tu pomoci bilokakva medicina da se ukloni to nepotrebno djubre.


RE: ATmega168 7-Segmentni Display - Macola - 04-02-2018

Imao sam suprotno iskustvo sa PicBasic Pro i HITECH, doduše oba krekovana :-)
Kasnije sam kupio PICC18 i radio je ozbiljno bolje od oba.

Sasvim se slažem da guraju đubre u 00 verzije.


RE: ATmega168 7-Segmentni Display - vojinilic - 04-02-2018

Povela se lepa rasrava.
@ronovar
Macolu znam licno i znam sta je covek radio. Takodje licno poznajem jos nekoliko clanova foruma koji su decenijama unazad koristili MCU-ove i dobro znam sta su radili i sta jos uvek radi od toga. To je nekih 90% uredjaja, pri cemu je 10% zavrsilo u nekoj privatizaciji i kompletnoj zameni pogona.
8-bit MCU se koriste godinama unazad i koristice se godinama unapre. Vec sam ranije napisao da CPU unutar MCU-a ima jedan jedini zadatak, a to je izvrsavanje masinskog programa. Tako je i sa 8-bit MCU-ovima.
Ljudi prelaze ili ne na 32-bitne mcu-ove iz dva razloga. Prvo je masovni i ubrzani razvoj 32-bit MCU-ova, cime istima drasticno pada cena, pa onda ispadne (a inace i jeste tako) cena 32-bit MCU niza od cene 8-bit MCU sa slabijim periferijama. Drugi razlog je realna potreba, koja realno veoma retko moze da se oceti i time izvrsi migracija.
@Macola je sve lepo rekao. Samo cu napamenem jos jednom bitne stvati koje je rekao. Velicina HEX fajla ISKLJUCIVO zavisi od optimizacije pisanja programa!!! Ovde ne treba nikako razgovarati oko crack vs. no crack kompajlerima, vec iskljucivo o licenciranim kompajlerima koji su besplatni i koje proizvodjaci MCU-ova daju korisnicima da ih koriste, prijave bagove itd.
Kao sto je Macola rekao, posto si pocetnik, kreni (i sam sam to predlozio) sa ucenjem C programskog jezika. Jezik je izuzetno prirodan, a o brzini necu da govorim. Taj jezik je standard za programiranje i mislim da treba da se nauci.
Kao drugo, vec sam napisao ovde
http://forum.yu3ma.net/showthread.php?tid=1847&pid=83283#pid83283
kako treba povezati hardverko povezivanje i pisanje programa i na taj nacin dobiti optimalan program. Mozes da primetis da kod mene nema case-ova, if-ova itd., vec je to skockano maksimalno.
Kao trece, batali taj proteus. Imas protoboard. Napravi sistem, probaj i to ti je potvrda.
Takodje si napisao da zelis da koristi FastAVR posto ima sve funkcije i dobar maual. Prijatelju moj, to ti je najveca greska. Zlatno pravilo je da ne koristis niti jednu funkciju koju ti nudi okruzenje, posto te ono samo zagluplljuje. Takodje, ne znas kako je implementirana ta funkcija i ako dodje do nekog problema, ne znas da li je problem u tebi ili funkciji. Sam si rekao da si odusevljen hardverskim tajmerom. Prijatelju, isto kao sto je bilo muke sa tajmerom i satisfakcije od istog, pokreni sledeci modul MCU-a, sam, bez funkcija okruzenja i uzbudjenje ce biti jos vece. Kada jos onda povezes tmr interapt i npr. uart interapt da rade zajedno, to je prava stvar. Ozbiljno si usao u pricu i vise ti ne trebaju nikakve funkcije.
Mozda sam bio malo grub u pisanju, ali cvrsto stojim iza stava da ko god koristi bilo koju funkciju okruzenja, nikada nece da nauci da programira MCU, a jos manje da razume funkcionisanje rada MCU-a i njegovih integrisanih periferija.


RE: ATmega168 7-Segmentni Display - ronovar - 04-02-2018

Istina i tu se slazem....koji C preporucujete? Njega cu kad budem imao vremena (vecinom vikendima) pa polako isprobavam..ja sam skinuo ICCAVR i dosad mi je super..ima i calculator samo uneses potrebno vrijeme odaberes prescaler i kristal...i odmah ti ispise error vrijeme koje je potrebno i koje se dobi...no da se fokusiram na ovaj led segment koji nikako da mi proradi...dok mi ne stignu dijelovi mogu samo u proteusu da "vjezbam"...jesi mozda pogledao kod zasto osvjezavanje ne radi kako treba?

I zahvaljujem svima na pomoci...davno sam poceo sa AVR nesto sitno pa odustao jer nisam imao koga pitati zasto ovo zasto ono...ali ovako stvari bolje funkcioniraju.


RE: ATmega168 7-Segmentni Display - vojinilic - 04-02-2018

Prijatelju, ako koristis PIC MCU, onda programiras u MPLAB. Ako koristis AVR MCU, onda programiras u Atmel Studio. Ako koristis STM32, onda koristis AtollicTrue Studio. To su sve price proizvodjaca MCU-ova i njihovi kompajleri koji su besplatni za koriscenje. Kod njih nema zezanja. To je to. Sve drugo ako koristis, to je pitanje sta je.
Jos jedna stvar vezana za kompajlere koje sam nabrojao je da tu nema niti jedne jedine ugradjene funkcije, vec je programer prepusten sam sebi. To je prava stvar i za MCU, a i za pocetnika programera. Probaj.
Vec sam rekao, za bilo koju pomoc oko C programiranja, stojim na raspolaganju.


RE: ATmega168 7-Segmentni Display - Macola - 04-02-2018

Vojče,
Quote:Mozes da primetis da kod mene nema case-ova, if-ova itd., vec je to skockano maksimalno.

Pa Vojče legendo, ponekad ti mora zatrebati i neki if :-)

Code:
    #asm
    movf        _del2,f
    btfsc        status,2
    return    
    GLOBAL     _del1
loop_outer:
    movlw        del_const
    movwf        _del1
loop_inner:
    nop
    nop
    decfsz    _del1
    bra        loop_inner
    decfsz    _del2
    bra        loop_outer
    return    
    #endasm



RE: ATmega168 7-Segmentni Display - Macola - 04-02-2018

Ronovar,

Šalim se malo sa Vojčetom :-)

Lepo ti kaže Vojin. Najbrže stvari su: šiftovanje, inkrementiranje, dekrementiranje, maskiranje i ostale bitske operacije, potom if i switch.

Jbg, zavisno šta radiš u isr, ponekad se ne može bez if, bio on na asm nivou ili u C, gde skoro da nema razlike u izvršenju jer se jako jednostavno kompajlira u asm.

P.S.

Ono što sam nalepio u asm nema veze sa isr, da te ne zbunjuje. Samo sam nalepio neko bezveze parče asm koda, neke asm if-ove :-)


RE: ATmega168 7-Segmentni Display - vojinilic - 04-02-2018

(04-02-2018, 10:51 PM)Macola Wrote: Vojče,
Quote:Mozes da primetis da kod mene nema case-ova, if-ova itd., vec je to skockano maksimalno.

Pa Vojče legendo, ponekad ti mora zatrebati i neki if :-)

Code:
#asm
movf _del2,f
btfsc status,2
return
GLOBAL _del1
loop_outer:
movlw del_const
movwf _del1
loop_inner:
nop
nop
decfsz _del1
bra loop_inner
decfsz _del2
bra loop_outer
return
#endasm

Maki,

naravno. Ovo sto si postavio prvo mora da se usavrsi i kako se racuna delay petlja u petlji po racunanju trajanja masinskih ciklusa po instrukciji. Tako smo svi poceli.

Sto se If-ova tice, nisam nista lose mislio na if-ove. Cela moja prica je bila da se program pise prema rutiranom hardware-u. U datom primeru se selekcija cifara bila tako napravljenja da ti ne treba if, vec obicno rotiranje (ASM instrukcija). Kada bu drugi nacin rutiranja bio, moja prica bi pala u vodu i tada bi isao if-case. cela prica je takva samo da podstakne drugacij nacin razmisljanja. Nista drugo.
Inace, licno sam zagovornik ASM-a i ubedjenja sam da ko nije prosao ASM kod, taj nije osetio kako radi MCU. Pogotovo oko interapta i smestanja sadrzaja na stack. Kada se te stvari otkucaju u asm u prodju liniju po liniju u simulatoru (stari MPSIM - stara garda se seca), tek onda se kockice sloze i sve sto si citao oko nacina rada dodje na svoje mesto. Izvinjavam se ako gresim. Iskusniji ce da kazu i da se prepoznaju.!!!


RE: ATmega168 7-Segmentni Display - mikikg - 04-02-2018

U danasnje vreme C/C++ je postao neophodna stvar, to je vrlo ozbiljan jezik koji programerima ne pravi nikakve granice, sve je moguce da se napravi i odradi i sto je najbitnije velika je podrska i zajednica za razne gotove projekte i primere, vise od pola software-a trenutno na vasem racunaru sa kojim citate ovaj forum radi upravo preko programa i raznih pod modula i drajvera koji su pisani bas u C++, sve vise u C++14 i C++17 i noviji standard koji se planira uskoro.
Zanimljivo je da je C++ evoluirao tako sto se pojavila ekipa programera i rekla, dobro to je sve super ali meni STVARNO trebaju funkcije za neke kompleksnije stvari i napravili Boost biblioteku za C++. Ta biblioteka je bila toliko popularna, toliko masovno koriscena i imala toliku ogrmnu zajednicu da je u stvari C++14 postao standard sa upravo tim funkcijama integrisanim i to napisanim do PERFEKCIJE tacno, sigurno i brzo (obavezan unit-testing) da nema potrebe pisati svaki put jedno isto kada su ljudi tokom toliko godina uvedili sve programerske probleme i izazove i pokusali tj uspeli to da implementiraju u jezik i njegov standard.

Jezik je potpuno prirodan sto kaze Vojin, lako se uci kao jezik, ima pravila koja se lako savladaju a sve ostalo je pozadina toga tj CPU ili MCU koji koristis sa svojim internim stvarima, program radi ono sto mu je programiranu i to je to, cak sada je izvodljivo prevoditi isti program za potpuno razlicite kontrolere i procesore! Usvojis neka pravila kod pisanja programa i sve ostalo je stvar organizacije, dakle jedan isti program moze da se vrti na X razlicitih platformi.
Program napisan u C/C++ bilo kao biblioteka ili kao got neki izvrzi HEX je vrednost koja vama vasu logiku koju ste osmislili za nesto samo srovodi u code. Taj code je "re-uporebljiv" i tako treba da se pise a da bi ga napisao da bude super-mega reupotrebljiv moras savlati mnoge tajne tog jezika i mogucnosti koje ima.


RE: ATmega168 7-Segmentni Display - vojinilic - 04-02-2018

(04-02-2018, 10:57 PM)Macola Wrote: Ronovar,

Šalim se malo sa Vojčetom :-)

Lepo ti kaže Vojin.   Najbrže stvari su: šiftovanje, inkrementiranje, dekrementiranje, maskiranje i ostale bitske operacije, potom if i switch.

Jbg, zavisno šta radiš u isr, ponekad se ne može bez if, bio on na asm nivou ili u C, gde skoro da nema razlike u izvršenju jer se jako jednostavno kompajlira u asm.

P.S.

Ono što sam nalepio u asm nema veze sa isr, da te ne zbunjuje. Samo sam nalepio neko bezveze parče asm koda, neke asm if-ove :-)

Moram da te ispravim. Nisi okacio asm if-ove, vec asm:
for(_del1=0; _del1 < del_const; _del1++)
for(f=0; _f < del_2; f++ );

Samo je u ASM u bilo --.
Secam se ovoga, kao da je juce bilo, a nisam pisao u ASM jedno 10 godina.


RE: ATmega168 7-Segmentni Display - Macola - 04-02-2018

Vrlo je zahvalno upoznati asm i specifičnosti za konkretni MCU.
; ovo je komentar u asm

Code:
decfsz    _del1            ; umanji varijablu _del1 za jedan i preskoči sledeći red ako je ona jednaka nuli
    bra        loop_inner    ; inače skoči na labelu loop_iner
    decfsz    _del2           ; umanji varijablu _del2 za jedan i preskoči sledeći red ako je ona jednaka nuli
    bra        loop_outer   ; inače skoči na labelu loop_outer
    return                      ; ako je _del2 = 0 vrati se odakle si pozvan...

Na primer tako to izgleda u asm.
"decfz" Dekrementiranje neke verijable sa istovremenim if(varijabla==0)uradi_nešto;


RE: ATmega168 7-Segmentni Display - vojinilic - 04-02-2018

Maki, ti si otisao na 18F aritehturu. Ja sam na 10-10F, gde nema BRA instrukcije, vec GOTO.


RE: ATmega168 7-Segmentni Display - Macola - 04-02-2018

(04-02-2018, 11:11 PM)vojinilic Wrote:
(04-02-2018, 10:57 PM)Macola Wrote: Ronovar,

Šalim se malo sa Vojčetom :-)

Lepo ti kaže Vojin.   Najbrže stvari su: šiftovanje, inkrementiranje, dekrementiranje, maskiranje i ostale bitske operacije, potom if i switch.

Jbg, zavisno šta radiš u isr, ponekad se ne može bez if, bio on na asm nivou ili u C, gde skoro da nema razlike u izvršenju jer se jako jednostavno kompajlira u asm.

P.S.

Ono što sam nalepio u asm nema veze sa isr, da te ne zbunjuje. Samo sam nalepio neko bezveze parče asm koda, neke asm if-ove :-)

Moram da te ispravim. Nisi okacio asm if-ove, vec asm:
for(_del1=0; _del1 < del_const; _del1++)
for(f=0; _f < del_2; f++ );

Samo je u ASM u bilo --.
Secam se ovoga, kao da je juce bilo, a nisam pisao u ASM jedno 10 godina.

Ma šalio sam se Vojče :-) i naravno da je --:

for(int i=del1; i>0; i--){
...
}


RE: ATmega168 7-Segmentni Display - vojinilic - 04-02-2018

(04-02-2018, 11:20 PM)Macola Wrote:
(04-02-2018, 11:11 PM)vojinilic Wrote:
(04-02-2018, 10:57 PM)Macola Wrote: Ronovar,

Šalim se malo sa Vojčetom :-)

Lepo ti kaže Vojin.   Najbrže stvari su: šiftovanje, inkrementiranje, dekrementiranje, maskiranje i ostale bitske operacije, potom if i switch.

Jbg, zavisno šta radiš u isr, ponekad se ne može bez if, bio on na asm nivou ili u C, gde skoro da nema razlike u izvršenju jer se jako jednostavno kompajlira u asm.

P.S.

Ono što sam nalepio u asm nema veze sa isr, da te ne zbunjuje. Samo sam nalepio neko bezveze parče asm koda, neke asm if-ove :-)

Moram da te ispravim. Nisi okacio asm if-ove, vec asm:
for(_del1=0; _del1 < del_const; _del1++)
   for(f=0; _f < del_2; f++ );

Samo je u ASM u bilo --.
Secam se ovoga, kao da je juce bilo, a nisam pisao u ASM jedno 10 godina.

Ma šalio sam se Vojče :-) i naravno da je --:

for(int i=del1; i>0; i--){
...
}

Znam. Samo evociram uspomene!!!


RE: ATmega168 7-Segmentni Display - Macola - 04-02-2018

Moćna je stvar asm i takođe je sjajno što se može miksovati i sa C i sa basic, kao i sa gomilom drugih jezika.

Jako pomogne kada je neophodno vreme i prostor.

Seti se pokojnog čika Zokija (Mikijevog oca) i njegovog savršenog komentara o PIC16F84: " tu ti uvek zatreba jedan pin više i još dva bajta " :-)

Kad već evociramo uspomene...

P.S.

Pisala su se čuda u 2 kilobajta i sa 4Mhz.


RE: ATmega168 7-Segmentni Display - ronovar - 04-02-2018

Dok se vi zezate ja malo radio..isao gledad brojaca za segment i nije dobro incrementirao pa je stalno vrtilo loop na sva tri segmenta...evo stavio sam fiksni broj 123 pa evo kako je ispalo kada se uspori frekvencija:



E sad to kad se ubrza na nekvih 100Hz mislim da ce da bude bas neprimetno...sad mi nije jasno nebi li trebalo da:

svi segmenti svijetle a gasi se samo trenutni upise se vrijednost i upali se trenutni i tako u loop? Pa kada se gleda usporeno samo jedan display se uvijek gasi upisuje vrijednost i pali.

To mi jos nije jasno....koji je princip za to pali gasi...dali treba da kako je u animaciji sam dobio sa kodom ili mora da svi svijetle a samo jedan se gasi pali?