ATtiny13A 101 применение

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

HWman Спасибо за обновление инфы!

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

bodriy2014 пишет:

HWman Спасибо за обновление инфы!


Да как-то подзабил на это, давно сюда не заходил.

lohtin
Offline
Зарегистрирован: 22.01.2015

Привет, коллеги. Я чайник :)

Хочу на Аттини13А сделать простой таймер на 4-5 минут для подсчёта моточасов/мотоминут работы ДВС в авто и автовключения вентилятора печки через 5 минут после запуска ДВС:

Алгоритм такой:

1) если U>13.5В = считать моточасы/минуты из ЕПРОМ + начать плюсовать текущее время к ним.
2) если U>13.5В больше 4 минут, то включить реле нормальноразомкнутое (твёрдотельное), которое подаст +14,5 В на вентилятор первой скорости печки.
3) если стало U<13.5В (выключили зажигание) = записать моточасы в ЕПРОМ (для обеспечения питания attiny13а после стабилизатора на 5В поставлю конденсатор на 120мкФ, думаю накомленной в нём энергии хватит на время которое нужно для записи последнего значения МОТОВРЕМЕНИ в ЕПРОМ.

4) если нажата кнопка(по моточасам поменял масло и надо заново считать), то сбросить счётчик времени в ЕПРОМ

 

Сигнализация текущего состояния счётчика времени = на двух светодиодах:

1) зелёный МИГАЕТ, красный НЕ горит - больше 100 часов

2) зелёный горит, красный НЕ горит - больше 125 часов

3) зелёный горит, красный МИГАЕТ - больше 150 часов

4) зелёные горит, красный горит - больше 175 часов

5) зеленый МИГАЕТ, красный МИГАЕТ - больше 200 часов.

6) зелёный МИГАЕТ часто, красный МИГАЕТ часто - больше 225 часов

 

Для определения <> 13,5В  в сети авто планирую использовать делитель на резисторах, напряжение с него - около 3,5В измерять на Тиньке и если напряжение упало  - меньше рассчётного = делать запись мотовремени в ЕПРОМ.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

моя бы сделала на Attiny85 и OLED 0.96. Выглядит лучше и возможностей больше (вывод напряжения + пробега + часов + температуры + сообщений о замене.

Так ведь нагляднее, чем помнить сочетание светодиодов? :)

Почти бортовой компьютьер размером 30х30х12 мм (вместе с МК).

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

lohtin пишет:

Привет, коллеги. Я чайник :)

Хочу на Аттини13А сделать простой таймер....

Привет.Ног хватает

1-светодиод

2-светодиод

3-реле вентилятора

4-кнопка

5-напряжение сети.

Возможно и памяти хватит.

Для таких постов есть ветка.

Joiner
Offline
Зарегистрирован: 04.09.2014

Attiny13 стоит 30р, Arduino Pro Mini 130р. Разница 100р, примерно кружка пива. Вопрос экономии эл.энергии не стоИт. Брать про мини и действовать, хоть с диодом, хоть с экраном, хоть со звонком.

karl2233
Offline
Зарегистрирован: 05.07.2015

dimax пишет:
karl2233, что значит обозначить? Всё уже обозначено. У портов есть номера. У цифровых от 0 до 5, у аналоговых от 0 до 3.
спасибо за разъяснение. я думал у них сквозная нумерация.

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

коллеги, вопрос.

собрал девайс применив лично написаную мега-супер-пупер программу (пост 847).

при загрузке через ИДЕ указал частоту 128 кГц.

01
#define Led 0 // led
02
#define Led 1 // led
03
#define Led 2 // led
04
int analogIn = 2; // input
05
int analogValue = 0; 
06
void setup()
07
{
08
  //pinMode(0, OUTPUT);
09
  //pinMode(1, OUTPUT);
10
  //pinMode(2, OUTPUT);
11
 }
