attiny85

2017 단어 ATtinyATtiny85

데이터 테이블 약어
PWM
CS0-CS2
http://kcnotebook.web.fc2.com/avr/timer.html
CS02 CS01 CS00
0 0 0 중지(타이머/카운터 동작 중지)
0.1Fclk(무분주)
0.10FCk/8(8분)
001 FCk/64(64 주파수 분할)
10FCk/256(256분주)
101FCk/1024(1024분주)
101T0핀 하강단(외부 시계)
1-1T0핀 상승단(외부 시계)
매크로 목록
포트
포트 B 방향 레지스터 DDRB(포트 A의 경우 DDRA) 0이 INPUT1인 경우 OUT PUT
포트 B 출력 레지스터 PORTB(포트 A의 경우 PORTA) OUTPUT에 High/Low 설정
포트 B 입력 레지스터 PINB(포트 A 는 PINA) INPUT 가 High/Low 인지 확인
servo
#include <avr/wdt.h>
#define OUTPUT_PIN  _BV(1)

void init_pwm() {
  OCR0A = 156;  // TOP value :  64us * 156 = 9984us = 10ms = 100Hz. SG92R works on 50Hz. but set 100Hz for degree subdivide.
  OCR0B = 1;  //  H period  : 256us x 10 / 2 = 128us
  TCCR0A = B00100011; // COM0A: 00, COM0B: 10, WGM01-00: 11. TCCR0A(TimeCountControlRegister 0A)
  //TCCR0B = B00001001; // FOC:00, WGM02:1, CS02-01: 001 (system clock x1)
  TCCR0B = B00001011; // FOC:00, WGM02:1, CS02-01: 011 (system clock x64)
  TCNT0 = OCR0A;// init count. if(TCNT0 == OCR0A) ic reset count and reload new OCR0A and OCR0B.
}

void set_pwm(int a) {
  OCR0B = a;
}

void setup() {
  cli();
  DDRB = OUTPUT_PIN; // inputは0
  PORTB = 0;  // 他は0
  ACSR |= 0x80;    // アナログコンパレータ禁止
  ADCSRA &= 0x7f;  // disable ADC
  wdt_disable();
  TIMSK = 0;  // disable Timer0/1 overflow interrupt.
  sei();

  pinMode(0, INPUT);
  init_pwm();
}

void trigger_on(int a){
  set_pwm(a);
}

void trigger_off(){
  TCCR0A = 0;
  TCCR0B = 0;
}

int wait = 100;
int count = 8 * wait; //64us x 8 = 512 us.
void loop() {
  if(digitalRead(0) == LOW){
    trigger_on(count/wait);
    ++count;
    if(count > 37*wait) count = 8*wait;
  }else{
    trigger_off();
  }
  delay(1);
}

좋은 웹페이지 즐겨찾기