/*MCU - ATTiny2313 @ 1000000Hz Internal Freq.*/

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

//motor 1  H/bridge labak: PB0 elore, PB1 hatra;
//motor 2  H/bridge labak: PB5 JOBBRA, PB6 BALRA;
//
//input: PD0,PD1,PD4
//
//pwm out: PB3(OC1A);
//
//sw1 (s1): PD2
//
// sw2 (s2): PD3;

unsigned char sw1,sw2;

void delayms(uint16_t millis) {
  while ( millis ) {
    _delay_ms(1);
    millis--;
  }
}

SIGNAL (SIG_INT0)
{
        //PWM sebesseg allito kapcsolok ellenorzese
    sw1 = (PIND & 0b00000100);
    sw2 = (PIND & 0b00001000);

      if (sw1==0) _duty =_duty-10;   //pwm sebesseg csokkentese mindket motornak;
      if (sw2==0) _duty =_duty+10; //pwm sebesseg novelese mindket motornak;


    _duty = (_duty*255)/100;         //motor sebesseg konvertalasa 0-100%-rol 0-255-re
     OCR1A = _duty;
     GIMSK  |= (0<<INT0);
}

SIGNAL (SIG_INT1)
{
        //PWM sebesseg allito kapcsolok ellenorzese
    sw1 = (PIND & 0b00000100);
    sw2 = (PIND & 0b00001000);

      if (sw1==0) _duty =_duty-10;   //pwm sebesseg csokkentese mindket motornak;
      if (sw2==0) _duty =_duty+10; //pwm sebesseg novelese mindket motornak;


    _duty = (_duty*255)/100;         //motor sebesseg konvertalasa 0-100%-rol 0-255-re
     OCR1A = _duty;
    GIMSK  |= (0<<INT1);
}


int main(void){

  unsigned char sensor;
  unsigned int _duty=127;

  //-------------------------- I/O init----------------------------------------//
  DDRB = 0b11111111;   //PORTB  output;
  DDRD = 0x00;   //PORTD input port
  PORTD = 0b00001100;  //belso felhuzo ellenallasok aktivalasa a kapcsolokhoz.

  TCCR1A = 0b10100001; // 8 bites fazishelyes PWM (WGM10) || sima nem invertalt PWM (COM1A1,COM1B1);
  TCCR1B = 0b00000010; //cs11 BIT on: FCPU /8;


  // Pin 6 (PD2) es Pin 7 (PD3) erzekeles bekapcs.
  PCMSK |= (1<<PIND2) | (1<<PIND3);

  // interrupt on INT0 pin falling edge
  MCUCR = 0b00001010 //int0,int1 lefuto el eseten letrehoz egy megszakitas kerelmet

  // turn on interrupts!
  GIMSK  |= (1<<INT0) | (1<<INT1);

  while(1) {

    OCR1A = _duty;

     if((GICR & (1<<INT0)) == 0)
            {
  // varakozas nehany szaz ms-ig, amig a nyomogomb befejezi a pergest
            _delay_ms(250);

            // turn on interrupts!
            GIMSK  |= (1<<INT0) | (1<<INT1);
            }

    sensor = (PIND & 0b00010011); // szenzor ellenorzes

    switch(sensor)
		{
			case 0b00000000:PORTB |= (1<<0);  //000 , elore, PB0
				  break;

			case 0b00000001:PORTB |= (1<<5);  //001, jobbra, PB5
				  break;

			case 0b00000010:PORTB |= (1<<0);		//010 , elore, PB0
				  break;

			case 0b00000011:PORTB |= (1<<5);		//011, jobbra, PB5
				  break;

			case 0b00010000:PORTB |= (1<<6);		//100, balra, PB6
				  break;

			case 0b00010001:PORTB |= (1<<0);		//101	, elore, PB0
                                  break;

			case 0b00010010:PORTB |= (1<<6);		//110	, balra, PB6
				  break;

			case 0b00010011:PORTB |= (0<<0);  PORTB |= (0<<1);PORTB |= (0<<5);  PORTB |= (0<<6);	//111 stop
		                  break;

			default:PORTB |= (1<<0);  //elore, PB0
                                break;
		}
    }
  }