12
void loop()
13
{
14
 if(millis() % 500 == 0) // Каждые 500 мс (% - остаток от деления)
15
   analogValue = analogRead(analogIn);
16
    
17
 if (analogValue > 800)// 800=16,4V;
18
   {
19
   digitalWrite(0, HIGH);
20
   digitalWrite(1, LOW);
21
   digitalWrite(2, LOW);
22
   }
23
 if (analogValue > 700 & analogValue < 799)  // 700=14,4V; 700-799
24
   {
25
   digitalWrite(0, LOW);
26
   digitalWrite(1, HIGH);
27
   digitalWrite(2, LOW);
28
   }
29
 if (analogValue > 650 & analogValue < 699)  // 600=12,8V;650-699
30
   {
31
   digitalWrite(0, LOW);
32
   digitalWrite(1, LOW);
33
   digitalWrite(2, HIGH);
34
   }
35
/if (analogValue < 649)
36
   {
37
   digitalWrite(0, LOW);
38
   digitalWrite(1, LOW);
39
   digitalWrite(2, LOW);
40
 }

но светодиоды светят тускло, хотя резисторы на цифровых ногах должны обеспечивать ток через светодиоды в 20мА, а там и 1 мА нет.

как вроде ШИМ какой-то на выходе вместо логической 1. может я, случайно в коде включил чего-то не того?

ставить транзисторы в качестве ключей конечно выход, но это переделывать довольно напичканую плату.

 

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Открой строки 16,18,20 и будет тебе счастье.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

karl2233.Привет.

Вот подправил по своему, проверил на своей макетке  все работет и сигнализтрует

370 bytes

//для karl2233  c форума, зажигает диоды по мере раста или падения напряжения
int analogValue = 0; 
void setup(){
  pinMode(PB0, OUTPUT);   //Led1
  pinMode(PB1, OUTPUT);   //Led2
  pinMode(PB2, OUTPUT);   //Led3
  }
void loop(){
delay(500);                    //в таких простых программах делей не мешает!
analogValue = analogRead(2); //меряем напряжение на третей ножке PB4
 if (analogValue >= 800){
   PORTB |= (1<<0);
   PORTB &= ~(1<<1); 
   PORTB &= ~(1<<2);}
 if (analogValue >= 700 & analogValue <= 799){
   PORTB &= ~(1<<0);
   PORTB |= (1<<1); 
   PORTB &= ~(1<<2); }
 if (analogValue >= 650 & analogValue <= 699){ 
   PORTB &= ~(1<<0);
   PORTB &= ~(1<<1);
   PORTB |= (1<<2);}
if (analogValue <= 649){
   PORTB &= ~(1<<0);
   PORTB &= ~(1<<1);
   PORTB &= ~(1<<2);}
 }

RomulRS
Offline
Зарегистрирован: 21.02.2016

Сам разобрался

 

karl2233
Offline
Зарегистрирован: 05.07.2015

 bodriy2014, привет и спасибо!

как понимаю, в моём варианте МК всё время фигачил по ножкам как пианист, поэтому и светили тускло, ибо получался ШИМ.

а ты применил секретные(мне по крайней мере для меня) письмена =)

тебе не сложно прокомментировать 12-13-14 строки? а то я как та собака: смысл понимаю, но сказать не могу=)

ещё раз - спасибо!

Zahar, поясни, плз, мысль. ихь бин нихт ферштеен ))

 

 

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

karl2233 пишет:

 bodriy2014, привет и спасибо!

как понимаю, в моём варианте МК всё время фигачил по ножкам как пианист, поэтому и светили тускло, ибо получался ШИМ.

а ты применил секретные(мне по крайней мере для меня) письмена =)

тебе не сложно прокомментировать 12-13-14 строки? а то я как та собака: смысл понимаю, но сказать не могу=)

ещё раз - спасибо!

Zahar, поясни, плз, мысль. ихь бин нихт ферштеен ))

Ничего просто так ни откуда не берется, и знания тоже.

Чтоб понять эти письмена нужно ветку с начала прочесть, в первых постах все есть.

Я многое знал но когда на форум пришел прочел.

Коментирую

PORTB |= (1<<0);   //ставит HIGH на PB0--Заменяет digitalWrite(PB0,HIGH);
PORTB &= ~(1<<1);//ставит LOW на PB1--Заменяет digitalWrite(PB1,LOW);
PORTB &= ~(1<<2);//ставит LOWна PB2--Заменяет digitalWrite(PB2,LOW);

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Поясняю :)

Ты закоментировал эти строки. Зачем, почему?

Ты эти ножки, используеш как три ДИГИТАЛЬНЫХ вывода, значит в setup их надо обьявить.

