Компилятор ругается на COM0A0, как на неизвестную переменную. Если это имеет какое-то значение, пользуюсь CodeVisionAVR.ibiza11 писал(а):kLeR1k, код в студию!kLeR1k писал(а):И как можно отключить ШИМ и посадить ногу на землю?Код: Выделить всё
TCCR0A &= ~((1<<COM0A0)|(1<<COM0A1)); // если выход А TCCR0A &= ~((1<<COM0B0)|(1<<COM0B1)); // если выход B PORT &= ~(1<<BIT);
Спойлер
Код: Выделить всё
#include <tiny13.h>
#include <delay.h>
int cnt=0;
int pwmflag=1;
char Step=0xFF;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if (pwmflag==1)
{
// Reinitialize Timer 0 value
TCNT0=0xFE;
// Place your code here
cnt++;
//Каждый 5000-й заход в прерывание
if (cnt==5000)
//if (cnt==2)
{
cnt=0;
//254 шага увеличения ширины импульса
if (Step !=0xFE ) {
Step++;
OCR0A=Step;
}
}
}
}
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
// Place your code here
}
// Declare your global variables here
void main(void)
{
//Задержка после включения поворота
int TurnOfDelay;
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
// State5=P State4=P State3=P State2=P State1=0 State0=0
PORTB=0x3C;
DDRB=0x03;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 9600,000 kHz
// Mode: Fast PWM top=FFh
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
TCCR0A=0x83; //83=non-inverted, C3=inverted
/* TCCR0A
(10)=Clear OC0A on Compare Match, set OC0A at TOP
|
-- --(11)=Fast PWM + WGM02 in TCCR0B=0
10000011
*/
TCCR0B=0x01;
/* TCCR0B
-(0)=WGM02
00000001
*/
TCNT0=0x10;
OCR0A=0x00;
OCR0B=0x00;
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x06;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/1024k
// Watchdog Timer interrupt: Off
#pragma optsize-
WDTCR=0x39;
WDTCR=0x29;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Global enable interrupts
#asm("sei")
pwmflag=1;
TurnOfDelay = 1500;
while (1)
{
#asm("wdr"); //Сброс сторожевого таймера
if (PINB.3==0)
{
//Выключен поворотник
if (PINB.1==1)
{
// Гасим поворотник
PORTB.1 = 0;
}
if (TurnOfDelay<1500)
{
// Ждём n секунды после этого, ДХО держим выключенными
TurnOfDelay++;
if (pwmflag>0)
{
Step=0;
OCR0A=0;
PORTB=0x00;
DDRB=0x03;
PORTB.0=0;
cnt=0;
pwmflag=0;
}
}
else
{
if (PINB.4==0 && pwmflag==0)
{
//Прошло n секунд и не горят габариты - включаются ДХО
PORTB=0x3C;
DDRB=0x03;
pwmflag=1;
}
}
}
else
{
//Включен поворотник - выключаются ДХО, зажигается поворотник
TurnOfDelay = 0;
if (pwmflag>0)
{
Step=0;
OCR0A=0;
PORTB=0x00;
DDRB=0x03;
PORTB.0=0;
cnt=0;
pwmflag=0;
}
if (PINB.1==0)
{
PORTB.1 = 1;
}
}
if (PINB.4==1)
{
//Если включены габариты - ДХО выключены
if (pwmflag>0)
{
Step=0;
OCR0A=0;
PORTB=0x00;
DDRB=0x03;
PORTB.0=0;
cnt=0;
pwmflag=0;
}
}
else
{
if (PINB.3==0 && TurnOfDelay>=1500 && pwmflag==0)
{
// Габариты выключены и поворотник выключен n секунд назад - включаются ДХО
PORTB=0x3C;
DDRB=0x03;
pwmflag=1;
}
}
// Не сработало ни одно из условий, но есть питание - ДХО включаются по прерыванию
delay_us(100);
};
}



