Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Programiranje atmega8

[es] :: Elektronika :: Mikrokontroleri :: Programiranje atmega8

Strane: 1 2

[ Pregleda: 7356 | Odgovora: 28 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Milan_95
Milan Bozic

Član broj: 266941
Poruke: 91
*.mediaworksit.net.



+1 Profil

icon Programiranje atmega818.04.2014. u 17:57 - pre 121 meseci
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 ...


"Bitno je stalno postavljati pitanja "
 
Odgovor na temu

zica49
Ivica Antolović E74ZI
44°50′N 18°03′E

Član broj: 3011
Poruke: 4673
*.team.ba.

ICQ: -27


+1146 Profil

icon Re: Programiranje atmega818.04.2014. u 18:11 - pre 121 meseci
Kako ti mozemo pomoci ne vidim pitanje?
Ja sam iz BiH sporo "kontam"pa molim za razumijevanje!
 
Odgovor na temu

Milan_95
Milan Bozic

Član broj: 266941
Poruke: 91
*.mediaworksit.net.



+1 Profil

icon Re: Programiranje atmega818.04.2014. u 18:31 - pre 121 meseci
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]
"Bitno je stalno postavljati pitanja "
 
Odgovor na temu

ColdKeyboard
Sasa Karanovic
Hardware and Firmware Engineer
Toronto, Canada

Član broj: 31924
Poruke: 868
*.teol.net.

Jabber: ColdKeyboard
Sajt: www.SasaKaranovic.com


+11 Profil

icon Re: Programiranje atmega818.04.2014. u 23:32 - pre 121 meseci
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).
 
Odgovor na temu

Milan_95
Milan Bozic

Član broj: 266941
Poruke: 91
*.mediaworksit.net.



+1 Profil

icon Re: Programiranje atmega819.04.2014. u 10:12 - pre 121 meseci
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]
"Bitno je stalno postavljati pitanja "
Prikačeni fajlovi
 
Odgovor na temu

HeYoo

Član broj: 72595
Poruke: 491



+1017 Profil

icon Re: Programiranje atmega819.04.2014. u 11:33 - pre 121 meseci
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
 
Odgovor na temu

Milan_95
Milan Bozic

Član broj: 266941
Poruke: 91
*.mediaworksit.net.



+1 Profil

icon Re: Programiranje atmega819.04.2014. u 17:19 - pre 121 meseci
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 ?
"Bitno je stalno postavljati pitanja "
 
Odgovor na temu

HeYoo

Član broj: 72595
Poruke: 491



+1017 Profil

icon Re: Programiranje atmega819.04.2014. u 21:16 - pre 121 meseci
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.
 
Odgovor na temu

Milan_95
Milan Bozic

Član broj: 266941
Poruke: 91
*.mediaworksit.net.



+1 Profil

icon Re: Programiranje atmega819.04.2014. u 21:26 - pre 121 meseci
aaa znam u asembleru da nije moralo da se stopira pa sam pomislio da je isti princip
"Bitno je stalno postavljati pitanja "
 
Odgovor na temu

Milan_95
Milan Bozic

Član broj: 266941
Poruke: 91
*.mediaworksit.net.



+1 Profil

icon Re: Programiranje atmega823.04.2014. u 13:23 - pre 120 meseci
Program je pri kraju ali nisam siguran kako u C-u da napisem : Cekaj ovde dok na portb6 ne dodje +5V ?
"Bitno je stalno postavljati pitanja "
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Programiranje atmega823.04.2014. u 13:30 - pre 120 meseci
Code:

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


 
Odgovor na temu

Milan_95
Milan Bozic

Član broj: 266941
Poruke: 91
*.mediaworksit.net.



+1 Profil

icon Re: Programiranje atmega823.04.2014. u 16:22 - pre 120 meseci
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
"Bitno je stalno postavljati pitanja "
 
Odgovor na temu

HeYoo

Član broj: 72595
Poruke: 491



+1017 Profil

icon Re: Programiranje atmega823.04.2014. u 16:53 - pre 120 meseci
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
 
Odgovor na temu

Milan_95
Milan Bozic

Član broj: 266941
Poruke: 91
*.mediaworksit.net.



+1 Profil

icon Re: Programiranje atmega823.04.2014. u 17:00 - pre 120 meseci
Nisam bas neki expert za engleski al mogu da razumem :)
Jel delay blokira i pwm ?
"Bitno je stalno postavljati pitanja "
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: Programiranje atmega823.04.2014. u 17:05 - pre 120 meseci
ako koristis hardwerski modul za pwm onda ga ne blokira
 
Odgovor na temu

HeYoo

Član broj: 72595
Poruke: 491



+1017 Profil

icon Re: Programiranje atmega823.04.2014. u 17:06 - pre 120 meseci
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]
 
Odgovor na temu

Milan_95
Milan Bozic

Član broj: 266941
Poruke: 91
*.mediaworksit.net.



+1 Profil

icon Re: Programiranje atmega823.04.2014. u 17:19 - pre 120 meseci
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 ...
"Bitno je stalno postavljati pitanja "
 
Odgovor na temu

Milan_95
Milan Bozic

Član broj: 266941
Poruke: 91
*.mediaworksit.net.



+1 Profil

icon Re: Programiranje atmega812.05.2014. u 08:06 - pre 120 meseci
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]
"Bitno je stalno postavljati pitanja "
Prikačeni fajlovi
 
Odgovor na temu

Milan_95
Milan Bozic

Član broj: 266941
Poruke: 91
*.mediaworksit.net.



+1 Profil

icon Re: Programiranje atmega814.05.2014. u 17:30 - pre 120 meseci
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?
"Bitno je stalno postavljati pitanja "
 
Odgovor na temu

Milan_95
Milan Bozic

Član broj: 266941
Poruke: 91
*.mediaworksit.net.



+1 Profil

icon Re: Programiranje atmega815.05.2014. u 10:03 - pre 120 meseci
monolog -.-
"Bitno je stalno postavljati pitanja "
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: Programiranje atmega8

Strane: 1 2

[ Pregleda: 7356 | Odgovora: 28 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.