Иначе МК не понимает что это выход и сигнал проходит не через выходной транзистор а через логику, поэтому не хватает тока.

karl2233
Offline
Зарегистрирован: 05.07.2015

 bodriy2014, спасибо! буду тщательнее курить информацию.

zahar, спасибо! получается я Великий Кукурузо, но невнимательный =)

 

lohtin
Offline
Зарегистрирован: 22.01.2015

bodriy2014 пишет:

lohtin пишет:

Привет, коллеги. Я чайник :)

Хочу на Аттини13А сделать простой таймер....

Привет.Ног хватает

1-светодиод

2-светодиод

3-реле вентилятора

4-кнопка

5-напряжение сети.

Возможно и памяти хватит.

Для таких постов есть ветка.

 

Спасибо!!

По причини МИЗЕРНОГО энергопотребления Тиньки 13а хочу именно на ней собрать таймер - то есть она может работать в авто постоянно от аккумулятора. 

Attiny 85 примерно столько же электричества потребляет? Если с обвязкой минимальной и стабиком 78L05(фото приложил)...

 

1) Не надо будет записывать в ЕПРОМ значение МОТОЧАСА каждый раз при выключении питания.

2) Тинька сможет обесточивать то, что мне надо после отключения питания.

Один светодиод я могу исключить = если через delay сделать мигание:

почтоянно горит/очень редко мигает/средне/часто/ = 4 состояния хватит для 175/150/125/100 моточасов.

1-светодиод

2-реле вентилятора

3-кнопка (сбрасываем счётчик поточасов в ноль)

4-напряжение сети.(отслеживаем что оно больше чем 13.5 В)

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

78l05, если не ошибаюсь, жрёт около 19мА постоянно. Выкидывайте его нахрен. Импульсные DC-DC - наш всё!

P.S. Тут уж лучше свою плату развести, чем дигиспарк юзать)

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Переходи на OLED (см. пост #855), это экономичнее и нагляднее, чем два светодиода. :)

Digispark (Attiny85) жрет в спящем режиме 4,8 мА, в активном режиме и со включенным OLED-дисплеем кушает 19,8 мА.
ProMini потребляет в спящем режиме 3,03 мА, в активном режиме и со включенным OLED-дисплеем кушает 16,7 мА.

Два светодиода (без учета потребления МК) кушают 30 мА.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Кстати для любителей экономи - жк дисплеи по типу нокия 5110 без подсветки кушают не больше 5 миллиампер :) Есть дисплеи вобще с микроамперным потреблением..

lohtin
Offline
Зарегистрирован: 22.01.2015

Олед 300 руб :)

Я LED за 80 руб заказал такой TM1637, пишут что 80мА в активном режиме максимум кушает.

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

Нашёл решение с "временным" питанием для записи данных в ЕПРОМ - подключить питание МК к освещения салона авто - она обесточивается через несколько минут после отключения зажигания авто..

В бардачке такой же светильник, самообесточивающийся - к нему и подключу МК.

Теперь пофиг на милиамперы - МК всё запишет в епром и обесточится потом, при включении зажигания МК считает из Епром и все дела.

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

lohtin Привет!

Какой АКБ стоит на устройстве для учета моточасов?

lohtin
Offline
Зарегистрирован: 22.01.2015

В машину буду ставить :)  12в, 70 Ач...

Сигналка GSM кушает, подозреваю, что 30-40мА и OBD2 мультитроникс UX-7 в покое кушает 5-10мА вроде...

Не вижу смысла на постоянку гонять МК, если можно записать в ЕПРОМ данные о моточасах.

Одна поездка = одна перезапись ЕПРОМ, ресурс кажется 10 тыс перезаписей...

Исходя из того, что нашёл место постотключения питания в авто - то будут мини-про 168ую ставить на таймер и счётчик моточасов, с индикацией на TM1637..

Сорри за офтоп

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Китайские GSM до 2А едят в пике. Так, на всякий случай.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

lohtin пишет:

В машину буду ставить :)  12в, 70 Ач...

Сигналка GSM кушает, подозреваю, что 30-40мА и OBD2 мультитроникс UX-7 в покое кушает 5-10мА вроде...

Не вижу смысла на постоянку гонять МК, если можно записать в ЕПРОМ данные о моточасах.

Одна поездка = одна перезапись ЕПРОМ, ресурс кажется 10 тыс перезаписей...

