arduino,avr

아두이노 기초 : L LED점멸

ds97l 2022. 2. 21. 15:59

아두이노 내부 L LED 점멸

 

Fast PWM은 0~255의 duty비에서 0일때 1/256의 비를 가지므로 완전한 0이 될 수 없다

완전히 led를 끌수 없는 이유이며 이를 해결하기 위해선 phase-correct PWM 으로 수정할 필요가 있다.

 

 

아두이노로 구현

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

AVR

#include <avr/io.h>

#define    F_CPU    16000000UL
#include "util/delay.h"

int main(void)
{
  DDRB = 0xFF;
  
  while (1)
  {
    PORTB = 0x20; //PORTB_5 PIN13에 의해 LED제어
    _delay_ms(1000);
    PORTB = 0x00;
    _delay_ms(1000);
  }
}

 

외부 LED 연결해서 점멸

PB4(PIN12)와 ground에 연결

저항 100옴 사용

주기 2초

 

 

 

arduino

void setup()
{
  pinMode(12, OUTPUT);
}

void loop()
{
  digitalWrite(12, HIGH);
  delay(1000);
  digitalWrite(12, LOW);
  delay(1000); 
}

 

avr

#include <avr/io.h>

#define    F_CPU    16000000UL
#include "util/delay.h"

int main(void)
{
  DDRB = 0xFF;
  while (1)
  {
    PORTB = 0x10; 
    _delay_ms(1000);
    PORTB = 0x00;
    _delay_ms(1000);
  }
}

 

LED2개 번갈아가며 점멸

 

arduino

void setup(){ // 초기설정
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
}
   void loop(){  // 실행부
  digitalWrite(12, HIGH);
  delay(500);
  digitalWrite(12, LOW);
  delay(500);  
  digitalWrite(11, HIGH);
  delay(500);
  digitalWrite(11, LOW);
  delay(500); 
}

avr

#include <avr/io.h>

#define F_CPU 16000000UL
#include "util/delay.h"

int main(void)
{
  DDRB =0xFF;
  while(1)
  {
    PORTB=0x10;
    _delay_ms(500);
    PORTB=0x00;
    _delay_ms(500);
    PORTB=0x08;
    _delay_ms(500);
    PORTB=0x00;
    _delay_ms(500);
  }
}

 

밝기 조절 

 

 

arduino

#include <avr/io.h>
#define F_CPU 16000000UL
#include "util/delay.h"

int main(void)
{              
    DDRB = 0xFF;  // OC0(PB4)출력설정     
    TCCR1A = 0b10000001;  
    TCCR1B = 0b00001010;
    
    while(1) // 00 : 0%, 3F : 25%, 7F : 50%, BF : 75%, FF : 100%
    {
        OCR1A = 0x00; //완전히 꺼지지않음 COM1A1, COM1A1 10에서 11로 넣고 아래 수정했을땐 완전히 꺼짐
        _delay_ms(1000);
        OCR1A = 0x2F;
        _delay_ms(1000);
        OCR1A = 0x4F;
        _delay_ms(1000);
        OCR1A = 0x8F;
        _delay_ms(1000);
        OCR1A = 0xFF;
        _delay_ms(1000);
    }
}

색깔변경

 

arduino

void setup()
{
  Serial.begin(115200);

}

void loop()
{
  analogWrite(9,255); //R255~0 밝아짐
  analogWrite(6,255);//G
  analogWrite(5,255);//B
}

avr FAST PWM 0x00시 duty비가 1/256 희미하게 불이 들어옴

#include <avr/io.h>
#define F_CPU 16000000UL
#include "util/delay.h"

int main(void)
{              
    DDRB = 0xFF;    
    DDRD = 0xFF; 
    TCCR1A = 0b11000001;  //Inverting mode, FastPWM 8-bit
    TCCR1B = 0b00001010; //clk/8분주
    TCCR0A = 0b11110011;
    TCCR0B = 0b00000010;
    while(1) // 00 : 0%, 3F : 25%, 7F : 50%, BF : 75%, FF : 100%
    {
        OCR1A = 0xFF; //RED 00~FF PIN12
        OCR0A = 0xFF;//GREEN 00~FF PIN6
        OCR0B = 0xFF;//BLUE 00~FF PIN5

    }
}

avr phase correct mode 0x00시 duty비 0% 완전히 꺼짐

#include <avr/io.h>
#define F_CPU 16000000UL
#include "util/delay.h"

int main(void)
{              
    DDRB = 0xFF;    
    DDRD = 0xFF; 
    TCCR1A = 0b11000001;// Inverting mode, Phase Correct 8-bit
    TCCR1B = 0b00000010; //clk/8분주
    TCCR0A = 0b11110001;
    TCCR0B = 0b00000010;
    while(1) // 00 : 0%, 3F : 25%, 7F : 50%, BF : 75%, FF : 100%
    {
        OCR1A = 0xFF; //RED 00~FF PIN12
        OCR0A = 0xFF;//GREEN 00~FF PIN6
        OCR0B = 0xFF;//BLUE 00~FF PIN5

    }
}

 

스위치로 LED제어

 

 const int bntPin =2;
 const int ledPin =12;
 int bntState =LOW;

 void setup(){
  pinMode(ledPin, OUTPUT);
  pinMode(bntPin, INPUT);
  }
 
 void loop(){
  bntState = digitalRead(bntPin);
  if ( bntState == HIGH){
       digitalWrite(ledPin, HIGH);
     } 
     else {
       digitalWrite(ledPin, LOW);
     }
}

avr

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>

int main(void)
{              
    DDRD = 0x00;  // (PD2)입력설정    
    DDRB = 0xFF;  // (PB4)출력설정

    while(1)
    {
        if((PIND&0x04) != 0)
        {
          PORTB = 0x10;
        }
        PORTB =0x00;
    }
}

 

LED PIN2~7까지 번갈아가며 키기

arduino

void setup() {
	for (int i = 2; i <= 7; i++) {
		pinMode(i, OUTPUT);
		digitalWrite(i, LOW);
	}
}
void loop() {
	for (int i = 2; i <= 7; i++) {
		digitalWrite(i, HIGH);
		delay(1000);
		digitalWrite(i, LOW);
	}
}

avr

#include <avr/io.h>

#define    F_CPU    16000000UL
#include "util/delay.h"

int main(void)
{
  DDRD = 0xFF;
  
  while (1)
  {
    PORTD = 0x04;
    _delay_ms(1000);
    for(int i = 0; i<5; i++)
    {
     PORTD = PORTD << 1;
    _delay_ms(1000);
    }
  }
}