Регулятор хода на attiny 13
| |
ВитГо | Дата: Суббота, 18.05.2013, 22:52 | Сообщение # 16 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| тогда так и пишите Код TCCR0A=(1<<COM0A1)|(1<<WGM01) | (1<<WGM00);
про установку нужного уровня читайте по строке Force Output compare это регистр TCCR0B (стр 73 даташита) биты FOC0A и FOC0B
на ШИМ не знаю влияет ли.. по меньшей мере при старте влияет, потом то нет наверное...
Виталий (аka ВитГо)
|
|
| |
HamsterODP | Дата: Понедельник, 20.05.2013, 16:09 | Сообщение # 17 |
Рядовой
Группа: Проверенные
Сообщений: 4
Статус: Offline
| А подробнее можете рассказать про FOC0A и FOC0B. А то с английским совсем не лады. Переводчик сильно жестко переводит ничего не понял.
|
|
| |
uwrtey | Дата: Вторник, 21.05.2013, 07:51 | Сообщение # 18 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| в датащите написано, что биты FOC0A и FOC0B НЕ активны в режиме ШИМ.
Цитата The FOC0A/FOC0B bit is only active when the WGM bits specify a non-PWM mode.
вот Гугл перевод
Цитата бит FOC0A активна только при WGM бита определить действие не по режим ШИМ.
Тем не менее, для обеспечения совместимости с будущими устройствами, этот бит должен быть установлен в ноль, когда TCCR0B написана при работе в режиме ШИМ.
При написании логическим биту FOC0A, немедленного матча Compare вынужден на блок формирования сигнала.
Выход OC0A изменяется в соответствии с его COM0A1: 0 битов параметра. Следует отметить, что бит FOC0A реализован в виде вспышки.
Поэтому это значение присутствует в COM0A1: 0 битов, которое определяет воздействие принудительного сравнения.
FOC0A стробоскопа не генерирует никаких прерываний, и не будет ясно, таймер в режиме CTC использованием OCR0A как топ.
бит FOC0A всегда читается как ноль
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Вторник, 21.05.2013, 07:57 |
|
| |
lorddroid | Дата: Четверг, 23.05.2013, 15:20 | Сообщение # 19 |
Рядовой
Группа: Проверенные
Сообщений: 9
Статус: Offline
| ну давно ен писал тык вот по факту: 1) тини 13 слишком мала и там нет 2х таймеров у 85 выводы не подошли. 2) макет мой на меге 8 - и под него сделал с жк все работает 3) перешел на тини 2313 , все также пашет
под мегу скину ниже.
//ДЛЯ MEGA8 #define Led_UP PORTC.2 //зажигаем вверх #define Led_DOWN PORTC.1 //зажигаем вниз #define Led_OUT_of_range PORTC.0 //зажигаем больше максимального или меньше минимального
#include <mega8.h> #include <delay.h> #include <lcd.h> #include <stdio.h>
char lcd_buffer[33]; //массив с данными для экрана
unsigned char OnOff=0, Mode=1,i=0,i_min=35,i_max=63,PWM=0; ; int x0=0;
#asm .equ __lcd_port=0x12 // ЖК подключен к порту B PORTD=0x12; PORTB=0x18; #endasm
void Speed(int V) {
if ((V<14)&&(V>=0)) { // ВПЕРЕД Только А -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); */ // Clock value: 31,250 kHz // Mode: Fast PWM top=0x00FF // OC1A output: Non-Inv. // OC1B output: Discon.
TCCR1A=0x81; TCCR1B=0x0C;
PORTB.0=0;PORTB.6=1; // открываем транзюк второй
OCR1B=0;
if (V>0) { OCR1A =255-16*V;} else { OCR1A=255; }
Led_UP=1; Led_DOWN=0; //индикация
PWM= OCR1A;
// if (V>0) { PWM =255-16*V;} // else { PWM=255; } }
if ((V<=16)&& (V>=14)) { // СТОП TCCR1A=0; TCCR1B=0; OCR1A=0; OCR1B=0;
PORTB.0=0;PORTB.6=0; //закрываем транзисторы оба
PWM=0;
Led_UP=1; Led_DOWN=1; //индикация
}
if ((V>16)&&(V<=29)) { // РЕВЕРС Только 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); */ // Clock value: 31,250 kHz // Mode: Fast PWM top=0x00FF // OC1A output: Discon. // OC1B output: Non-Inv. TCCR1A=0x21; TCCR1B=0x0C;
PORTB.0=1;PORTB.6=0; // открываем транзюк второй
OCR1A =0;
if (V<28) { OCR1B=47+ 16*(V-17);} else { OCR1B=255; }
PWM= OCR1B;
// if (V<28) { PWM=47+ 16*(V-17);} // else { PWM=255; }
Led_UP=0; Led_DOWN=1; //индикация }
// за пределами
if ((i<i_min-5)||(i>i_max+5)) {Led_OUT_of_range=1; Led_UP=0; Led_DOWN=0;} else {Led_OUT_of_range=0;} //красный гасим как что то пришло на вход
} // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Place your code here
OnOff++; }
// External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) { /*//============================= if(PIND.2==0)// нисходяший фронт 1->0 старт { TCNT0=0; // очистка счетчика 0 TCNT1=0; TCNT2=0; // x=0; } if(PIND.2==1)// восходяший фронт 0->1 стоп { i=TCNT0; } // в тиках время импульса //=================================== */
if(Mode==2)// нисходяший фронт 1->0 старт //вниз 63-62 / 49-50 среедина /вверх 35-36 {i=TCNT0; // в тиках время импульса MCUCR=0x0C; Mode=0; } // INT0 Mode: Rising Edge
if(Mode==1)// восходяший фронт 0->1 стоп { MCUCR=0x08; // INT0 Mode: Falling Edge TCNT0=0; OnOff=0; // дублируем }
Mode++; } void main(void) { // Declare your local variables here
// Input/Output Ports initialization // Port B initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTB=0x00; DDRB=0xFF;
// Port C initialization // Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTC=0x00; DDRC=0x7F;
// Port D initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=T State2=0 State1=0 State0=0 PORTD=0x00; DDRD=0xF7;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 31,250 kHz TCCR0=0x04; TCNT0=0x00;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00;
// Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer2 Stopped // Mode: Normal top=0xFF // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00;
// External Interrupt(s) initialization // INT0: Off // INT1: On // INT1 Mode: Rising Edge GICR|=0x80; MCUCR=0x0C; GIFR=0x80;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x01;
// USART initialization // USART disabled UCSRB=0x00;
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00;
// ADC initialization // ADC disabled ADCSRA=0x00;
// SPI initialization // SPI disabled SPCR=0x00;
// TWI initialization // TWI disabled TWCR=0x00;
// Global enable interrupts #asm("sei") lcd_init(16); while (1) {
// if (i<i_min) {i_min=i;} // if (i>i_max) {i_max=i;}
lcd_gotoxy(0,0); sprintf(lcd_buffer,"Time =%i min=%i max=%i N=%i %i",i,i_min,i_max,i-i_min,PWM); lcd_puts(lcd_buffer); delay_ms(200); lcd_clear();
Speed (i-i_min);
// if(PIND.2==1){OnOff=0;} // восходяший фронт 0->1 т.е. получаем какой то сигнал if(OnOff>2) {
TCCR1A=0; TCCR1B=0; OCR1A=0; OCR1B=0;
PORTB.0=0;PORTB.6=0; //закрываем транзисторы оба
PWM=0;
Led_UP=1; Led_DOWN=1; //индикация Led_OUT_of_range=1;
}// те нет несколько циклов нет на вход импульсов тормозим шим
} }
Добавлено (23.05.2013, 15:13) --------------------------------------------- еще одно тут в коментах прерывания на INT два варианта или менять режим по фронтам или можно сравнивать что на входе
Добавлено (23.05.2013, 15:20) ---------------------------------------------
http://s2.ipicture.ru/uploads/20130507/6WRGd5YR.jpg
http://s2.ipicture.ru/uploads/20130507/RtA1dZyF.jpg
фотки в железе.
Сообщение отредактировал lorddroid - Четверг, 23.05.2013, 15:27 |
|
| |
ВитГо | Дата: Воскресенье, 23.06.2013, 08:30 | Сообщение # 20 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| а оргстекло чем так ровненько вырезали ?
p.s. монументальный однако у вас подход, смотреть приятно ! :-)
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 23.06.2013, 21:35 | Сообщение # 21 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| Да, оргстекло ровно резать - это очень много терпения надо... У меня на такое терпения ни когда не хватало.. Мне как-то понадобилось нарезать оргстекла, так я обратился в рекламную конторку, при чем обратился не официально - просто подошел к работяге, который вышел на перекур и договорился с ним. Они мне все нарезали по размерам на лазерном станке и из своего материала - обошлось вполне доступно... а качество на пять с плюсом! ( оргстекло даже в пленке защитной было - без царапин и потертостей )
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 23.06.2013, 21:38 |
|
| |
ВитГо | Дата: Понедельник, 24.06.2013, 06:31 | Сообщение # 22 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| понятно, да, качество реза сразу видно !
Виталий (аka ВитГо)
|
|
| |
|