Исходя из того, что нашёл место постотключения питания в авто - то будут мини-про 168ую ставить на таймер и счётчик моточасов, с индикацией на TM1637..

Сорри за офтоп

В епром моточасы нужно писать чтоб уберечь данные от зависания или потери питания, если ваш МК зависнет или пропадет питание то запись о моточасах останется и вы не забудуте сменить масло.Чтоб на дольше его хватило имеет смысл для записи использовать все ячейки поочередно, так износ распределится на все ячейки.

Что касается енерго потребления то это не ваш случай, я понимаю когда чел от литиевой таблетки собирается 5лет питать датчик на тини13.

Но ваш кислотник имеет саморазряд даже без нагрузки и проверенно он даже не почувствует разницу между тини13 и ардуино pro mini.

Так что делайте на том контроллере с которым работать умеете, не гонитесь за тини13 без уарта ее сложно отлаживать и внутренний тактовый генератор у нее от температуры очень пляшет-будут у вас момто-часы "НА-ГЛАЗ))"

--И чтоб сэкономить на дислее но не потерять в наглядности полученных данных пустите все свободные ноги контроллера на светодиоды и по мере подхода к времени "Х" они будут по одному загораться или тухнуть и наглядно очень и дешевле дисплея в 10раз.

Alexei39
Offline
Зарегистрирован: 26.03.2016

Доброго всем времени.

Вот проектик хотелось бы замутить. Все бы хорошо. Но проскакивает глюк в нем и не как не могу понять вчем же дело. И вертуально этот глюк проскакивает и в железе. 

Вот схемка

это код к ней

#define UP       0
#define DOWN     1
#define SENSOR   3
int crashload =   0;
int z =8;

void setup()
{
  pinMode(UP,    OUTPUT);
  pinMode(DOWN,  OUTPUT);
  crashload = analogRead(SENSOR); 
 
}
 
void loop()
  {
  crashload = analogRead(SENSOR);                       // считываем сигнал превышения тока двигателем 
  if (crashload > 670)  {delay (500); mStop();}           // срабатывание датчика тока 
  if ( digitalRead(2)== LOW) {delay (250); autoUp();}     // нажатие кнопки верх 
  if (digitalRead(4)== LOW) {delay (250); autoDown();}    // нажатие кнопки низ 
  else loop();
  }

void autoUp()
{
  for(int y=0; y<=z; y++)
  {
     for (int x=0; x<=2500; x++)
      {
        digitalWrite(UP, HIGH);
        digitalWrite(DOWN, LOW);
        crashload = analogRead(SENSOR);       
        if (digitalRead(4)== LOW) {delay (250); mStop();}
        if (digitalRead(2)== LOW) {delay (250); up();}
        if (crashload > 670) {delay (500); mStop();}
       }
   }  
  mStop();  
}
void autoDown()
{
  for (int y=0; y<=z; y++)
    {
    for (int x=0; x<=2500; x++)
      {
        digitalWrite(UP, LOW);
        digitalWrite(DOWN, HIGH);
        crashload = analogRead(SENSOR);        
        if (digitalRead(4)== LOW) {delay (250); down();}
        if (digitalRead(2)== LOW){delay (250); mStop();}
        if (crashload > 670) {delay (500); mStop();} 
       }
     }
     mStop();
} 
void up()
{       
   crashload = analogRead(SENSOR);
   digitalWrite(UP, HIGH);
   digitalWrite(DOWN, LOW);
   if (digitalRead(2)== LOW)
    {
      if (crashload > 670) {delay (500); mStop();}     
      up();
    }
       else {mStop();}
}  
void down()
{
   crashload = analogRead(SENSOR);
   digitalWrite(UP, LOW);
   digitalWrite(DOWN, HIGH);
   if (digitalRead(4)==LOW) 
    { 
      if (crashload > 670) {delay (500); mStop();}    
      down();
      }
 else {mStop();}
    } 


void mStop()
    {
    digitalWrite(UP, LOW);
    digitalWrite(DOWN, LOW);
    delay(500);
    loop();
    } 

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

МОже кто нибудь сможет мне помочь в этой биде. Бьюсь уже 2 неделю не как не могу понять вчем тут дело.

Зарание всем спасибо.

xorkrus
Offline
Зарегистрирован: 22.09.2013

