/********************************************************************
 *  Launchpad demóprogram: p1_3_change_state
 *
 * A programban az S2 nyomógombbal keltett megszakításokkal a futó 
 * program állapotát minden gombnyomásnál léptetjük. A futó program 
 * és az interrupt kiszolgáló eljárás közötti kommunikációhoz egy 
 * 8 állapotú jelzőt használunk. A főprogram minden ciklusban a jelző
 * által meghatározott ágon fut.
 *
 * MCLK és SMCLK órajele az alapértelmezett 1 MHz-es DCO frekvencia,
 * ACLK-val nem foglalkozunk. 
 * 
 * Hardver követelmények:
 *  - Launchpad MSP430G22x1 mikrovezérlővel
 *  - Vegyük le a TxD és RxD átkötéseket!
 *  - Feltételezzük, hogy a 32 kHz-es kvarc nincs beforrasztva! 
 *    Ha mégis be lenne forrasztva, akkor a P2 portra vonatkozó 
 *    beállításokat hagyjuk ki a programból!
 *
 *                MSP430G22x1
 *             -----------------
 *         /|\|              XIN|-
 *          | |                 |
 *          --|RST          XOUT|-
 *            |                 |
 *     LED1<--|P1.0         P1.3|<- S2 gomb
 *            |                 |
 *     LED2<--|P1.6             |
 *
 * 
 *  I. Cserny
 *  MTA ATOMKI, Debrecen
 *  Oct 2011
 *  IAR Embedded Workbench for MSP430 v5.30.1 Kickstart Edition
 ***************************************************************/

#include  "io430.h"

//--- Az interrupt szinten módosított változó 'volatile' legyen! 
volatile int jelzo = 0;      // Jelző a főprogram irányításához

void main(void) {
  WDTCTL = WDTPW + WDTHOLD;  //Letiltjuk a watchdog időzítőt
//--- P1 PORT beállítása --------------------------------------------  
  P1DIR |= BIT0+BIT6;        //P1.0 és P1.6 legyen digitális kimenet
  P1DIR &= ~BIT3;            //P1.3 legyen digitális bemenet
//--- Az alábbi két utasítással bekapcsoljuk P1.3 belső felhúzását  
  P1OUT |= BIT3;             //Felfelé húzzuk, nem lefelé  
  P1REN |= BIT3;             //Belső felhúzás engedélyezése  
//-------------------------------------------------------------------
// P1.3 bemenet beállítása: interrupt minden lefutó él beérkezésekor
//-------------------------------------------------------------------  
  P1IES |= BIT3;             // P1.3 lefutó élre érzékeny
  P1IFG &= ~BIT3;            // P1.3 IFG törlése
  P1IE  |= BIT3;             // P1.3 interrupt engedélyezése
//--- Programmegszakítás engedélyezése és a fő programhurok ---------  
  __enable_interrupt();      // A programmegszakítás engedélyezése
  while(1) {
    switch(jelzo) { 
    case 0: 
      P1OUT &= ~BIT6;        // Kimenetek törlése
      P1OUT ^= BIT0;         // LED1 átkapcsolása
    __delay_cycles(1000000); // Kb. 1000 ms várakozás
    break;
    case 1: 
      P1OUT &= ~BIT6;        // Kimenetek törlése
      P1OUT ^= BIT0;         // LED1 átkapcsolása
      __delay_cycles(500000);// Kb. 500 ms várakozás
    break;
    case 2: 
      P1OUT &= ~BIT6;        // Kimenetek törlése
      P1OUT ^= BIT0;         // LED1 átkapcsolása
      __delay_cycles(250000);// Kb. 250 ms várakozás
    break;
    case 3: 
      P1OUT &= ~BIT6;        // Kimenetek törlése
      P1OUT ^= BIT0;         // LED1 átkapcsolása
      __delay_cycles(125000);// Kb. 125 ms várakozás
    break;
    case 4: 
      P1OUT &= ~BIT0;        // Kimenetek törlése
      P1OUT ^= BIT6;         // LED1 átkapcsolása
    __delay_cycles(1000000); // Kb. 1000 ms várakozás
    break;
    case 5: 
      P1OUT &= ~BIT0;        // Kimenetek törlése
      P1OUT ^= BIT6;         // LED1 átkapcsolása
      __delay_cycles(500000);// Kb. 500 ms várakozás
    break;
    case 6: 
      P1OUT &= ~BIT0;        // Kimenetek törlése
      P1OUT ^= BIT6;         // LED1 átkapcsolása
      __delay_cycles(250000);// Kb. 250 ms várakozás
    break;
    case 7: 
      P1OUT &= ~BIT0;        // Kimenetek törlése
      P1OUT ^= BIT6;         // LED1 átkapcsolása
      __delay_cycles(125000);// Kb. 1000 ms várakozás
    break; 
    }    
  }
}

//--- Port 1 programmegszakítás kiszolgálása ------------------------
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
  jelzo++;                   // következő állapotba vált
  jelzo &= 0x07;             // jelzo nem lehet 7-nél nagyobb!  
  P1IFG &= ~BIT3;            // P1.3 interrupt jelzőbit törlése
}

