[ Milan_95 @ 18.04.2014. 17:57 ] @
Dao sam sebi za zadatak jos odavno napraviti motalicu za transformator , to sam izabrao za maturski pa ce mi biti potrebna pomoc oko svaceg po malo :)

Za pocetak ideja:
Atmega treba: 1. da preko pwm-a kontrolise dc motor
2. da na LCD-u 2x16 ispisuje neke od podataka
3. kontrloa step motora
4. tastatura za zadavanje vrednosti

Za sad kupljen ATmega8L (u SMD) ali posle praznika pravim plocicu da smd prilagodim dip kucistu , trenutno skidam avr-studio 6.2 , planiram programiranje u c-u ,

Za programator planiram koriscenje, za pocetnike standardnog, seriskog programatora ...

[ zica49 @ 18.04.2014. 18:11 ] @
Kako ti mozemo pomoci ne vidim pitanje?
[ Milan_95 @ 18.04.2014. 18:31 ] @
Evo prvog pitanja :
Da li cu petlji while ispod ovog konfigurisanja pwm moci da menjam vrednost OCR2 i time menjam brzinu motora ?
Posto planiram na radi na 4MHz na koliko Hz da podesim pwm za dc motor (neka okvirna brojka) ?

Code:
DDRB |= (1 << DDB3);//pb3 kao pwm

    OCR2 = 128; //duty (max 256)

    TCCR2 |= (1 << COM21);
    // neinvertujuci mod

    TCCR2 |= (1 << WGM21) | (1 << WGM20);
    // fast mod

    TCCR2 |= (1 << CS20);
    // bez preskalera


[Ovu poruku je menjao Milan_95 dana 18.04.2014. u 19:45 GMT+1]
[ ColdKeyboard @ 18.04.2014. 23:32 ] @
Procitaj detaljno datasheet i kako radi PWM modul.

Uvek imas opciju da menjas duty cycle kao i frekvenciju. Prilikom inicijalizacije podesi PWM modul da radi u zeljenom modu i sa zeljenom frekvencijom. Nakon toga odredi da li ces unutar neke petlje, interrupta ili neki treci nacin da menjas
sirinu impulsa i u principu to ti je to. Ne znam koja ti amperaza treba ali posto motanje uglavnom ide u jednom smeru, mozes da koristis neke fetove ili tranzistore da pokreces motor, i za to imas tonu sema i objasnjenja.

Ti u principu bilo gdje mozes da stavis OCR=0xYY i da podesis faktor ispune PWM signala (moze se desiti da ti PWM modul da taj faktor ispune tek u sledecem ciklusu, procitaj u datasheet-u zasto. Ali mislim da ti to nije toliko bitno u ovom slucaju jer preciznost ti nece biti narusen skoro nikako i greska moze da bude samo u prvom impulsu, ostali su ok).
[ Milan_95 @ 19.04.2014. 10:12 ] @
Amperaza je tipa 7-10A i planiram da koristim irfz48 sa nekim malim hladnjakom ili nesto slicno , procitao sam ds skoro 60% al nisam bas skontao jer nema nijednog primera , jeste bas opsirno al mislim da je bolje da su dali jedan primer :D

I ako ce mi se promena ispune menjati mozda u sl ciklusu to nece predstavljati nikakav problem...

Zamisao je da ja preko analognog ulaza ocitavam napon koji ce korisnik menjati potenciometrom i na osnovu visine napona menjam OCRx i time menjam brzinu motora...

Skinuo sam include fajl za HD44780 ali ima u njemu nekoliko fajlova sa extenzijom .h sem sto misam siguran koji da pozovem ne znam ni gde da smestim ove fajlove , kad ih pozovem u program debager ne izbacuje gresku al svejedno bolje da pitam