Господа, никто не подскажет где можно увидеть код для управления электронным регулятором M62429 или подобным?

Я в упор не понимаю как эти протоколы описывать :(

upd.: Долго искал и ничего не мог найти. Пошел путем codesearch и нашел готовую ардуиновскую библиотеку, так что вопрос снят.

Arduino Library for the NEC/Renesas M62429 Digital Volume Control

karl2233
Offline
Зарегистрирован: 05.07.2015

камерады, прошу не расходится=)

нужна помощь.

int Butt = PB4;// кнопка
int Curr = PB2;// переключение тока
int OnLi = PB1;// включение LI-Io
int OnNi = PB0;// включение Ni-Mh
int Sel = PB3;// порт разрешения считывания состояний кнопки
int regim=1; 
int flag=0;
void setup() {
  pinMode(Curr, OUTPUT);
  pinMode(OnLi, OUTPUT);
  pinMode(OnNi, OUTPUT);
  pinMode(Butt, INPUT);
  pinMode(Sel, INPUT);
}

 void loop()  { 
  if(digitalRead(PB4)==LOW&&flag==0&&(digitalRead(PB3)==LOW))//если кнопка нажата, на РВ3 лог 0 и переменная flag равна 0  
     { 
       regim++;   
       flag=1; 
       if(regim>4)//количество режимов 
         { 
          regim=1;//переключать режимы будем циклично 
         } 
       
     } 
       
     if(digitalRead(PB4)==HIGH&&flag==1)//если кнопка НЕ нажата и переменная flag равна - 1 
        {           
           flag=0;//обнуляем переменную 
        } 
     if(regim==1)//первый режим 
        { 
           digitalWrite(Curr, LOW);// ток "MIN"
           digitalWrite(OnLi, HIGH);// запрет Li-IO
           digitalWrite(OnNi, LOW);// выбран Ni-Mh 
        } 
      if(regim==2)//второй режим 
        {         
           digitalWrite(Curr, HIGH);// ток "MAX"
           digitalWrite(OnLi, HIGH);// запрет Li-IO
           digitalWrite(OnNi, LOW);// выбран Ni-Mh 
        } 
     if(regim==3)//третий режим 
        { 
           digitalWrite(Curr, LOW);// ток "MIN"
           digitalWrite(OnLi, LOW);// выбран Li-IO
           digitalWrite(OnNi, HIGH);// запрет Ni-Mh
        } 
     if(regim==4)//четвертый режим 
        {
           digitalWrite(Curr, HIGH);// ток "MAX"
           digitalWrite(OnLi, LOW);// выбран Li-IO
           digitalWrite(OnNi, HIGH);// запрет Ni-Mh 
        }
        
  } 

проблема в следующем:

когда на порту РВ3 лог 0 - всё работатет как надо, но как только проводок отцепляю, то на выходах(РВ0-В2) появляются наводки и на этих портах паразитные сигналы.

как побороть этот ненужный феномен?

что интересно, заливал программу в Ардуино, так там всё как надо работало.

 

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Подтяжки нужны на PB3, PB4

karl2233
Offline
Зарегистрирован: 05.07.2015

на РВ4 стоит.

на РВ3 ставил и на плюс и на минус  -толку ноль. как только РВ3 отрываю от общего, то РВ0-РВ2 какбы полуоткрыты.

и при заливке в Ардуино порт РВ3 и без подтяжек работает как надо.

