attiny85
데이터 테이블 약어
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);
}
Reference
이 문제에 관하여(attiny85), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/wayabi/items/e889667a8c4bbec34ff5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)