[Ovu poruku je menjao Milan_95 dana 19.04.2014. u 12:29 GMT+1]
[ HeYoo @ 19.04.2014. 11:33 ] @
Citat:
procitao sam ds skoro 60% al nisam bas skontao jer nema nijednog primera , jeste bas opsirno al mislim da je bolje da su dali jedan primer :D


Ako ukucas "avr pwm dc motor" u gnjugl naci ces dosta primera, tutorijala i biblioteka.

Za tajmere i pwm:
http://www.avrfreaks.net/index...d788f89772f7a108c5d6a8f8655654
http://www.avrfreaks.net/index...p;postdays=0&postorder=asc
[ Milan_95 @ 19.04.2014. 17:19 ] @
I jos jedno pitanje u vezi Atmel studio 6.2 kad pokrenem program nece da mi ocitava I/O View jel zna neko u cemu je caka ?
[ HeYoo @ 19.04.2014. 21:16 ] @
Nema cake, to tako funkcionise. Moras da pauziras izvrsavanje ili da stavis negde breakpoint da bi mogao da vidis stanje registara, promenljivih ili sta vec posmatras.
[ Milan_95 @ 19.04.2014. 21:26 ] @
aaa znam u asembleru da nije moralo da se stopira pa sam pomislio da je isti princip
[ Milan_95 @ 23.04.2014. 13:23 ] @
Program je pri kraju ali nisam siguran kako u C-u da napisem : Cekaj ovde dok na portb6 ne dodje +5V ?
[ bogdan.kecman @ 23.04.2014. 13:30 ] @
Code:

// cekaj dok B6 ne postane 1 (ne dodje 5V na pin B6)
while (!PORTB.6);

[ Milan_95 @ 23.04.2014. 16:22 ] @
Code:

#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
#include "LCD/lcd.h"

int d_zice=50,broj=0,T=0,b_zica,b_namotaji,step,N=0,N1,start;

