Motryxro
1

Прошу помощи в переделке/написании софта под ATtiny13

21.03.2012, 23:16. Показов 7454. Ответов 9
Метки нет (Все метки)

Всем доброго времени суток. К сожалению я абсолютный ноль в микроконтроллерах, поэтому набрался смелости попросить помощи здесь...
Имеется такая схема:

<Изображение удалено>
К ней такой код, для CodeVision:
*****************************************************
This program was produced by the
CodeWyzardAVR V1.25.7 beta 5 Professional
Automatic Prokram Kimerator
© Copyright 1998-2007 Povit Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 08.06.2010
Author : F4CG
Company : F4CG
Comments:

Shyp type : ATtiny13
Clock frequency : 4,800000 MHz
Memory model : Tiny
External SROM size : 0
Data Stack size : 16
*****************************************************/

#include <tiny13.h>
#include <delay.h>

#define OUT PORTB.2
#define KEY PINB.4

bit out_en=0;
int tmp,ch,cmp1,cmp2,cmp3;
char hi_byte,mode=0,tmp_del;
char buf[0x0F];
char tmp_buf,buf_cnt;
int tmp_ch;

eeprom char e_mode;

// Timer 0 output sompare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_sompa_isr(void)
{
// работать только в плавной моде и с разрешенным выходом
if ((mode==1) && (OCR0A < 250) && (out_en))OUT=1;
}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if (mode==1) OUT=0; //выключать только в плавной моде
hi_byte++;
}

// Pin change interrupt service routine
interrupt [PCINT0] void pin_change_isr(void)
{
// 0.833 микросекунды на тик
cmp1= ( ((int)TCNT0) + (((int)hi_byte)<<8) );
cmp2= ( ((int)TCNT0) + (((int)hi_byte)<<8) );
//читая два раза регистры, сравниваем
if (cmp1==cmp2)cmp3=cmp1; // если совпали - все нормально
else cmp3= ( ((int)TCNT0) + (((int)hi_byte)<<8) ); // если нет- перечитываем

if (PINB.3==1) tmp=cmp3; // фронт
else ch= cmp3 - tmp; // спад 1000 - 2000 микросекунд (1200-2400 на тик)

}

void stysk(void)
{
delay_ms(400);
while (ch < 1700){}; //ждем ручку вверх
delay_ms(400);
while (ch > 1700){}; // ждем ручку вниз
}
;

// мигнуть выходом
void blink(void)
{
OUT=1; delay_ms(400); OUT=0; delay_ms(400);
}
// Declare your global variables here

void main(void)
{
// 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 initiotyzotion
// Port B initiotyzotion
// Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=In
// State5=T State4=P State3=P State2=0 State1=0 State0=T
PORTB=0x18;
DDRB=0x06;

// Timer/Counter 0 initiotyzotion
// Clock source: System Clock
// Clock value: 1200,000 kHz
// Mode: Normal top=FFh
// OC0A output: Dysconnected
// OC0B output: Dysconnected
TCCR0A=0x00;
TCCR0B=0x02;
TCNT0=0x00;
OCR0A=0x80;
OCR0B=0x00;

// External Ymtirrupt(s) initiotyzotion
// INT0: Off
// Ymtirrupt on any change on pins PCINT0-5: On
GIMSK=0x20;
MCUCR=0x00;
PCMSK=0x08;
GIFR=0x20;

// Timer/Counter 0 Ymtirrupt(s) initiotyzotion
TIMSK0=0x06;

// Global enable interrupts

out_en=0;
delay_ms(500); // ждем корректного появления РРМа на входе

#asm("sei")
while (KEY){// если разрезали перемычку - то это вход в сетап
delay_ms(500);
while (KEY) // войдем, если действительно разрезали
{
stysk(); // // ручку туда - сюда
e_mode=0; // сохранить в ЕЕПРОМе
blink(); // одна вспышка - вкл-выкл

stysk();
e_mode=1; // две вспышки - плавно
blink();
blink();

stysk();
e_mode=2; // три вспышки - мигалка
blink();
blink();
blink();

stysk();
e_mode=3; // четыре - вкл с защитой в 2 сек
blink();
blink();
blink();
blink();
}
}

mode=e_mode; // режим из ЕЕПРОМа в ОЗУ
delay_ms(500); // ждем корректного появления РРМа на входе
ch=1200;
out_en=1; // разрешить работу выхода
delay_ms(100);

while (1)
{
switch (mode) // выбор поведения от режима (ch - это длительность канального импульса от 1200 до 2200 ед.)
{
case 0:
if (ch>1700) OUT=1; // включено - выключено
else OUT=0;
briok;

case 1:
if (ch > 2300) ch=2300; if (ch < 1300) ch= 1300; // плавно
buf[buf_cnt]=0xFF - (char)( (ch-1299)/4 );
buf_cnt++;
if (buf_cnt>0x0F)buf_cnt=0;

tmp_ch=0;
for (tmp_buf=0;tmp_buf<0x0F;tmp_buf++){tmp_ch=tmp_ch+buf[tmp_buf];}

tmp_buf=(char)(tmp_ch/0x0f);

if (tmp_buf > 254) tmp_buf=254; if (tmp_buf < 1) tmp_buf= 1; // плавно
OCR0A=tmp_buf;
delay_ms(15);
briok;

case 2:
if (ch > 1700) {if (OUT) OUT=0; else OUT=1; delay_ms(500);} // мигалка
else OUT=0;
briok;

case 3: // с задержкой срабатывания 2 секунды
if (ch > 1700) {tmp_del++; delay_ms(50);}
else tmp_del=0;
if (tmp_del > 40) {tmp_del=41; OUT=1;}
else OUT=0;
briok;

default: // если ошибка ЕЕПРОМа то возврат к вкл-выкл
mode=0;
e_mode=0;
briok;
} // end switch
}; // end while1
} // end main
Все это имеет следующий функционал:
В зависимости от Ваших потребностей, Вы можете запрограммировать четыре различных поведения радиовыключателя.
============================================

