/* 
Projekt: Diplomová práce 
Autor: Bc. Lukas Konecny
Datum: 24.3.2009
Servo: HS 422
MCU: Atmega128
*/

/* vlozeni hlavyckovych souboru */
#include "main.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>  
#include <stdlib.h> 
#include <util/delay.h> 
#include "texts.h"
#include "lcd_lib.h"


/* definice */

#define NSTEP 10         //definice kroku
#define NDELAY 30000     //deifinice max. zpozdeni (30s)
int isdelay = 0;         //definice min. zpozdeni


/* cekaci funkce */

void delay_ms(unsigned int val)
{
    unsigned int i;
    for (i = 0; i < val; i++)
        _delay_loop_2(3686);
}

/* hlavni telo programu */

int main(void)
{
	LCD_Init();
    LCD_WriteCString("VUT BRNO");

//DDRE=0x0F;
//PORTE=0x0F;
int uroven=0; //promenna pouzita pro rolovani menu po LCD pocatecni nastaveni na 0
 int suburoven=0; //promenna pouzita pro podurovne

for(;;){  /* nekonecna smycka hlida zmenu stavu tlacitek 2 a 8 */
	LCD_Clear();
	LCD_Position(1, 0);     
	PORTE =0b00001101;  /* nastaveni 2 sloupce */
if (bit_is_clear(PINE, 4)) {uroven-1; if (uroven==1){uroven==6;}} /* podminka stisku 2 UP */
if (bit_is_clear(PINE, 6)) {uroven+1;if (uroven==6){uroven==1;}} /* podminka stisku 8 DOWN */
/* obsluha vypisu na LCD */
if (uroven==1){LCD_WriteCString("manual");}  //samozrejme s oznamenim na LCD prislusnym textem 
if (uroven==2){LCD_WriteCString("automatic_polohove");} //nastavovani polohy (serva nastavena v centralni pozici)
if (uroven==3){LCD_WriteCString("automatic_perimetr");} 
if (uroven==4){LCD_WriteCString("automatic_kontinualni1D");} 
if (uroven==5){LCD_WriteCString("automatic_kontinualni2D");} 
if (uroven==6){LCD_WriteCString("automatic_trasovani");}
/* potvrzeni vyberu pomoci ENTER  vyvolani fce podle hodnoty promenne uroven */
PORTE =0b00000111; /* nastaveni 4 sloupce */
if (bit_is_clear(PINE, 7)) { /* podminka stisku ENTER */
//if (uroven==1){manual();}  //samozrejme s oznamenim na LCD prislusnym textem 
//if (uroven==2){automatic_polohove(1500,1500,1500,1500);} //nastavovani polohy (serva nastavena v centralni pozici)
//if (uroven==3){automatic_perimetr(1500,1500);} 
//if (uroven==4){automatic_kontinualni1D();} 
//if (uroven==5){automatic_kontinualni2D();} 
//if (uroven==6){automatic_trasovani();}

//beep(200, 10);
}
}
}
/* Pouzivane funkce pro ovladani pohybu */