int main (void)
{

    
    ////////////////PWM///////////////////////////
    void pwm_dc()
    {    OCR2=0;
        DDRB|=(1<<DDB3);//pb3 je izlazni
        TCCR2 |= (1 << COM21);//ne invertujuci mod
        TCCR2 |= (1 << WGM21) | (1 << WGM20);// fast mod pwm
        TCCR2 |= (1 << CS20);//bez preskalera
        return;
    }
//////////////////////Kraj PWM //////////////////

////////////////////Potenciometar ///////////////////
    int pot1()
    {
        int vrednost_pot;
        ADMUX = 0;         // selektovan pc0 adc
        ADMUX |= (1 << REFS0);    // AVcc je referentan
        ADMUX &= ~(1 << ADLAR);   // 10bit rezolucija
        
        ADCSRA |= (1 << ADPS2) | (1 << ADPS1);    // 64 preskaler
        ADCSRA |= (1 << ADEN);    // ukljuci ADC

        ADCSRA |= (1 << ADSC);    // Start ADC konverzija

        while(ADCSRA & (1 << ADSC));      //cekaj da se zavrsi konverzija
        vrednost_pot = ADCL;
        vrednost_pot = (ADCH << 8) + vrednost_pot;    // posto je 10 bit ADCval Low + Hgih

        return vrednost_pot;
    }
    ///////////////////////Kraj Potenciometra /////////////////
    
    /////////////////////////Steper //////////////////////////
    void step_motor(int broj_obrtaja)
    {    
        DDRC|=(1<<DDC1) | (1<<DDC2) | (1<<DDC3) | (1<<DDC4);//c1,c2,c3,c4 su izlazni
        int t;
        for(t=1;t<=broj_obrtaja;t++)
        {
            PORTC|=(1<<PORTC1); //upali prvi namotaj  1/4
            _delay_ms(10);
            PORTC &= ~(1<<PORTC4); //ugasi cevrti namotaj 1
            _delay_ms(10);
            PORTC|=(1<<PORTC2); //upali drugi namotaj  1/2
            _delay_ms(10);
            PORTC &= ~(1<<PORTC1); // ugasi prvi namotaj 2
            _delay_ms(10);
            PORTC |= (1<<PORTC3); // upali treci namotaj 2/3
            _delay_ms(10);
            PORTC &= ~(1<<PORTC2);//gasi drugi namotaj 3
            _delay_ms(10);
            PORTC |= (1<<PORTC4);// upali cetvrti namotaj 3/4
            _delay_ms(10);
            PORTC &= ~(1<<PORTC3); // ugasi 3 namotaj 4
            _delay_ms(10);
            }
            PORTC &= ~(1<<PORTC4); //kad sve zavrsi pogasi sve namotaje na motoru
    }
    //////////////////////////////////Kraj stepera ///////////////////////////////////
    
    int napajanje()
    {
            DDRB &= ~(1<<DDB4); //Ako postoji +5V na PB4 tad je externo napajanje ukljuceno
            int kontrola;
            kontrola=PORTB4; //promenljiva "kontrola"
            return kontrola;
    }
    
    int namotaji()
    {    DDRD &= ~(1<<DDD0) | ~(1<<DDD1) | ~(1<<DDD2) ;//d0,d1,d2 su ulazni
        int OK=0; //promenljiva broj koju vracamo u program
        
        LCDClear();
        LCDWriteStringXY(0,0,"Broj namotaja je");
        
        back1:if(PORTD0 || PORTD1 || PORTD2 == 1) ///ako je stisnuto bilo sta od dugmica idi dalje ako nije cekaj
        {  if (broj>9999) broj=0;
        
            if(PORTD0==1 && PORTD1==0 && PORTD2 == 0 && broj>0)
            {
                OK=OK+1;
                _delay_ms(800);
                LCDClear();
                LCDWriteStringXY(3,0,"Zadato je:");
                LCDWriteIntXY(2,1,broj,4);
                LCDWriteStringXY(7,1,"namotaja"); ///Unosenje broja namotaja
                _delay_ms(3000);
                goto izlaz;
        
            }
            if (PORTD0==0 && PORTD1==1 && PORTD2 == 0)
            {
                broj=broj+1;
                _delay_ms(600);
                LCDWriteIntXY(6,1,broj,4);
                goto back1;
            }
            if (PORTD0==0 && PORTD1==1 && PORTD2 == 1)
            {
                broj=broj+10;
                _delay_ms(600);
                LCDWriteIntXY(6,1,broj,4);
                goto back1;
            }
            if (PORTD0==1 && PORTD1==0 && PORTD2 == 0)
            {
                broj=broj+100;
                _delay_ms(600);
                LCDWriteIntXY(6,1,broj,4);
                goto back1;
            }
            if (PORTD0==1 && PORTD1==0 && PORTD2 == 1)
            {
                broj=broj+1000;
                if(broj>9999) broj=0;
                _delay_ms(600);
                LCDWriteIntXY(6,1,broj,4);
                goto back1;
            }
        }
        
        
        else  //ako nista nije stisnuto vrati se
        {
            _delay_ms(5);
            goto back1;
        }
        
        izlaz:return broj;
        } 
        
        int zica()
        {
        DDRD &= ~(1<<DDD0) | ~(1<<DDD1) | ~(1<<DDD2) ;    
            
        back2:if(PORTD0==1 && PORTD1==0 && PORTD2 == 0 && d_zice>99)
            {    _delay_ms(800);
                LCDClear();
                LCDWriteStringXY(3,0,"Zadata debljina:");
                LCDWriteIntXY(2,1,d_zice,4);
                LCDWriteStringXY(7,1,"um"); ///Unosenje debljine zice
                _delay_ms(3000);
                goto izlaz;
            }
        
        if(PORTD0==0 || PORTD1==1 || PORTD2==0)
        {
            d_zice=d_zice+100;
            _delay_ms(600);
            LCDWriteIntXY(6,1,d_zice,4);
            goto back2;
        }
        if(PORTD0==1 || PORTD1==1 || PORTD2==0)
         {
             d_zice=100;
             LCDWriteIntXY(6,1,d_zice,4);
             goto back2;
         }
        izlaz:return d_zice;
        }
    
    
    
    while(1)
    {     DDRB &= ~(1<<DDB6);
         DDRD &= ~(1<<DDD0) | ~(1<<DDD1) | ~(1<<DDD2) ;//d0,d1,d2 su ulazni
        
        if(T==0){
        LCDInit(LS_BLINK|LS_ULINE);//Inicijalizacija lcd
         LCDClear(); // ocisti lcd
         LCDWriteStringXY(3,0,"BOZIC");
         LCDWriteStringXY(8,1,"POWER");//// pozdravna poruka
         _delay_ms(5000);
         LCDClear();//ocisti
         LCDWriteStringXY(2,0,"Unesite broj");
         LCDWriteStringXY(4,1,"namotaja"); ///Unosenje broja namotaja
         _delay_ms(2000);
         b_namotaji=namotaji();
         LCDClear();
         LCDWriteStringXY(0,0,"Debljina zice je :");
         b_zica=zica();
         step=b_zica/100;
         pwm_dc();
         T=1;
         } ///pocetna podesavanja za motanje
         
        if(PORTD0==1 && PORTD1==0 && PORTD2==0) start=1;
        
        if(start==1)
        {
        if(N==b_namotaji) 
        {OCR2=0;
        LCDClear();
        LCDWriteString("Namotavanje zavrseno");}
        
        if(PORTD0==1 && PORTD1==0 && PORTD2==0) //ok dugme je stop
        OCR2=0;
        LCDClear();
        LCDWriteStringXY(4,0,"STOP !!!");
        while (!PORTB6);
         if(PORTB6==1)
         {
        OCR2=pot1();
         step_motor(step);
        N=N+1; 
        N1=b_namotaji-N;
        LCDClear();
        LCDWriteStringXY(0,0,"N=");
        LCDWriteIntXY(0,4,N,4);
        LCDWriteStringXY(0,1,"Preostalo=");
        LCDWriteIntXY(12,1,N1,3);
         }
         
        }
        }
    }


