//************************************************************************************
//**  
//**  File name:     F:\Program Files\PIC-ohjelmointi\Flowcode AVR\Ohjelmia\Oma servomikseri\Servomixer version 1 by OH7HJ.c
//**  Generated by:  Flowcode v3.3.5.45
//**  Date:          Thursday, January 15, 2009 16:35:46
//**  Licence:       Demo
//**  
//**        ***DEMO VERSION***
//**  
//**  
//**     NOT FOR COMMERCIAL USE
//**  
//**  http://www.matrixmultimedia.com
//************************************************************************************


#define MX_AVR

//Määrittää mikro-ohjaimen
#define MX_AVR
#define MX_EE
#define MX_EE_SIZE 1024
#define MX_SPI
#define MX_SPI_B
#define MX_SPI_SDI 6
#define MX_SPI_SDO 5
#define MX_SPI_SCK 7
#define MX_UART
#define MX_UART_D
#define MX_UART_TX 1
#define MX_UART_RX 0
#define MX_MI2C
#define MX_I2C_C
#define MX_I2C_SDA 1
#define MX_I2C_SCL 0
#define MX_PWM
#define MX_PWM_PORT PORTD
#define MX_PWM_CNT 2
#define MX_PWM_TRIS1 DDRD
#define MX_PWM_1 5
#define MX_PWM_TRIS2 DDRD
#define MX_PWM_2 4

//funktiot
#define F_CPU 20000000UL
#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\eeprom.h>
#include <MX_util\delay.h>
#include <MX_util\bit_cmds.h>

//Configuration data
#pragma DATA 0x0, 0xdf
#pragma DATA 0x1, 0xff

//Internal functions
#include "F:\Program Files\PIC-ohjelmointi\Flowcode AVR\FCD\internals.h"

//Makro-funktion kuvaukset


//Muuttujakuvaukset
volatile short FCV_P1;
volatile short FCV_P2;
volatile short FCV_OUT1;
volatile short FCV_OUT2;
volatile short FCV_L1;
volatile short FCV_L2;
volatile char FCV_IN1;
volatile char FCV_IN2;
volatile short FCV_MIN;



//Supplementary defines


//Makro-toteutukset

//Supplementary implementations