а тут не алё (((

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

karl2233 Ресет к VCC подтянули?

karl2233
Offline
Зарегистрирован: 05.07.2015

да, стоит 10к

когда РВ3 на общем(лог 0) то всё как надо переключает.

но как только отрываю от общего и замыкаю на +5В, то РВ0-РВ2 в каком-то среднем состоянии и происходит переключение, а не остаётся предыдущее состояние о_О

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

karl2233 пишет:

да, стоит 10к

когда РВ3 на общем(лог 0) то всё как надо переключает.

но как только отрываю от общего и замыкаю на +5В, то РВ0-РВ2 в каком-то среднем состоянии и происходит переключение, а не остаётся предыдущее состояние о_О

замени это безобразие

int Butt = PB4;

на

#define  Butt  PB4

везде

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

так попробуй

#define Butt  PB4    // кнопка
#define Curr  PB2  // переключение тока
#define OnLi  PB1   // включение LI-Io
#define OnNi  PB0   // включение Ni-Mh
#define Sel   PB3   // порт разрешения считывания состояний кнопки
int regim=1; 
int flag=0;
void setup() {
  pinMode(Curr, OUTPUT);
  pinMode(OnLi, OUTPUT);
  pinMode(OnNi, OUTPUT);
  pinMode(Butt, INPUT);
  pinMode(Sel, INPUT);
}

 void loop()  { 
  if(digitalRead(Butt)==LOW&&flag==0&&(digitalRead(Sel)==LOW))//если кнопка нажата, на РВ3 лог 0 и переменная flag равна 0  
     { 
       regim++;   
       flag=1; 
       if(regim>4)//количество режимов 
         { 
          regim=1;//переключать режимы будем циклично 
         } 
       
     } 
       
     if(digitalRead(Butt)==HIGH&&flag==1)//если кнопка НЕ нажата и переменная flag равна - 1 
        {           
           flag=0;//обнуляем переменную 
        } 
     if(regim==1)//первый режим 
        { 
           digitalWrite(Curr, LOW);// ток "MIN"
           digitalWrite(OnLi, HIGH);// запрет Li-IO
           digitalWrite(OnNi, LOW);// выбран Ni-Mh 
        } 
      if(regim==2)//второй режим 
        {         
           digitalWrite(Curr, HIGH);// ток "MAX"
           digitalWrite(OnLi, HIGH);// запрет Li-IO
           digitalWrite(OnNi, LOW);// выбран Ni-Mh 
        } 
     if(regim==3)//третий режим 
        { 
           digitalWrite(Curr, LOW);// ток "MIN"
           digitalWrite(OnLi, LOW);// выбран Li-IO
           digitalWrite(OnNi, HIGH);// запрет Ni-Mh
        } 
     if(regim==4)//четвертый режим 
        {
           digitalWrite(Curr, HIGH);// ток "MAX"
           digitalWrite(OnLi, LOW);// выбран Li-IO
           digitalWrite(OnNi, HIGH);// запрет Ni-Mh 
        }
        
  } 

 

karl2233
Offline
Зарегистрирован: 05.07.2015

всё равно - как только на РВ3 не лог 0, то фигня получается (((((

что-то я с разрешением считывания показаний кнопки (порт РВ3) намудрил.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

karl2233 пишет:

всё равно - как только на РВ3 не лог 0, то фигня получается (((((

что-то я с разрешением считывания показаний кнопки (порт РВ3) намудрил.

Подтяжки все есть, порты тоже правьльно-значит логика.

переделывай-упрощай.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

И вот это всё безобразие:

pinMode(Curr, OUTPUT);
pinMode(OnLi, OUTPUT);
pinMode(OnNi, OUTPUT);
pinMode(Butt, INPUT);
pinMode(Sel, INPUT);

digitalWrite(Curr, LOW);// ток "MIN"
digitalWrite(OnLi, HIGH);// запрет Li-IO
digitalWrite(OnNi, LOW);// выбран Ni-Mh

заменить на прямую работу с портами:

DDRB |= (1<<PB2);
DDRB |= (1<<PB1);
DDRB |= (1<<PB0);
DDRB &= ~(1<<PB4);
DDRB &= ~(1<<PB3);

PORTB &= ~(1<<PB2);
PORTB |= (1<<PB1);
PORTB &= ~(1<<PB0);

Остальные режимы сами перепишите.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Может просто кнопкой режимы перебирать, по кругу?

karl2233
Offline
Зарегистрирован: 05.07.2015

Jeka_M, думаю что проблема в программе, а не обращениях к портам.

Видать где-то надо прописать состояние портов при лог 1 на  РВ3.

но вот где?

bodriy2014, так именно по кругу и происходит перебор.

мне нужно что б при лог 0 на РВ3 кнопки изменяла состояния портов, а при лог 1 кнопка не могла изменить состояние портов и оно оставалось бы таким, каким было на момент прихода лог 1.

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Походу проблема в том, что вместо PB0-PB4 надо указывать ноги дуины A0-A7, B0-B13

 

karl2233
Offline
Зарегистрирован: 05.07.2015

Andy, в Ардуино код работает как надо.

но при заливке в Тини13 начинаются траблы о_О

проблема в том, что программа не понимает что делать при состоянии РВ3 отличном от лог 0.

я так думаю(с)

надо что-то вроде такого

else(digitalRead(Sel)==HIGH);//если на РВ3 лог 1 то...

но что дальше делать - хз

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

karl2233 пишет:

....

bodriy2014, так именно по кругу и происходит перебор.

мне нужно что б при лог 0 на РВ3 кнопки изменяла состояния портов, а при лог 1 кнопка не могла изменить состояние портов и оно оставалось бы таким, каким было на момент прихода лог 1.

В моем понимании по кругу выглядит проще))

Если не почините вечером могу набросать, счас еду.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

karl2233 пишет:

Jeka_M, думаю что проблема в программе, а не обращениях к портам.

Согласен. Это был совет, как более эффективно экономить память, которой у ATtiny13A не так много. Хоть у Вас программа и небольшая, лучше учиться сразу.

karl2233
Offline
Зарегистрирован: 05.07.2015

Jeka_M, да, я это понял. спасибо! 

но мне не понятно что означают применённые операторы: я вижу что они тождественны моей записи, но значки "|", "&", "~"в данном контексте как китайская грамота для меня =)

bodriy2014 пишет:

В моем понимании по кругу выглядит проще))

Если не почините вечером могу набросать, счас еду.

и не сомневаюсь! )))))) но тут и с таким вариантом засада получилась.

спасибо!

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

karl2233 пишет:

но мне не понятно что означают применённые операторы: я вижу что они тождественны моей записи, но значки "|", "&", "~"в данном контексте как китайская грамота для меня =)

Это битовые операции.

| - OR - ИЛИ, & - AND - И, << - битовый сдвиг влево, ~ - инверсия.

http://arduino.ru/forum/programmirovanie/bitovye-operatsii

https://www.youtube.com/watch?v=IUBQqY5yX24&index=2&list=PLBLtydguylgDUt...

https://www.youtube.com/watch?v=hKdNUO7Zmjg&index=7&list=PLBLtydguylgDUt...

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

karl2233 пишет:

....

мне нужно что б при лог 0 на РВ3 кнопки изменяла состояния портов, а при лог 1 кнопка не могла изменить состояние портов и оно оставалось бы таким, каким было на момент прихода лог 1.

Набросал на смартфоне, проверить не где, по твоим условиям.

#define Butt  PB4    // кнопка
#define Curr  PB2  // переключение тока
#define OnLi  PB1   // включение LI-Io
#define OnNi  PB0   // включение Ni-Mh
#define Sel   PB3   // порт разрешения считывания состояний кнопки
byte regim=1; 
void setup() {
  pinMode(Curr, OUTPUT);
  pinMode(OnLi, OUTPUT);
  pinMode(OnNi, OUTPUT);
  pinMode(Butt, INPUT);
  pinMode(Sel, INPUT);
}

 void loop()  { 
  if(digitalRead(Sel)==LOW){//если лог 0 тогда можно перебирать режимы
    if(digitalRead(Butt)==HIGH){
      delay(5); //дребезг защите можно убрать
      regim++;
      if(regim==5){regim=1;}//ограничение количества режимов
    }
  }
  //то что ниже не трогал  
     if(regim==1)//первый режим 
        { 
           digitalWrite(Curr, LOW);// ток "MIN"
           digitalWrite(OnLi, HIGH);// запрет Li-IO
           digitalWrite(OnNi, LOW);// выбран Ni-Mh 
        } 
      if(regim==2)//второй режим 
        {         
           digitalWrite(Curr, HIGH);// ток "MAX"
           digitalWrite(OnLi, HIGH);// запрет Li-IO
           digitalWrite(OnNi, LOW);// выбран Ni-Mh 
        } 
     if(regim==3)//третий режим 
        { 
           digitalWrite(Curr, LOW);// ток "MIN"
           digitalWrite(OnLi, LOW);// выбран Li-IO
           digitalWrite(OnNi, HIGH);// запрет Ni-Mh
        } 
     if(regim==4)//четвертый режим 
        {
           digitalWrite(Curr, HIGH);// ток "MAX"
           digitalWrite(OnLi, LOW);// выбран Li-IO
           digitalWrite(OnNi, HIGH);// запрет Ni-Mh 
        }
        
  } 

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Вариант два

Занес режимы в условие, чтоб передергивать ножки только по нажатию.

#define Butt  PB4    // кнопка
#define Curr  PB2  // переключение тока
#define OnLi  PB1   // включение LI-Io
#define OnNi  PB0   // включение Ni-Mh
#define Sel   PB3   // порт разрешения считывания состояний кнопки
byte regim=1; 
void setup() {
  pinMode(Curr, OUTPUT);
  pinMode(OnLi, OUTPUT);
  pinMode(OnNi, OUTPUT);
  pinMode(Butt, INPUT);
  pinMode(Sel, INPUT);
}

 void loop()  { 
  if(digitalRead(Sel)==LOW){//если лог 0 тогда можно перебирать режимы
    if(digitalRead(Butt)==HIGH){
      delay(5); //дребезг защите можно убрать
      regim++;
      if(regim==5){regim=1;}//ограничение количества режимов
      if(regim==1)//первый режим 
        { 
           digitalWrite(Curr, LOW);// ток "MIN"
           digitalWrite(OnLi, HIGH);// запрет Li-IO
           digitalWrite(OnNi, LOW);// выбран Ni-Mh 
        } 
      if(regim==2)//второй режим 
        {         
           digitalWrite(Curr, HIGH);// ток "MAX"
           digitalWrite(OnLi, HIGH);// запрет Li-IO
           digitalWrite(OnNi, LOW);// выбран Ni-Mh 
        } 
     if(regim==3)//третий режим 
        { 
           digitalWrite(Curr, LOW);// ток "MIN"
           digitalWrite(OnLi, LOW);// выбран Li-IO
           digitalWrite(OnNi, HIGH);// запрет Ni-Mh
        } 
     if(regim==4)//четвертый режим 
        {
           digitalWrite(Curr, HIGH);// ток "MAX"
           digitalWrite(OnLi, LOW);// выбран Li-IO
           digitalWrite(OnNi, HIGH);// запрет Ni-Mh 
        }
    }
  }
} 

 

karl2233
Offline
Зарегистрирован: 05.07.2015

неа... первый работает хуже чем мой скетч  - при лог 0 на РВ3 на портах РВ0-РВ2 есть хаотические сигналы... а при лог 1 на РВ3 кнопка опрашивается.

второй щас проверю... нет, не работатет - на портах РВ0-РВ2 хаотические сигналы при нажатии.

думаю что надо в мой скетч(он хоть при лог 0 на РВ3 работает как надо) ввести условие    else(digitalRead(Sel)==HIGH);//если на РВ3 лог 1 то... 

ведь проблема именно в том, что когда лог 1 на РВ3 то программа глючит.

но как сказать МК что при лог 1 на РВ3 кнопку НЕ опрашивать и состояние портов НЕ изменять?

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

karl2233 пишет:

неа... первый работает хуже чем мой скетч  - при лог 0 на РВ3 на портах РВ0-РВ2 есть хаотические сигналы... а при лог 1 на РВ3 кнопка опрашивается.

второй щас проверю... нет, не работатет - на портах РВ0-РВ2 хаотические сигналы при нажатии.

думаю что надо в мой скетч(он хоть при лог 0 на РВ3 работает как надо) ввести условие    else(digitalRead(Sel)==HIGH);//если на РВ3 лог 1 то... 

ведь проблема именно в том, что когда лог 1 на РВ3 то программа глючит.

но как сказать МК что при лог 1 на РВ3 кнопку НЕ опрашивать и состояние портов НЕ изменять?

странно!(

схему в студию

karl2233
Offline
Зарегистрирован: 05.07.2015

вот схема. эьто я зарядно-разрядно для ЛиИо и НиМг делаю на Атмеге 8

узел на Тини13 нужен для выбора типа батареи и изменения тока зарядки.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

karl2233 пишет:

вот схема. эьто я зарядно-разрядно для ЛиИо и НиМг делаю на Атмеге 8

узел на Тини13 нужен для выбора типа батареи и изменения тока зарядки.

PB3 не подтянуто к VCC

подтяни програмно

pinMode(Sel,INPUT_PULLUP);

 

karl2233
Offline
Зарегистрирован: 05.07.2015

да я цеплял резистор, а программно не получается - пишет  "was not declared in scope"