Добавлено (15.04.2013, 17:51)
---------------------------------------------
/*******************************************************
This program was created by the
CodeWizardAVR V2.60 Evaluation
Automatic Program Generator
© Copyright 1998-2012 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com Project :
Version :
Date : 03.04.2013
Author :
Company :
Comments:
Chip type : ATtiny2313A
AVR Core Clock frequency: 8,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 32
*******************************************************/
#include <tiny2313a.h>
int i=0,x=0,i_min=100,i_max=140,i_;
// Declare your global variables here
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// .. период 73 гц Амплитуда 3.0 В 13.6мс период в канале
if(PIND.3==0)// нисходяший фронт 1->0 старт
{
TCCR0=0x04;// старт таймера 0 с пределителем на 8 МГц =7.8кгц //106 ->137 протеус крайние положения 112->140 факт вверх джойсти 1мс - вниз 2мс
TCNT0=0x00; // очистка счетчика 0
}
if(PIND.3==1)// восходяший фронт 0->1 стоп
{
TCCR0=0x00; //останавливаем таймер 0
i=TCNT0; // в тиках время импульса
if (i < i_min) {i_min=i;}
if (i > i_max) {i_max=i;}
i_= i_max- i_min; // получаем разницу те ширину изменения 140-112 =28 и делаем 7 передач
}
if ( (i>((i_/2)+i_min-2))&& (i<((i_/2)+i_min+2)) ) // +- 2 четыре тика на паузу
{
// СТОП
TCCR1A=0;
TCCR1B=0;
PORTB.0=0;PORTB.1=0; //закрываем транзисторы оба
PORTD.0=0;PORTD.1=1;PORTD.2=0; //индикация
}
if (i<((i_/2)+i_min-2)) // половина нашего диапазона изменений (середина) минус 2 тика на паузу
{
// РЕВЕРС Только B //32250гц не инверсный шим Mode: Fast PWM top=0x00FF -2мс
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (1<<CS12) | (0<<CS11) | (1<<CS10);
OCR1B=255-(255/(i_-4)/2)*(i-i_min); // единичный сегмент вычтя дельту равную 4 умножаемм на текущее местоположение
PORTB.0=0;PORTB.1=1;
PORTD.0=1;PORTD.1=0;PORTD.2=0; //индикация
// PORTB.0=1; PORTB.3=1 ;//тест одной обмотки
}
if (i>((i_/2)+i_min+2))
{
// ВПЕРЕД Только А -1мс
TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (1<<CS12) | (0<<CS11) | (1<<CS10);
OCR1A =(255/((i_-4)))*(i_max-i); //как надо
PORTB.0=1;PORTB.1=0; // открываем транзюк второй
PORTD.0=0;PORTD.1=0;PORTD.2=1; //индикация
// PORTB.0=0;PORTB.3=0; //тест одной обмотки
}
}
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port A initialization
// Function: Bit2=In Bit1=In Bit0=In
DDRA=(0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit2=T Bit1=T Bit0=T
PORTA=(0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
// Port B initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port D initialization
// Function: Bit6=Out Bit5=Out Bit4=Out Bit3=In Bit2=Out Bit1=Out Bit0=Out
DDRD=(1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (0<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0);
// State: Bit6=0 Bit5=0 Bit4=0 Bit3=T Bit2=0 Bit1=0 Bit0=0
PORTD=(0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
// Timer Period: 2,048 ms
/*TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00; */
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: Fast PWM top=0x00FF
// OC1A output: Non-Inverted PWM
// OC1B output: Non-Inverted PWM
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 8,192 ms
// Output Pulse(s):
// OC1A Period: 8,192 ms Width: 0 us
// OC1B Period: 8,192 ms Width: 0 us
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
/*
TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (1<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00; */
TCNT1=0; //обнуляем счетчик
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<TOIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<ICIE1) | (0<<OCIE0B) | (0<<TOIE0) | (0<<OCIE0A);
// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Any change
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x80;
MCUCR=0x04;
EIFR=0x80;
// USI initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC);
// USART initialization
// USART disabled
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
DIDR=0x00;
// PORTD.0=1;PORTD.1=1;PORTD.2=1; //индикация СТОП в начале
// PORTB.0=1; PORTB.3=1 ;//тест одной обмотки
// PORTB.1=0; PORTB.4=0 ;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
}
}