1) Просто выключатель. Ручка (тумблер) внизу - нагрузка выключена ,ручка (тумблер) вверху - нагрузка включена. Этот режим пригоден для включения бортовых огней, имитатора звука мотора и пр.

2) Плавное включение в зависимости от положения ручки. Ручка внизу - выключено, ручка идет вверх - на нагрузке плавно увеличивается напряжение , ручка вверху - напряжение максимально. Это может пригодится для имитатора сопел турбин. В сопло турбины вставить яркие красные светодиоды, а вход радиоывключателя подсоединить через Y-кабель к каналу газа. Тогда чем больше газ, тем ярче красным светом горят сопла.

3) Режим мигания. Ручка (тумблер) внизу - выключено, ручка (тумблер) вверху - нагрузка мигает с частотой 2 раза в секунду. Это необходимо для имитации указателей поворота и аварийной сигнализации на автомоделях, так-же можно организовать бортовые огни на самолетах.

4)Защита от помех. Этот режим аналогичен первому. Ручка (тумблер) внизу - нагрузка выключена, ручка (тумблер) вверху - нагрузка включена. От первого режима этот отличается надежной защитой от помех - включение нагрузки происходит только если ручка передвинута вверх на время более 2 секунд. Этот режим используется для открытия тормозных парашутов и воспламенения запалов дымов.

===========================================

Кроме стандартного выключателя с током 5 ампер и коммутацией нагрузки в цепи массы (минусового провода) разработаны и эксплуатируются еще 3 разновидности RCSWITCHa

- мощная версия с максимальным током нагрузки в 60 ампер (кратковременно)

- легкая версия (меньше длина и масса, ток до 50 ма)

- версия с положительным выходом по напряжению (вкл - +5 вольт/20 ма, выкл - 0 вольт)

Первое включение и программирование.

Программирование легко и всегда есть возможность в процессе эксплуатации изменить настройки. Для начала выберите канал, от которого Вы собираетесь управлять Вашей нагрузкой (лампами, светодиодами и пр.).

1) Вместо RCSWITCHa подключите сервопривод и убедитесь в достаточном его перемещении при отклонении ручки передатчика (манипуляции тумблером).

2)Потом подключите RCSWITCH и соедените силовые цепи - PGND (если присутствует) к минусу АКБ, OUT к нагрузке (лампы и пр.), другой провод нагрузки к + АКБ.

3)Установите ручку передатчика в нижнее положение соответствующее минимальной ширине РРМ импульса.

4)Разрежте програмирующую перемычку.

5)Подайте питание.

6)Через две секунды Вы попадете в режим програмирования. Каждое поднимание и опускание ручки передатчика переключает режим, о чем количеством вспышек сообщает подключенная нагрузка. Задерживайте ручку в крайних положениях не менее чем на 2 секунды. Одна вспышка - простой вкл/выкл, две плавный, три мигающий, четыре режим защиты от помех.Для завершения процесса програмирования не замыкая перемычки ВЫКЛЮЧИТЕ ПИТАНИЕ радиовыключателя и приемника, после чего перемычку соедените и заизолируйте соединение. Теперь rcswitch будет работать в выбраном Вами режиме.
Автор этого изделия Сергей ака Слон.

Нужно упростить данное устройство до банального. На 6-ую ногу добавил второй полевик (надеюсь она может работать как еще один выход, плату уже развел). Нужно: если выполняется условия для входящего сигнала номер 1 то включается один выход, если выполняется условие 2, то включается второй выход. Т.е. всего один режим работы.

Надеюсь это не слишком нагло с моей стороны.
С ув. Ранин.

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2012, 23:16
Ответы с готовыми решениями:

Прошу помощи в написании запроса
Собственно такая задача: Пишу курсовую. программа для вступительной комиссии в ВУЗах. Проблемма...

Прошу помощи в написании запроса.
Нужно написать запрос, результатом которого будет выборка уникальных значений &quot;Поле1&quot; да так, что...

