changheepark-dev / Digital-System-Lab

Atmega128
0 stars 0 forks source link

11-20-2023 #7

Open changheepark-dev opened 10 months ago

changheepark-dev commented 10 months ago

타이머 1 하기 전

/*
 * 프로그램 이름 : 11주차 과제
 * 프로그램 내용 : LCD 스위치 버저 LED 인터럽트 타이머 UART 통신
 * Created: 2023-11-13 오후 6:17:00
 * Author : 1922288 박창희
 * 마지막 수정일 : 2023-11-18 오후 10:38:00
 * 마지막 수정내용 : 키보드 3입력
 */ 

//15   14 13 11 7

#define F_CPU 16000000UL        // 16MHz의 오실레이터를 사용
#include <avr/io.h>             //입출력 포트 사용을 위한 헤더 include
#include <avr/delay.h>          //딜레이 사용을 위한 헤더 inlcude
#include <avr/interrupt.h>      //인터럽트 사용을 위한 헤더 include
#include "lcd.h"                //LCD 사용을 위한 헤더 include -> " "외부의 파일을 include

/* 타이머 */
volatile int count_m = 1000, dis = 0;   //오버플로우가 발생한 횟수

void TIMER0_Init()
{
    TCCR0 |= 0b111 << CS00; // 분주비 1024 (16M /1024 -> 16KH)
    TIMSK |= 1<<TOIE0;  // 오버플로 인터럽트 사용 256pulse / 16k ->1/64초

    sei();  //전역인터럽트 활성화
}

int Watch = 0;
ISR(TIMER1_COMPA_vect) {
    Watch++;

    if (Watch > 86400) {
        Watch = 0;
    }
}
void TIMER1_Init()
{
    TCCR1A = (0<<WGM11) | (1<<WGM10); 
    TCCR1B = (0<<WGM13) | (0<<WGM12) | (1<<CS12) | (0<<CS11) | (1<<CS10);
    TIMSK |= (1 << OCIE1A);

    OCR1A = 0xffff;

    sei();                              //전역인터럽트 활성화
}
/* 타이머 끝 */

/*AD 변환*/
int readAnalog(unsigned char ch, char x, char y)        // AD 채널 값을 받아서 AD를 값을 읽어오는 함수.
{
    unsigned char Buff[8] = " 0";

    ADCSRA = 1<<ADEN | 0b111<<ADPS0;    // 128 분주율로 AD를 사용 인에이블 설정
    ADMUX = 0b01<<REFS0 | ch<<MUX0;     // AREF를 기준전압으로 사용, AREF와 GND사이에 콘덴서 접속
    ADCSRA |= 1<<ADSC;                  // A/D 변환 시작

    Buff[0] = '0'+((ADC %10000)/1000);
    Buff[1] = '0'+((ADC %1000)/100);
    Buff[2] = '0'+((ADC %100)/10);
    Buff[3] = '0'+(ADC %10);

    for (unsigned char i=0; i<=2; i++)
    {
        if (Buff[i] != '0')
        {
            break;
        }
        Buff[i]=' ';
    }
    Buff[4]= '\0';

    LCDMove(y, x);
    LCDPuts(Buff);
}

/*숫자 변환*/
int LCD_nNum1(unsigned int NUM)
{
    unsigned char Buff[8] = "0";
    Buff[0] = '0'+((NUM %1000000)/100000);
    Buff[1] = '0'+((NUM %100000)/10000);
    Buff[2] = '0'+((NUM %10000)/1000);
    Buff[3] = '0'+((NUM %1000)/100);
    Buff[4] = '0'+((NUM %100)/10);
    Buff[5] = '.';
    Buff[6] = '0'+(NUM %10);
    Buff[7] = 's';

    LCDPuts(Buff);
}

int LCD_nNum3(unsigned int NUM)
{
    unsigned char Buff[8] = "0";
    Buff[0] = '0'+((NUM %100)/10);
    Buff[1] = '0'+(NUM %10);

    LCDPuts(Buff);
}
/*숫자 변환 끝*/