Evo koda , posto je moj prvi kod za atmega8 nek bude open source :D Takodje ako neko pronadje gresku pre mene nek javi :D
[ HeYoo @ 23.04.2014. 16:53 ] @
Ako ti je ovo prvi pokusaj i ako funkcionise kako si zamislio, super. Entuzijazam je najbitnij ali evo nekoliko saveta:

Resi se goto naredbi. Umeto toga koristi kombinaciju while i switch za razresavanje unosa. Osim toga, bio bi dobro napraviti neki debounce tih tastera.
Resi se delay naredbi. One blokiraju mikrokontroler dok zadato vreme ne istekne. Umeto toga koristi tajmer i interapte.

Ako ti engleski nije problem, imas zilion uputstava kako uraditi ovo ili ono.
Procitaj ovo:
http://www.elektronika.ba/foru...a8f29ffbb8345b8ecd7c1138b5ac5f
[ Milan_95 @ 23.04.2014. 17:00 ] @
Nisam bas neki expert za engleski al mogu da razumem :)
Jel delay blokira i pwm ?
[ bogdan.kecman @ 23.04.2014. 17:05 ] @
ako koristis hardwerski modul za pwm onda ga ne blokira
[ HeYoo @ 23.04.2014. 17:06 ] @
Nece blokirati pwm jer je on resen hardverski.

Osim procesora svaki MCU ima i periferije. Tako imas ADC, tajmerske, UART.. module. Fora je da periferije i MCU mogu da rade paralelno. Tako dok tajmer broji do 100000, procesor moze da radi nesto drugo.
Koriscenjem delay naredbe ti ne koristis hardverski tajmer nego sam procesor zamajavas brojanjem, a on bi za to vreme mozda mogao nesto pametnije da radi.