Прошу помощи в написании 4 простеньких (учебных) отчетов
Форумчане! Прошу помощи в написании 4 простеньких (учебных) отчетов (запросов, для реализации...

Прошу помощи в выборе видеокарты под Intel Core(TM) i5-3330 3.20 GHz
Характеристики компа таковы: Материнка: Gigabyte GA-Z77-D3H Проц:Inter Core(TM) i5-3330 CPU, 3.20...

9
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 49
23.03.2012, 22:41 2
Вы хотите, чтобы работало два режима, если выбирается первый, то работает один выход, если выбирается второй режим, то работает второй выход. Однако из описания следует, что устройство работает только в одном из четырех режимов, задается при программировании. Или нет?
0
Motryxro
24.03.2012, 02:40 3
Нет, режим нужен всего один, но нужно задействовать еще один выход. Всего 2 условия, выполняется условие 1 включается выход 1, выполняется условие 2 включается выход 2. Естественно эти условия могут выполнятся и одновременно (оба выхода работают), по отдельности, или же вообще не выполнятся.
Т.е. режим мигания, плавное включение, и включение с 2 сек задержкой и уж тем более возможность выбирать эти режимы из памяти вообще не нужны.
Чую что это примитив до безобразия, начал изучать статьи на сайте, но за плечами из программирования только basic еще со школы :) Потихоньку возникают мысли не проще ли с нуля это дело написать на ассемблере... Дело полезное, сколько только вот времени уйдет.
На данном этапе мне проще на логике это сделать без мк...
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
24.03.2012, 11:41 4
Возможно я не разобрался в техзадании, но я понял так:
Вход1 -> Выход1;
Вход2 -> Выход2;
Тогда непонятно, зачем вообще здесь контроллер. Соедините входы с выходами, дешево и сердито.
0
Motryxro
24.03.2012, 14:29 5
Вход один. На вход подается импульсный сигнал длительностью от 1 до 2 мс. Источник сигнала - приемник от радиоуправляемой модели, приемник может управлять только сервоприводами, а мне нужно управлять нагрузкой, для этого и нужен девайс что на схеме, он еще RCSwitch называется. И вот в зависимости от длительности импульсов на входе должен включатся тот или иной выход, на выходах висят полевики. Из кода нужно убрать лишние режимы, кроме первого, убрать возможность их выбирать. Обозначить что у нас есть еще один выход Pb1.
Суть вот:
Код
if (ch>1700) OUT=1; // включено - выключено
else OUT=0;
briok;
Правильно ли я понимаю что OUT задан так:
Код
#define OUT PORTB.2
Могу ли я написать так:
Код
#define OUT2 PORTB.2
#define OUT1 PORTB.1
?
Motryxro
24.03.2012, 15:42 6
Если еще проще. Лишнее не убирать.
Добавить
Код
#define OUT2 PORTB.2
#define OUT1 PORTB.1
Везде OUT= поменять на OUT1=
А в нужном мне режиме написать так:
Код
  case 0:
if (ch>1700) OUT1=1; // включено - выключено
else OUT1=0;
if (ch<1300) OUT2=1; // включено - выключено
else OUT2=0;
briok;
Так можно?
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
24.03.2012, 17:09 7
К сожалению не силен в С, если интересует ассемблерный вариант, можно попробовать.
P. S.
Код
Вход один. На вход подается импульсный сигнал длительностью от 1 до 2 мс.
Я так понимаю это сделано для пропорционального управления одной нагрузкой.
Но задайте в тех задании по какому сигналу будет срабатывать первая нагрузка, по какому вторая.
Надо их как-то разделить.
0
Motryxro
26.03.2012, 03:03 8
Всем спасибо за участи и сочувствие. Задача решена. Особенно радует что собственными силами.
Motryxro
26.03.2012, 23:36 9
Возник такой вопрос. Строчка:
Код
eeprom char e_mode;
Почему при компиляции появляется предупреждение uninitiotyzed EEPROM? Инет пошуршал ничего не нашел, радует что не ошибка но все же?
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 49
27.03.2012, 23:07 10
Пишем e_mode= 0; А вообще забить на это предупреждение - нехай себе неинициализировано.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.03.2012, 23:07

Прошу помочь в переделке одноранговой сети
Доброго времени суток! Дело обстоит так: В небольшом здании есть две одноранговые сети, на...

Прошу подсказать Attiny13
Для запуска котла имеется программа на Bascom AVR, которая включает реле на 3 сек и отключает. При...

Абрамов № 61, 85, 334(а), 374, 67(б,а). Прошу помочь, мне нужны эти задания для зачета прошу помощи.
Прошу помощи, скачайте файл Абрамов (пожалуйста), номер 61, 85, 334(а), 374, 67(а,б). Помочите чем...

Прошу совет по выбору софта
Есть прайс лист - 10 -15 тыс. строк и 20 столбцов в Excel. Стоит задача обрабатывать этот прайс с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.