int main()
{
	
	//alustus
	MCUCSR=0x00;
	WDTCR=0x10;


	//Keskeytyksen alustuskoodi
	
	//Minimipulssin asetus - Set shortest allowed pulse
	//Laskutoimitus:
	//  Min = 2
	FCV_MIN =  2 ;
	

	//Sisäänmenojen nollaus - Reset inputs
	//Laskutoimitus:
	//  In1 = 0
	//  In2 = 0
	FCV_IN1 =  0 ;
	FCV_IN2 =  0 ;
	

	//Ulostulojen nollaus - Reset outputs
	//Laskutoimitus:
	//  Out1 = 0
	//  Out2 = 0
	FCV_OUT1 =  0 ;
	FCV_OUT2 =  0 ;
	

	//Pulssilaskurien nollaus - Reset pulse counters
	//Laskutoimitus:
	//  P1 = 0
	//  P2 = 0
	FCV_P1 =  0 ;
	FCV_P2 =  0 ;
	

	//Pulssinpituuksien nollaus - Reset pulse lengths
	//Laskutoimitus:
	//  L1 = 0
	//  L2 = 0
	FCV_L1 =  0 ;
	FCV_L2 =  0 ;
	

	//*** Testipulssien pituudet ***
	//Laskutoimitus:
	//  P1 = 6
	//  P2 = 5
	FCV_P1 =  6 ;
	FCV_P2 =  5 ;
	

	//*** Testipulssit talteen ***
	//Laskutoimitus:
	//  L1 = P1
	//  L2 = P2
	FCV_L1 =  FCV_P1 ;
	FCV_L2 =  FCV_P2 ;
	

	//Silmukka - Loop
	//Silmukka: While 1
	while( 1 )
	{
		//*** Silmukkajakso 1 alkaa ***
		//Lähtö: 1 -> B0
		DDRB = DDRB | 0x01;
		if (1)
			PORTB = (PORTB & 0xfe) | 0x01;
		else
			PORTB = PORTB & 0xfe;


		//Luetaan tulopulssi - Read input pulse
		//Tulo: B1 -> In1
		DDRB = DDRB & 0xfd;
		FCV_IN1 = ((PINB & 0x02) == 0x02);


		//Pulssi tulossa? - Input pulse coming? 
		//Päätös: In1 = 1?
		if( FCV_IN1 == 1 )
		{
			//Pulssilaskurin lisäys - Pulse counter increment
			//Laskutoimitus:
			//  P1 = P1 + 1
			FCV_P1 =  FCV_P1 + 1 ;
			

		} else {
			//Liian lyhyt pulssi? - Too short pulse? 
			//Päätös: P1 < Min?
			if( FCV_P1 < FCV_MIN )
			{
			} else {
				//Lasketaan miksattu ulostulopulssi - Calculate mixed output
				//Laskutoimitus:
				//  L1 = P1
				//  Out1 = L1 + L1 - L2
				FCV_L1 =  FCV_P1 ;
				FCV_OUT1 =  FCV_L1 + FCV_L1 - FCV_L2 ;
				

			}


			//Pulssilaskurin nollaus - Pulse counter reset
			//Laskutoimitus:
			//  P1 = 0
			FCV_P1 =  0 ;
			

		}


		//Miksattu pulssi ulos? - Mixed pulse out?
		//Päätös: Out1 > 0?
		if( FCV_OUT1 > 0 )
		{
			//Pulssin ulostulo ylös - Pulse output up
			//Lähtö: 1 -> B4
			DDRB = DDRB | 0x10;
			if (1)
				PORTB = (PORTB & 0xef) | 0x10;
			else
				PORTB = PORTB & 0xef;


			//Ulostulopulssin vähennys - Outcount decrease
			//Laskutoimitus:
			//  Out1 = Out1 - 1
			FCV_OUT1 =  FCV_OUT1 - 1 ;
			

		} else {
			//Pulssin ulostulo alas - Pulse output down
			//Lähtö: 0 -> B4
			DDRB = DDRB | 0x10;
			if (0)
				PORTB = (PORTB & 0xef) | 0x10;
			else
				PORTB = PORTB & 0xef;


		}


		//*** Silmukkajakso 1 päättyy ***
		//Lähtö: 0 -> B0
		DDRB = DDRB | 0x01;
		if (0)
			PORTB = (PORTB & 0xfe) | 0x01;
		else
			PORTB = PORTB & 0xfe;


		//Luetaan tulopulssi - Read input pulse
		//Tulo: B2 -> In2
		DDRB = DDRB & 0xfb;
		FCV_IN2 = ((PINB & 0x04) == 0x04);


		//Pulssi tulossa? - Input pulse coming? 
		//Päätös: In2 = 1?
		if( FCV_IN2 == 1 )
		{
			//Pulssilaskurin lisäys - Pulse counter increment
			//Laskutoimitus:
			//  P2 = P2 + 1
			FCV_P2 =  FCV_P2 + 1 ;
			

		} else {
			//Liian lyhyt pulssi? - Too short pulse? 
			//Päätös: P2 < Min?
			if( FCV_P2 < FCV_MIN )
			{
			} else {
				//Lasketaan miksattu ulostulopulssi - Calculate mixed output
				//Laskutoimitus:
				//  L2 = P2
				//  Out2 = L2 + L2 - L1
				FCV_L2 =  FCV_P2 ;
				FCV_OUT2 =  FCV_L2 + FCV_L2 - FCV_L1 ;
				

			}


			//Pulssilaskurin nollaus - Pulse counter reset
			//Laskutoimitus:
			//  P2 = 0
			FCV_P2 =  0 ;
			

		}


		//Miksattu pulssi ulos? - Mixed pulse out?
		//Päätös: Out2 > 0?
		if( FCV_OUT2 > 0 )
		{
			//Pulssin ulostulo ylös - Pulse output up
			//Lähtö: 1 -> B3
			DDRB = DDRB | 0x08;
			if (1)
				PORTB = (PORTB & 0xf7) | 0x08;
			else
				PORTB = PORTB & 0xf7;


			//Ulostulopulssin vähennys - Outcount decrease
			//Laskutoimitus:
			//  Out2 = Out2 - 1
			FCV_OUT2 =  FCV_OUT2 - 1 ;
			

		} else {
			//Pulssin ulostulo alas - Pulse output down
			//Lähtö: 0 -> B3
			DDRB = DDRB | 0x08;
			if (0)
				PORTB = (PORTB & 0xf7) | 0x08;
			else
				PORTB = PORTB & 0xf7;


		}


	}


	mainendloop: goto mainendloop;
}



