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

minamonra
Offline
Зарегистрирован: 18.06.2014

Спс, сейчас попробую, тут еще вот такую штуку нашел:

#include <util/delay.h> 

volatile unsigned int tachBuf; 
unsigned long tachValue; 

ISR(TIMER1_CAPT_vect) 
{  
    TCNT1 = 0;  
    tachBuf = ICR1+120; 
} 
//******************************************************************** 
void setup()     
{   
   pinMode(8, INPUT);  //Вход частотомера для импульсов TTL 
   pinMode(6, OUTPUT);//выход ШИМ для тестирования частотомера 
   TCCR0B = TCCR0B & 0b11111000 | 1;//частота ШИМ 62500Гц 
   analogWrite(6, 128);  //Запустить ШИМ 
   digitalWrite(8, HIGH); // включить подтяжку входа 
   Serial.begin(115200); 
   TIM_Init(); 
  _delay_ms(300); 
}   
//******************************************************************** 
void loop()     
{ 
  cli();   
  tachValue =16000000/tachBuf; 
  Serial.print("freq="); 
  Serial.println(tachValue,DEC); 
  sei(); 
  _delay_ms(300); 
}    
//******************************************************************** 
void TIM_Init(void) 
{ 
   TIMSK1=(1<<ICIE1);  
   TCCR1A=(0<<COM1A1)|(0<<COM1A0)|(0<<WGM11)|(0<<WGM10);   
   TCCR1B=(1<<ICNC1)|(1<<ICES1)|(0<<WGM13)|(0<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);  
   TCNT1 = 0; 
}

 

вроде частоту измеряет...

...функцией бы ШИМ сообразить для ПН в принципе не нужно большого разнообразия частот, да и точность тоже +/- 2000Гц... не сильно страшно.

 

minamonra
Offline
Зарегистрирован: 18.06.2014

Во времена, раньше чтобы частотомер сообразить простейший - целая эпопея... а тут вот нарыл FreqCounter, подцепил к I2C дисплею ... и пользуйся... даже преамп не нужен, ну если знаем точно куда цепляемся.

 

minamonra
Offline
Зарегистрирован: 18.06.2014

HWman, извиняюсь, код рабочий, разобраться надо, другой вопрос на какой частоте у меня это происходит... :_(

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

У кого непонятки с задержками - есть решение, используйте не родной шаблон типа:

 

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly: 
  
}

А вот такой:

 

#include <avr/io.h> // библиотека ввода вывода
// подключать по идее обязательно
// тут можно подключить что-то или настроить директиву #define
// ...

int main( void ) // аналог void setup() 
{
  // тут инициализируем что нам нужно
  //
  //...
  //
  // символ "}" не ставим, его нужно будет поставить в конце
  while(1){ // аналог void loop()
  // тут крутиться вечный цикл
  // прямо таки как тут coub.com/view/1k3bw
  //
  //...
  //
} //закрываем while(1)
  return 0; //честно так и не понял зачем тут возвращать 0
} // закрываем int main()

// кстати таким от образом можно сэкономить десяток другой байт
// для тини13 это как никак актуально
// ещё рекомендую ознакомится:
// nuzhen-sovet.ru/content/optimiziruem-kod-v-arduino

Лично мне помогло разрулить непонятки с этим проектом:
http://razniepodelki.blogspot.com/2014/08/attiny13-arduino.html

 

ЗЫ 404 сообщение Гг

leshak
Offline
Зарегистрирован: 29.09.2011

Ну, на самом деле это "близко" к "родному шаблону".

ВОт так он выглядит в 

hardware\arduino\cores\arduino\main.cpp 

#include <Arduino.h>

int main(void)
{
	init();

#if defined(USBCON)
	USB.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
} 

Как видим разница только в вызове init() и обработки событий Serial-ла.
Его можно найти в wiring.c  - там можно увидеть настройку таймеров и т.п. мдени.
Возможно что-то из этих "настроек" вам и мешало.
С другой стороны, если вы "отказались" от этого, то можно ожидать, что некоторые стандартные функции типа delay(), millis() - могут начать глючить. Ну и сооотвественно с serial могут быть сюрпризы. Вообщем "все дальше делать самому".