char display = 16;
int main(void)
{
    static char string1[]="- 2 team : DEA -";
    static char string2[]="Start with 1 - 4";

    static char string3[]="Resistance";
    static char string4[]="Watch";
    static char string5[]="Stopwatch";
    static char string6[]="Timer";

    DDRB |= 0xf0;               //7~4 LED 3~0 스위치가 연결되어 있다. 상위 니블 7~4까지는 출력을로 설정 하위 니블 3~0 입력으로 설정
    DDRG |= (1<<PG3);           //PG3번에 buzzer 연결되어있음
    UDR0 |= 0x00;

    MCU_Init();                 //LCD 사용을 위한 MCU 설정 
    LCDInit();                  //LCD 사용을 위한 초기화 설정

    TIMER1_Init();

    while (PINB == 15) {
        LCDMove(0,0);           //표시할 문자의 위치를 선택->HOME 위치
        LCDPuts(string1);
        LCDMove(1,0);           //LCD의 두번쨰 줄
        LCDPuts(string2);
    }
    LCDInit();

    while (1) { 
        if ((PINB & 15) != 15) {
            display = (PINB & 15);
            PORTB = ~(display << 4);
            LCDInit();
        }

        LCDMove(0,0);
        if(display == 14) {         
            LCDPuts(string3);

            readAnalog(6, 0, 1);
        }

        else if(display == 13) {
            LCDPuts(string4);

            LCDMove(1,0);
            LCD_nNum1(Watch);
        }

        else if(display == 11) {
            LCDPuts(string5);

            LCDMove(1,0);
            LCD_nNum1(TCNT1);
        }

        else if(display == 7) {
            LCDPuts(string6);

        }
        else {

        }

    }
}
    /*
                unsigned char Buff[8] = "0";
                Buff[0] = '0'+(((PINB&15) %10000)/1000);
                Buff[1] = '0'+(((PINB&15) %1000)/100);
                Buff[2] = '0'+(((PINB&15) %100)/10);
                Buff[3] = '0'+((PINB&15) %10);

                LCDPuts(Buff);

        if(0 == (PINB & (1<<PB0)) || (UDR0 != 0x00)) {
            UDR0 |= 0x00;
            srand(TCNT1);
            value1 = rand() % 103;
            for (unsigned int i=3; i>0; i--) {  
                LCDMove(1,0);   //LCD의 두번쨰 줄
                string3[6] = '0' + i;
                LCDPuts(string3);

                _delay_ms(1000);
            }
            LCDInit();

            count_m = 1000;
            TIMER1_Init();

            break;
        }
    }

    static char passwd[]="passwd:";
    static char trial[]="trial:";
    static char down[]="down";
    static char up[]="up  ";
    static char hit[]="hit ";
    int analog = 0;
    dis = 1;
    trial_n = 15;
    while (1) 
    {       
        //receivedData = UART_receive();

        analog = readAnalog(6); //가변저항 ADC 6,7번에 연결
        LCDMove(0,0);
        LCDPuts(passwd);
        LCDMove(0,7);   //home 위치
        LCD_nNum2(analog);

        LCDMove(1,0);
        LCDPuts(trial);
        LCD_nNum3(trial_n);

        PORTB = trial_n << 4;
        if (trial_n == 0) {
            TIMER1_Initx();
            PORTG |= (1<<PG3);  //buzzer ON
            if(0 == (PINB & (1<<PB0)) || (UDR0 != 0x00)) {
                UDR0 |= 0x00;
                PORTG &= ~(1<<PG3); //buzzer OFF
                goto restart;
            }
        }

        // 인터럽트 처리
        if (ckd == 1) {
            trial_n --;
            int ck = analog / 10;
            if (value1 == ck) {
                LCDMove(0,12);
                LCDPuts(hit);
                LCDMove(0,0);

                value1 = 777;
                PORTB = 0x00;
            }
            else if (value1 > ck) {
                LCDMove(0,12);
                LCDPuts(up);
                LCDMove(0,0);
            }
            else {
                LCDMove(0,12);
                LCDPuts(down);
                LCDMove(0,0);
            }
            _delay_ms(500);
            ckd = 0;
        }
        //재시작
        if(0 == (PINB & (1<<PB0)) || (UDR0 != 0x00)) {
            UDR0 |= 0x00;
            goto restart;
        }

        // 저항 체크 성공
        if(value1 == 777)
        {
            TIMER1_Initx();
            for (int b = 3; b < 7; b++){
                PORTG = (b % 2 << PG3); //buzzer ON
                _delay_ms(100);
            }

            while(1){
                if(0 == (PINB & (1<<PB0)) || (UDR0 != 0x00)) {
                    UDR0 |= 0x00;
                    PORTG &= ~(1<<PG3); //buzzer OFF
                    goto restart;
                }
            }
        }

        // 부저
        int bz(void){
            PORTG |= (1<<PG3);  //buzzer ON
            _delay_ms(10);
            PORTG &= ~(1<<PG3); //buzzer OFF
            _delay_ms(10);
        }
        switch (count_m) {
            case 900:
            case 800:
            case 700:
            case 600:
            bz();break;

            case 500:
            bz();bz();bz();break;
            case 450:
            case 400:
            case 350:
            case 300:
            bz();break;

            case 250:
            bz();bz();bz();break;
            case 225:
            case 200:
            case 175:
            case 150:
            bz();break;

            case 125:
            bz();bz();bz();break;
            case 112:
            case 100:
            case 88:
            case 75:
            bz();break;

            case 62:
            bz();bz();bz();break;
            case 55:
            case 49:
            case 43:
            case 37:
            bz();break;

            case 31:
            bz();bz();bz();break;
            case 28:
            case 25:
            case 22:
            case 19:
            case 16:
            case 13:
            case 10:
            case 7:
            case 4:
            case 1:
            bz();break;

            case 0:
            while(1) {
                TIMER1_Initx();
                PORTG |= (1<<PG3);  //buzzer ON
                if(0 == (PINB & (1<<PB0)) || (UDR0 != 0x00)) {
                    UDR0 |= 0x00;
                    PORTG &= ~(1<<PG3); //buzzer OFF
                    goto restart;
                }
            }
        }
    }
}

*/