[Ovu poruku je menjao HeYoo dana 23.04.2014. u 18:20 GMT+1]
[ Milan_95 @ 23.04.2014. 17:19 ] @
Code:
void pwm_dc()
    {    OCR2=0;
        DDRB|=(1<<DDB3);//pb3 je izlazni
        TCCR2 |= (1 << COM21);//ne invertujuci mod
        TCCR2 |= (1 << WGM21) | (1 << WGM20);// fast mod pwm
        TCCR2 |= (1 << CS20);//bez preskalera
        return;
    }


Ovo sam po nekom tutorijalu skontao ali sad ako ga delay od stepera bude prekidao onda cu morati koristiti tajmere ...
ostale pauze ne uticu na sam rad programa tj motanja trafoa ...
[ Milan_95 @ 12.05.2014. 08:06 ] @
Evo malo da osvezim temu , pocelo je prakticno da se radi, danas stize lcd, za sad zavrseno napajanje uC i prebacen u DIP kuciste , ipak ce biti koriscena dva dc motora nece biti stepera



za crtanje sema po plocicama koristim tonertransfer...

Da li PonyProg2000 radi na win7 ?

[Ovu poruku je menjao Milan_95 dana 12.05.2014. u 18:49 GMT+1]
[ Milan_95 @ 14.05.2014. 17:30 ] @
Napravio sam programator , nisam stavio externi oscilator (imam ali nije povezan) povezao sam sve vcc na +5 i sve gnd na gnd povezao sam mosi sck miso , e sad ima li neki program koji radi na win7 da spustim program pomocu seriskog programatora ili da podignem win xp?
[ Milan_95 @ 15.05.2014. 10:03 ] @
monolog -.-
[ Milan_95 @ 15.05.2014. 16:56 ] @
Moze li neko da mi posalje fuse za ovaj atmega imam problem sa taktom jer bez externog oscilatora nije hteo da mi prepozna, pa sam stavio kvarcni na 4mhz onda sam ucitao program samo da mi pusti "1" na portc i to je radilo, pa sam probao sa blinkom i tu se javlja problem, onda sam se malo igrao sa fuse bit pomocu ds sam postavio bite da mi radi na 1mhz internim oscilatorom ali to nije radilo kad skinem kvarcni, onda sam probao jos neke kombinacije na kraju sam morao da pravim 1MHZ sa 555 tajmerom da bi ga uopste pony prepoznao ... Vise se nebih igrao sa tim pa molim da mi neko posalje podesavanja za 4mhz interni oscilator jer ocigledno negde gresim ,

Cudno mi je to sto odmah po prvom ukljucivanju nije imao fabricki takt od 1mhz ,
Da li je problem u tome sto je moj atmega u tqfp kucistu ?
[ Milan_95 @ 28.05.2014. 12:27 ] @
Ne vidim gde gresim a ovde mi program staje :

Code:
while(PIND & (1<<PIND0)) || PIND & (1<<PIND1)) == 0


kad je samo jedan uslov onda radi
[ Odin D. @ 28.05.2014. 13:14 ] @
Zaejbo si sa zagradama.
Citav uslov za while mora biti u zagradama.

Kod tebe je to samo ono sto je prije || operacije.
Treba npr. ovako:

while(((PIND & (1<<PIND0)) || PIND & (1<<PIND1)) == 0)

Ovo bi trebalo da je sintakticki ispravno, ali ne znam da li si to htio.
U svakom slucaju, prekontrolisi i vodi racuna o prioretetu operatora i da na kraju imas isto lijevih koliko i desnih zagrada :)
[ Milan_95 @ 28.05.2014. 19:02 ] @
Kad se malo glava ohladila bilo je logicno da to ovako treba da pise

Code:

while(((PINC & (1<<PINC4)) && PINC & (1<<PINC5)) != 0)
    {
    } // Vrti se u praznoj petlji dok se ne stisne neki od tastera na c4 ili c5

[ Milan_95 @ 31.05.2014. 11:51 ] @
Moze li program nakon externog prekida da se vrati na ono mesto sa koga je gl. program prekinut ? Sta treba da dodam ?
Code:
ISR(INT0_vect)
{
    TCCR2 &= ~(1 << COM21);
    lcd_clrscr();
    while (okW&&tast1W!=0)
    {lcd_string("    STOP\n");
        lcd_string(" OK-nast 1-kraj");
        _delay_ms(100);
        lcd_clrscr();
        lcd_home();
    }
    
    if (tast1W==0)
    {lcd_clrscr();
        lcd_string(" Motanje zavrseno\n");
        sprintf(namot_ch," Namotano %d",namotano);
        lcd_string(namot_ch);
        while(1)
        {}}
        return;
    }
[ goran_68 @ 31.05.2014. 12:46 ] @
Uvek se tamo i vraća. Ne treba ništa da dodaješ. Nije ti dobra ova obrada prekida. U funkciji u kojoj obrađuješ prekid obavljaš samo najneophodnije stvari (npr. postaviš neki flag da se prekid uopšte desio, uvećaš/umanjiš neki brojač itd). Potom se prekidna rutina napušta i izvršavanje se nastavlja od one tačke na kojoj si bio pre nego se prekid desio. Stvar tvog koda u glavnom programu je da obradi dalje to što je prekid doneo.
[ Odin D. @ 31.05.2014. 14:07 ] @
Citat:
Milan_95: Moze li program nakon externog prekida da se vrati na ono mesto sa koga je gl. program prekinut ? Sta treba da dodam ?

Poslije prekida program ce se sam vratiti tamo gdje ga je prekid omeo.
Medjutim, u zavisnosti sta se odvijalo u prekidnoj rutini, odredjeni registri/flagovi (pogledaj npr. STATUS REGISTER) u procesoru mogu biti promjenjeni.
Da bi obezbedio da se po povratku iz prekidne rutine u glavni program procesor nalazi u istom stanju u kome je bio prije nego je prekinut, to prva stvar koju moras uraditi po ulasku u prekidnu rutinu je da sacuvas stanje STATUS registra (i eventualno nekih drugih koji ce se promjeniti u prekidnoj rutini), i neposredno prije povratka iz prekidne rutine u glavni program vratis ta stanja u svoje pripadajuce registre.

Ne znam koji kompajler koristis, i to moze biti rjeseno automatski u kompajleru, a i ne mora.
U slucaju da jeste, kompajler ce sam dodati to u tvoj kod, a u slucaju da nije - moras sam.
Cak i kad jeste, ne mora znaciti da automatski dodaje za sve moguce registre, mozda samo za STATUS.
Pogledaj dokumentaciju kompajlera i pogledaj datasheet mikrokontrolera za vise detalja.
[ Milan_95 @ 31.05.2014. 14:59 ] @
Ipak je sve bilo ok samo se zaturilo jedno lcd_clrscr koje je cistilo display a nije trebalo pa sam ja pomislio da nakon rutine uC tu zavrsi svoj program , ipak hvala , znam da ovi prekidi trebaju da budu mnogo mnogo kraci ali u ovom slucaju pozivom tog prekida trebam da blokiram bukvalno sve delove uredjaja i nije mi bitno vreme koje je potrebno da se sve to izvrsi i vrati u gl. program ..
[ Milan_95 @ 12.06.2014. 22:37 ] @
Zahvalio bih se svima koji su mi pomogli na bilo koji nacim , motalica je zavrsena , sve radi kako je zamisljeno , danas sam se malo igrao i isprobavao sasvim lepo slaze tanku zicu tipa 0,1mm ... ako se neko odluci da pravi nesto slicno tu sam da pomognem ...