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 "