//честно так и не понял зачем тут возвращать 0
21 // закрываем int main()

Ну если мы объявили что фунция возвращает int, то "правило хорошего тона" - все-таки делать return 0, хотя бы  "с чем нибудть".

Иначе любой статический анализатор начнет нам ошибки кидать, что типа "обещали вернуть, а не вернули".

А зачем "обещали"?  А думаю "так исторически сложилось". Что main() что-то возвращает (код возврата). Когда на компе программы запускали, и предполагалось, что операционка должа как-то узнать "нормально програма завершилась, или что-то у нее случилось".
В контроллере - это конечно не имеет смысла. Некому смотреть этот "код возврата". Тем более что функция main() у нас никогда не заврешится, и до этого return - дело никогда не дойдет. И  что вы там вернете - ни на что не влияет.
Так что понять "зачем?" - вы никогда не сможете. Потому что ответ: низачем. Так исторически сложилось.

 

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Здравствйте. Не могу разобраться с прерываниями, не выходит ничего. Обращаюсь, в основном, к HWman`у с просьбой подробнее описать работу с прерываниями PCINT. Я пробовал сшить что-то из примеров его кода, но не смог сменить бит порта. Мне нужно на PB3 и PB4. Привожу свой скетч, вся работа с пррываниями находится до loop, выделил места настройки прерывания комментариями, подскажите, что я делаю не так. 

#include <avr/interrupt.h> // нужна


byte bport = 0b111;
byte Z, k0, k1;
volatile byte stay; 
boolean changebit=1;

void InitINT0() // Инициализация прерываний
{
  MCUCR =_BV(ISC01) | _BV(ISC00);
  GIMSK = _BV(INT0);
  sei();
}

void setup(){
  DDRB = 0B00111;
  PORTB=0B11000;
  InitINT0();   //тоже от прерываний
  stay = 5;
}


ISR(PCINT_vect){ // прерывание по вектору PCINT 
 // if(!(digitalRead(3))){
    stay++;
    if(stay>9) {
      stay=1; 
    } 
    changebit=1;
 // }
}

ISR(PCINT4_vect){ // прерывание по вектору PCINT 
  if(!(digitalRead(4))){
    stay=stay-1;
    if(stay<1){
      stay=9;
    }
    changebit=1;
  }
} 


void loop(){

  if(changebit) { 
    changerFun(); 
  }

}




void changerFun(){
  changebit=0;
  digitalWrite(0, 0);
  digitalWrite(1, 0);
  digitalWrite(2, 0);

  if(stay<8) {
    toB(stay);
  } 


  if(stay==8) {
    while(1){
      for(Z; Z<=7; Z++){

        toB(Z);
        delay(700); 
      } 
      Z=0; 
    }
  } 

if(stay==9) {
  k0=255;
  k1=0;
  digitalWrite(2, HIGH);
  while(1){
  
  for(k1; k1<255; k1++) {
    analogWrite(0, k0);
  analogWrite(1, k1);
  delay(10); }
    for(k0; k0>0; k0=k0-1) {
    analogWrite(0, k0);
  analogWrite(1, k1);
  delay(10); }
   for(k0; k0<255; k0++) {
    analogWrite(0, k0);
  analogWrite(1, k1);
  delay(10); }
      for(k1; k1>0; k1=k1-1) {
    analogWrite(0, k0);
  analogWrite(1, k1);
  delay(10); }
    
    
    
  }
  }
  
 
}



void toB(byte x){
  PORTB = PORTB&(0B11111000);
  PORTB = PORTB|x;
}

 

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

Да я сам нагуглил какой-то пример. Пока я до прерываний ещё не дошёл.

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Блин, жалко. Останутся рыбы(делал контроллер RGB ленты для аквариума) без света...

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

NikitosZs пишет:

Блин, жалко. Останутся рыбы(делал контроллер RGB ленты для аквариума) без света...

рыб жалко

http://avrbasiccode.wikispaces.com/

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Я так понял, он использует библиотеку, которую скачать не получается из-за побитой ссылки(востановить не смог я), и я так и не понял что значит: 

GIMSK = _BV (INT0); // int - Enable external interrupts int0
 MCUCR = _BV (ISC01); // int - INT0 is falling edge

Особенно _BV и то, как работать с маской. "INT0 is falling edge"  меня совсем в тупик ставит, как он настртраивает прерывание, которое всегда имеет Any logical change... 

 

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

Вот тут хоровые примеры http://sotvorimvmeste.ru/viewtopic.php?f=36&t=74 в т.ч. и по прерываниям. 

А рыб чего жалко? Вегетативные циклы?

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Утром встаю, свет не горит в аквариуме, включаю и кормлю. Спать ложусь, а в аквариуме светло - кормлю и выключаю свет. Без света забываю. Раньше там стояла люминесцентная, дохла каждый месяц, старую конструкци. рахобрал, а новую не собрал....

Нашёл на форуме некую библиотеку для работы с PCINT, но в ней используется запись в регистры, которые то ли отсутствуют в attiny13, то ли IDE капризнечает. При выборе платы, как UNO - компилируется, при выборе attiny13 нет.

Удивительно, но я так и не нашёл прерывания, которые можно взять как есть и всунуть в IDE, но смог сгибридизировать пару кодов и получить следующий код. Все строки, косающиеся прерываний, откомментировал.

// NikitosZs PCINT ( pin change interrupt) sample
void setup(){
  DDRB = 0B00111;
  PORTB=0B11010; 

  GIMSK = 0b00100000;  // Не изменять!!!! Разрешение прерываний PCINTn 
  PCMSK = 0b00001000;  // Выставялем макску порта B, на пины которые срабатывает прерывание
  /* PCMSK = 0b00010000; Считаем с правого конца начиная с нуля
   1 стоит на месте четвёртого бита, значит при изменении значения на PB4 вызовется прерывание 
   PCMSK = 0b00000110; // по изменению на PB1 ИЛИ PB2 вызовется одно и то же прерывание */
  sei();  // Активируем  прерывания
  // cli(); // Деактивируем прерывания, например, для предотвращения дребезга
}

ISR (PCINT_vect)  // Функция обработки прерыванию ПО ЛЮБОМУ ИЗМЕНЕНИЮ состояния пина
{
  /* Тут можно проверить состояние пина
   Если на нём 0, то было падение( Falling ) 
   Если на нём 1, то случилось возрастание ( RISING )
   Без проверки условия получим прерывание по любому изменению ( CHANGE )
   Если задана маска на несколько пинов прерывания, то выполнить проверку на пин  */ 

    PORTB = PORTB&(0B11111000);
  PORTB = PORTB|101;
}

void loop(){ 
}

 

stels
Offline
Зарегистрирован: 03.01.2014

я может скажу какую глупость

но на тини12  есть ардуина? 

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Решил собрать свой драйвер для карманного фонарника на мощном светодиоде, столкнулся с такой гадостью, как зависание микроконтроллера attiny13. Питание от литиевого элемента 18650. Вочдог не то, зависает через 5-50 секунд во время смены яркости свечения. Можно как-нибудь переставить фьюзбиты или что-нибудь придумать? Может, если частоту снизить МК будет постабильней? 

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

дубль.

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

stels пишет:

я может скажу какую глупость

но на тини12  есть ардуина? 


Я не видел, спросите у гугла.

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

NikitosZs пишет:

Решил собрать свой драйвер для карманного фонарника на мощном светодиоде, столкнулся с такой гадостью, как зависание микроконтроллера attiny13. Питание от литиевого элемента 18650. Вочдог не то, зависает через 5-50 секунд во время смены яркости свечения. Можно как-нибудь переставить фьюзбиты или что-нибудь придумать? Может, если частоту снизить МК будет постабильней? 


Уменьшение рабочей частоты увеличивает рабочий диапазон питания МК(в нижнюю сторону) и уменьшает энергопотребление.
Для всяких фонариков и прочего хватит частоты 1.2 МГц.

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

HWman пишет:

Для всяких фонариков и прочего хватит частоты 1.2 МГц.

Да мне и 16кГц хватит, 128кГц с делителем на 8, уже проверил, работает! Блинк ускоренный гонял пол часа, вроде не было перезагрузки, но вылилось некоторое неудобство: Не прошивается ну вот ничем на частоте такой. Менял скорость загрузки прошики, но не удалось, даже на 500Гц, хотя фьюзы пишутся читаются. Пока что вышел из этого так: Шью, когда МК на частоте 9,6Мгц, затем меняю фьюзы и МК работает с той же прошивкой, но на частоте 16кГц. Конечно же, я переопределил в boards.txt как частоту, так и скорость загрузки и фьюзы(на всякий случай) для 16кГц, переписал wiring.c , т.к IDE жаловалась на то, что нет такой частоты, как 16кГц, 128 минимум! Переписал там, какие то коэфициенты подогнал, но IDE выдаёт: 

avrdude: error: programm enable: target doesn't answer. 1 
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.
И на этом я застрял. Фьюзы читаются через Khazam и  AVR8 Burn-Mat v2. Программатор USB ASP с последней прошивкой.
HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Я пробовал шить на частоте 128КГц, там пишет в файле boards.txt чем это кончилось, если Вы используете предложенные мною файлы.

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Использую Ваше ядро, но не то, на которое ссылка, а ту версию, которю Вы выложили не так давно. Не понял, кто и что пишет в файле boards.txt? 

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

Там в boards.txt я написал что на частоте 128 кГц тиньки лочатся почему-то, у меня уже даже целая колекция насобиралась.

На фото зачатие ATtiny2313.


Вот как даже можно:

https://www.youtube.com/watch?v=-lpd3ro48Go

 

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Скачайте Khazama AVR Programmer, обновите ПО USB ASP до последней версии (если каза не пожалуется на то, что не может быть выбрана скорость программирования, то и не нужно обновлять), выберите настройки и частоту задайте в ручную на 1-4 кГц, далее пункт про фьюз биты, Read All, ну а если оно их считало, то и запишет, т.к в начале проверяется ID микроконтроллера. Может получится оживить. 

Не знаете других дешёвых AVR, но с более широким набором интерфейсов? Может, чуть больше ног, но дешевые..... Та же ATtiny2313 стоит как ATmega8...

 

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

/*Скачайте Khazama AVR Programmer, обновите ПО USB ASP до последней версии (если каза не пожалуется на то, что не может быть выбрана скорость программирования, то и не нужно обновлять), выберите настройки и частоту задайте в ручную на 1-4 кГц, далее пункт про фьюз биты, Read All, ну а если оно их считало, то и запишет, т.к в начале проверяется ID микроконтроллера. */

От бы у меня был ещё той USB ASP...
/*
Та же ATtiny2313 стоит как ATmega8...*/

Я в данном случае не вижу иного выхода как юзать мегу 8-ю.

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

А мегу8 слишком жалко, потому что не использую весь её потенциал. Замкнутый круг. 

Не думали купить USB ASP? Стоит же копейки. Или сделать самому, на той же меге8.

 

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

А я тут плюшками балуюсь...

MaksMS
Offline
Зарегистрирован: 11.03.2013

Да ATtiny2313 стоит как ATmega8 , а ещё в ATtiny2313 нет АЦП и всего 2 кб..

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

HWMan, dывод Reset придётся отдать...

MaksMS, о чём и речь.

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

NikitosZs пишет:

HWMan, dывод Reset придётся отдать...

MaksMS, о чём и речь.


Зато используются почти все ресурсы МК.

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Как думаете, реально ли на ATtiny13 сделать устройствос непосредственным юзб(типа v-USB), что б эмулировался COM порт, и данные, отправленные в этот порт немного обрабатывались и заливались в сдвиговый регистр? Меня, лично, волнует не столько вес, т.к фиг с ним, можно и mega8 использовать, сколько эмуляция comпорта через виртуальный usb, который бы использовался на том же микроконтроллере. 

Есть ПО котороё шлёт данные в выбранные com порт(цветомузыка), для обработки приходится использовать usb-uart, затем мк ещё, и сдвиговые регистры. Хочется сократить всё до 1 микросхемы подороже, либо 1 по дешевле и со сдвиговыми регистрами.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

конечно можно. куча устройств работает

http://www.obdev.at/products/vusb/prjdata.html

 

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

Как считаете, стоит ли данный проект статьи на хабре?

https://www.youtube.com/watch?v=9QC27o6uLzE

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

почему бы и нет. но задача такая узкая. малопригодная. кроме разве что uart на тиньке

смысл если стоит 1602 ставить тиньку 13 а не мегу8 например и извращаться. ведь после программирования повторно ничего не зальешь. reset ведь используется как пин

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

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

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

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

Ещё только что пришла мысль использовать BOD для перезагрузки МК...

Походу бредовые идеи... не так ли?

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Подключить питание МК через транзистор, управляемый ресет пином программатора? Вы об этом? Интересно, но вот будет ли это то же самое, что и ресет. Это же не ардуина, которая ждёт загрузки определённое время после включения. 

На ютьюбе посмотрел видюшки, есть много на тему сброса фьюзов у tiny? притом любых. Типа высоковольтный фьюз программатор.

Заинтересовали, давайте ваш проект. Буду тестировать.

 

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

Какой проект? Тини лсд юарт?

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Да, его. Что б если уж залочится тинька, то хоть что-то делает пусть.

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

http://vk.com/doc256435878_327375100

 

Там только хекс файл и схемка в протеусе.

Фьюзы давать или сами разберётесь?
Кстати, это будет более правильная схема:

Не рекомендую повторять если нету ВВ программатора, кстати я так и не собрал реальное устройство так что не знаю вообще заработает или нет, иногда бывает что в протеусе работает а в реале нет.

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

Кстати, в железе я не тестил так что не знаю что будет.

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Это я понял, не пугает. Ночью посижу, наверное.

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

NikitosZs пишет:

...Это же не ардуина, которая ждёт загрузки определённое время после включения...

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

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Кто-нибудь проверял https://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=8#comment-77641 прерывания эти? У меня раньше работало, а сейчас нет

 

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

Нагуглил вот такую ссылку, может кто из опытных посмотрит?
http://www.mikrocontroller.net/topic/73196
Ссылка на английском.

Илья73
Offline
Зарегистрирован: 06.09.2013

А как можно с тиньки отправить пару тройку байт на такой модуль. Вроде бы функция shiftOut() подходит, но там два выхода задействованы dataPin, clockPin . А на передатчик  можно завести только один провод, а библиотека VirtualWire для тиньки не катит вроде.

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Илья73, как раз занимаюсь этим, но... Немного подзабил. Попробуйте написать свою библиотеку для работы с этими передатчиками. Я пробовал кодировать сигнал длительностью высокого и низкого уровня, получал около 5 различимых сигналов, т.е некая пятиричная система, но нужен внешний кварц, а то данные сильно уж "размытые" получаются. 

Илья73
Offline
Зарегистрирован: 06.09.2013

Надо будет пробовать. Дождусь программатора и займусь. А то не удобно будет дергать UNO для заливки скетча на тиньку а потом в тот же UNO заливать скетч приемника. А пока покурю гугл, да и может у кого мысли какие появятся.

MaksMS
Offline
Зарегистрирован: 11.03.2013

Все уже давно все придумано..Используйте протокол пультов RCswitch

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

незнаю заметили или нет, вышла новая версия ядра  - 19

http://sourceforge.net/projects/ard-core13/files/

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

И снова та же история с ШИМ.
wiring_analog.c

void analogWrite(uint8_t pin, uint8_t val){
	pinMode(pin, OUTPUT); //For compatibility - STUPID! 
	if(val==0){ //Handle Off condition
		digitalWrite(pin,0);
	} else if(val == 255){ //Handle On condition
		digitalWrite(pin, HIGH);
	} else { //Otherwise setup the appropriate timer compare
		if(pin == 1){
			TCCR0A |= (1 << COM0B1);
			OCR0B = (val / 4) * 4;
		}
		if(pin == 0){
			TCCR0A |= (1 << COM0A1);
			OCR0A = val;
		}
	}
}

 

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

Пока тестирую, присоединяйтесь.