Вс авг 14, 2016 10:02:49
#include <avr/io.h>
#include <util/delay.h>
byte s=0;
byte pos=90;
boolean lastPos = false;
void setup() {
//pinMode(s, OUTPUT);
DDRB |= (1<<0);
DDRB &= ~(1<<3);
DDRB &= ~(1<<4);
pulseOut(s,pos);
}
void loop() {
if (lastPos == false) {
if (PINB & (1<<PINB3)){
_delay_ms(5);
if (PINB & (1<<PINB3))
{
pulseOut(s, pos - 30);
lastPos = true;
_delay_ms(200);
}
}
if (PINB & (1<<PINB4)){
_delay_ms(5);
if (PINB & (1<<PINB4))
{
pulseOut(s,pos + 30);
lastPos = true;
_delay_ms(200);
}
}
}
if (lastPos == true) {
if (!(PINB & (1<<PINB4)) && !(PINB & (1<<PINB4))){
for (byte i=0;i<10;i++){
pulseOut(s,pos);
_delay_ms(2);
}
lastPos = false;
_delay_ms(200);
}
}
_delay_ms(20);
}
void pulseOut( byte pin, byte p){
PORTB |= (1<<0);
delayMicroseconds(300+p*(2500/180));
PORTB &= ~(1<<0);
}
Вс авг 14, 2016 10:30:09
Вс авг 14, 2016 10:57:33
Вс авг 14, 2016 11:09:10
Это издалека так кажется, на самом деле там только три тополя.forfrends писал(а):но для меня это темный лес....
Вс авг 14, 2016 11:19:55
Вс авг 14, 2016 13:10:45
Вс авг 14, 2016 15:41:20
Вс авг 14, 2016 16:40:47
Вс авг 14, 2016 19:29:29
#define TopTimer 200
#define angle60 188
#define angle90 186
#define angle120 184
#include <avr/io.h>
#include <avr/interrupt.h>
int main(void)
{
CLKPR=0x80;
CLKPR=1<<CLKPS2;// на 16
//настройка порта
DDRB=(1<<PB1);
PORTB=(1<<PB3)|(1<<PB4);
//настройка ШИМ
TCCR0A=(1<<WGM01)|(1<<WGM00)|(1<<COM0B0)|(1<<COM0B1);
TCCR0B=(1<<WGM02)|(1<<CS01)|(1<<CS00);//предделитель счетчика на 64
OCR0A=TopTimer; //счетчик будет считать до
OCR0B=angle90; //устравноить серву в 90
while(1)
{
uint8_t buf=(PINB>>3)&0x03; //проверяем сигналы на пинах
switch (buf){
case 0:OCR0B=angle90;break;
case 1:OCR0B=angle60;break;
case 2:OCR0B=angle120;break;
default:break;
}
}
}
Вс авг 14, 2016 19:30:26
#include <avr/io.h>
#include <util/delay.h>
const byte servo = 0; // Servo pin on ATtiny
int tPulse = 4000; // Total pulse length on 1 Mhz clock
int hPulse = 60; // High pulse time (60=0deg -> 280=180deg)
boolean lastPosL = false;
boolean lastPosR = false;
boolean lastPosU = false;
void setup() {
DDRB |= (1<<0);
hPulse = 110;
DDRB &= ~(1<<3);
hPulse = 170;
_delay_ms(100);
pulseOut();
pulseOut();
pulseOut();
}
void loop() {
if (PINB & (1<<PINB3) && lastPosL == false){ //Поворачиваем влево
lastPosL = true;
lastPosR = false;
lastPosU = false;
hPulse = 133;
pulseOut();
pulseOut();
pulseOut();
}
else if (PINB & (1<<PINB4) && lastPosR == false){ //Поворачиваем вправо
lastPosL = false;
lastPosR = true;
lastPosU = false;
hPulse = 240;
pulseOut();
pulseOut();
pulseOut();
}
else if (!(PINB & (1<<PINB3)) && !(PINB & (1<<PINB4)) && lastPosU == false) //Исходное положение
{
lastPosL = false;
lastPosR = false;
lastPosU = true;
hPulse = 170;
pulseOut();
pulseOut();
pulseOut();
pulseOut();
}
delayMicroseconds(500); // Give servo some time to move before giving it a new position
}
void pulseOut(){
PORTB |= (1<<0);
delayMicroseconds(hPulse); // High pulse angle data
PORTB &= ~(1<<0);
delayMicroseconds(tPulse-hPulse);
}
Вс авг 14, 2016 19:37:28
Вс авг 14, 2016 19:50:39
Вс авг 14, 2016 19:59:08
Вс авг 14, 2016 20:23:19
Пн авг 15, 2016 12:13:49
COKPOWEHEU писал(а):Первый раз слышу про оператор loop в языке Си. Не подскажете где про него можно почитать?
Пт мар 09, 2018 07:45:58
#include <avr/io.h> // инициализация портов ввода-вывода МК
#include <avr/sleep.h> // здесь описаны режимы сна
#include <avr/interrupt.h> // работа с прерываниями
#include <avr/delay.h> // описание программных задержек
#define F_CPU 1200000UL
#define SERVO PB0
// Обработчик прерываний
ISR(INT0_vect) // Прерывание по низкому уровню на PB1
{
while ((PINB & (1 << PB1)) == 0) {}
PORTB |= (1<<PB4); // Выставить на PB4 - "1"
_delay_ms(50);
do // Нарастание яркости
{
OCR0A = OCR0A + 20;
_delay_ms(5);
}
while(OCR0A!=200);
// _delay_ms(1000); // Пауза 1 сек.
do // Затухание
{
OCR0A = OCR0A - 20;
_delay_ms(5);
}
while(OCR0A!=100);
// _delay_ms(1000); // Пауза 1 сек.
_delay_ms(50);
PORTB &= ~(1<<PB4); // Выставить на PB4 - "0"
}
// Основная программа
int main()
{
//
// PORTB &= ~ (1<<PB4); // Выставить на PB4 - "0"
// DDRB |= (1<<PB4); // Указатель пина
////
PORTB = 0b11101111; // Выставить на PB4 - "0"
DDRB = 0b00010000; // Указатель пина
DDRB |= (1 << SERVO);// выходы = 1
PORTB &= ~(1 << SERVO); // по умолчанию отключены = 0
// Таймер для ШИМ:
TCCR0A = 0xB1; // режим ШИМ, неинверсный сигнал на выходе OC0A, инверсный - на выходе OC0B
TCCR0B = 0x02; // предделитель тактовой частоты CLK/8
TCNT0=100; // начальное значение счётчика
OCR0A=100; // регистр совпадения A
// Инициализация прерываний по INT0
GIMSK = 0b01000000; // Разрешение прерываний INT0 на входе PB1
MCUCR = 0b00000000; // при перепаде низком уровне на PB1
sei(); // Общее разрешение прерываний
// Инициализация режима сна
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
while(1)
{
sleep_enable(); // разрешение режима сна
sleep_cpu(); // активация режима сна
}
}
Пт мар 09, 2018 10:01:42
Пт мар 09, 2018 12:00:06
Пт мар 09, 2018 12:34:19
// Обработчик прерываний
ISR(INT0_vect) // Прерывание по низкому уровню на PB1
{
while ((PINB & (1 << PB1)) == 0) {}
PORTB |= (1<<PB4); // Выставить на PB4 - "1"
_delay_ms(50);
do // Нарастание яркости
{
OCR0A++;
_delay_ms(100);
}
while(OCR0A!=30);
do // Затухание
{
OCR0A--;
_delay_ms(100);
}
while(OCR0A!=1);
_delay_ms(50);
PORTB &= ~(1<<PB4); // Выставить на PB4 - "0"
}
// Основная программа
int main()
{
PORTB = 0b11101111; // Выставить на PB4 - "0"
DDRB = 0b00010000; // Указатель пина
DDRB |= (1 << SERVO);// выходы = 1
PORTB &= ~(1 << SERVO); // по умолчанию отключены = 0
// Таймер для ШИМ:
//TCCR0A = 0xB1; // режим ШИМ, неинверсный сигнал на выходе OC0A, инверсный - на выходе OC0B
//TCCR0B = 0x02; // предделитель тактовой частоты CLK/8
TCCR0A = 0x81;
TCCR0B = 0x03;
TCNT0=0; // начальное значение счётчика
OCR0A=0; // регистр совпадения A
// Инициализация прерываний по INT0
GIMSK = 0b01000000; // Разрешение прерываний INT0 на входе PB1
MCUCR = 0b00000000; // при перепаде низком уровне на PB1
sei(); // Общее разрешение прерываний
// Инициализация режима сна
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
while(1)
{
sleep_enable(); // разрешение режима сна
sleep_cpu(); // активация режима сна
}
}
Пт мар 09, 2018 12:40:38