int PWM(void)
{
  //DDRB = 0x61; //povoleni portu PB5 a PB6 jako vystup PWM (OC1A a OC1B)
  //DDRD = 0;    //Porty D jako vstupy (interupty nastavene pro tlacitka 1-4)
  //PORTD = 0xff;


//######################PWM PRO SERVO 1 OC1A################################

//Pouzita preddelicka 8 (prescaler)
ICR1=40000; //nastavenim ICR1=40000 dosahnu f=50Hz f=fxtal/N*TOP  N=8 ICR1=TOP

TCCR1A|=(0<<COM1A0)|(1<<COM1A1)|(0<<COM1B0)|(1<<COM1B1)|(1<<WGM11)|(0<<WGM10); // fazove korigovana PWM (0<<WGM11)|(1<<WGM10)

//######################PWM PRO SERVO 2 OC1B################################

//Pouzita preddelicka 8 (prescaler)
ICR1=40000; //nastavenim ICR1=40000 dosahnu f=50Hz f=fxtal/N*TOP  N=8 ICR1=TOP

TCCR1B|=(0<<ICNC1)|(0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(0<<CS12)|(1<<CS11)|(0<<CS10);
}
//#####################################################################
//############### Rezimy manualniho ovládání PWM ######################
//#####################################################################
/*
void manual(void)
{
int temp=OCR1A;
 if ((temp+NSTEP)<2000)
	OCR1A+=NSTEP;
 else
	OCR1A=2000;

int temp=OCR1A;
 if ((temp+NSTEP)<1000)
	OCR1A+=NSTEP;
 else
	OCR1A=1000;
}
*/
//#####################################################################
//############### Rezimy automatického ovládání PWM ###################
//#####################################################################
/*
void automatic_polohove (int poloha1L, int poloha2L, int poloha1H, int poloha2H)
{
/* udelat prepocet na stupne napr OCR1A=2000 odpovida 180° a podobne: 
1000 je 0°  
1500 je 90°  
2000 je 180°
po 1° to je NSTEP=17 (vyslo 16,66666)

nastavovani ve ° °natoceni serva 
*/
/*
//prepocet
ICR1 = 20000;
PORTE =0b00001110;
char autostep=1;
char prepocetH;
char prepocetL;

while (1)
{
//prepocet uhlu na ciselnou hodnotu OCR1A
prepocetH=1000+(poloha1H*5,5);
prepocetL=1000+(poloha1L*5,5);
//nastaveni
if (OCR1A>=prepocetH) autostep=-1;
 if (OCR1A=prepocetL) autostep=1;
 OCR1A=OCR1A+autostep;
  if (bit_is_clear(PINE, PE4)) break;
}

//nastaveni PWM
//OCR1A=poloha1;
//OCR1B=poloha2;
}
*/
/*
//#####################################################################
void automatic_perimetr (void)
{

ICR1 = 20000;
PORTE =0b00001110;
char autostep=1;
char prepocetH;
char prepocetL;

while (1)
{
//prepocet uhlu na ciselnou hodnotu OCR1A
prepocetH=1000+(poloha1H*5,5); //uhel maximum
prepocetL=1000+(poloha1L*5,5); //uhel minimum
//nastaveni
if (OCR1A>=prepocetH) autostep=-1;
 if (OCR1A=prepocetL) autostep=1;
 OCR1A=OCR1A+autostep;
  if (bit_is_clear(PINE, PE4)) break;
}

//#####################################################################
void Pohyb_servoA (int perimetrL, int perimetrH)
{
ICR1 = 20000;
PORTE =0b00001110;
char autostep=1;
while (1)
{
if (OCR1A>=perimetrH) autostep=-1;
 if (OCR1A=perimetrL) autostep=1;
 OCR1A=OCR1A+autostep;
  if (bit_is_clear(PINE, PE4)) break;
}*/
/*
for(OCR1A=1000;OCR1A!=2000;OCR1A++)
    {
    delay_ms(1);
	if (OCR1A=2000) 
	for(OCR1A=2000;OCR1A!=1000;OCR1A--)
    {
    delay_ms(1);
    };
    }
	*/
	/*
}

//#####################################################################
void Pohyb_servoB (int perimetrxL, int perimetrxH,int perimetryL, int perimetryH)
{
ICR1 = 20000;
PORTE =0b00001110;
char autostep=1;
while (1)
{
if (OCR1A>=perimetxH) autostep=-1;
 if (OCR1A=perimetxL) autostep=1;
 OCR1A=OCR1A+autostep;
if (OCR1B>=perimetryH) autostep=-1;
 if (OCR1B=perimetryL) autostep=1;
 OCR1B=OCR1B+autostep;
  if (bit_is_clear(PINE, PE4)) break;
}}
//#####################################################################
void automatic_kontinualni2D (void)
{
ICR1 = 20000;
OCR1A = 1500;
OCR1B = 1500;
for(OCR1A=1000;OCR1A!=2000;OCR1A++)
	{
    delay_ms(1);
    }
for(OCR1B=1000;OCR1B!=2000;OCR1B++)
    {
    delay_ms(1);
    }
}
//#####################################################################
void automatic_trasovani (void)
{
}

*/

/* Pouzivane funkce pro ovladani snimani */
