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

Frolv
Offline
Зарегистрирован: 31.08.2015

Схема как в этой статье http://hardname.narod.ru/servotester.html , код ниже, но выдает ошибку..

  This report would have more information with

  "Show verbose output during compilation"
  enabled in File > Preferences.
Arduino: 1.0.6 (Windows 7), Board: "Attiny13 1.2 MHz (default)"
Fade.ino:2:22: error: iotiny13.h: No such file or directory
Fade:24: error: expected constructor, destructor, or type conversion before 'void'
Fade:23: error: expected constructor, destructor, or type conversion before 'void'
 
 
 
сам код.
#define ENABLE_BIT_DEFINITIONS
#include "iotiny13.h"
//SERVOTESTER V 1.0
// 1 PB5 (PCINT5/RESET/ADC0/dW) 
// 2 PB3 (PCINT3/CLKI/ADC3)            button_sweep  - sweep on trigger
// 3 PB4 (PCINT4/ADC2)                 button_middle - pulse width 1.5mS
// 4 gnd
// 5 PB0 (MOSI/AIN0/OC0A/PCINT0)       pulse_out
// 6 PB1 (MISO/AIN1/OC0B/INT0/PCINT1)
// 7 PB2 (SCK/ADC1/T0/PCINT2)          r_var (2k2, gnd, vcc) - pulse width or sweep frequency
// 8 vcc
// fuse default (0x6a)
#define MIDDLE 4
#define SWEEP 3
#define RESET 5

#define WIDTH_MODE   0
#define SWEEP_MODE   2

#define DEB_LIMIT 5

#pragma vector=TIM0_OVF_vect
__interrupt void my_interrupt_handler(void)
{ 
static unsigned char int_count=0, button_debounce=0, sweep_state=WIDTH_MODE;
static char sweep_direct=0;
static int sweep_count;


static unsigned char impulse = 255-150, tmp; 
// 1mS =180, 1.5mS=143, 2mS=105

  if(int_count++ >=5)
  {
    OCR0A = impulse;
    int_count = 0;
    impulse=ADCH;//only high 8 bits (left justify mode)

    if(!(PINB & (1<<SWEEP)))
    {
      if(button_debounce == DEB_LIMIT)
      {
        if(sweep_state == WIDTH_MODE)
        {
          sweep_state = SWEEP_MODE;
          sweep_count = 0;
        }
        else
          sweep_state = WIDTH_MODE;
        
        button_debounce = 0;
      }
    }
    else if(button_debounce < DEB_LIMIT)
      button_debounce++;
        
  
    if(!(PINB & (1<<MIDDLE)))
      impulse = 255-150/2-150/4; //1.5mS
    else
    {
      if(sweep_state == WIDTH_MODE)
      {
        impulse >>=1;
        tmp = impulse>>1;
        impulse -= tmp;
        tmp >>=2;
        impulse += tmp;
        impulse += 105-1;
      }
      else
      {
        if(sweep_direct == 0)
        {
          sweep_count += ((int)impulse)<<3;
          if(sweep_count > 0x3fff)
          {
            sweep_count = 0x3fff;
            sweep_direct = 1;
          }
        }
        else
       {
          sweep_count -= ((int)impulse)<<3;
          if(sweep_count < 0)
          {
            sweep_count = 0;
            sweep_direct = 0;
          }
        }
        impulse = sweep_count>>6;
        impulse >>=1;
        tmp = impulse>>1;
        impulse -= tmp;
        tmp >>=2;
        impulse += tmp;
        impulse += 105-1;
      }
    }
    
  }
  else
  {
    OCR0A = 255; //low level all period (inverse compare out)
    ADCSRA |= 1<<ADSC;//ADC single conversion start
  }
}

int main()
{
 // internal_clk = 9.6 MHz
// pulse period 20mS, lenght 1 - 1.5(middle) - 2mS 
  // default divider = 8 (9.6/8=1.2)
  // 9.6 /2 master clock prescaler=4.8 /64 timer counter prescaler /150 timer value = 500Hz (2mS)
  CLKPR = 1<<CLKPCE;// divider change enable
  CLKPR = 1;// 0=divider - 1, 1=divider 2 (page 26 manual PDF)

  
  TCCR0A = 1<<COM0A1 | 1<<COM0A0 | 1<<COM0B1 | 1<<COM0B0 | 1<<WGM01 | 1<<WGM00;//WGM2:0 = 3 -> Fast PWM 0xFF TOP MAX  
  OCR0A = 105;
  OCR0B = 105;//for test purpose only
  TIMSK0 = 1<<TOIE0;//TOIE0 counter overflow interrupt
  TCCR0B = 3;//3=timer prescaler 64, 1=1
    
  ADMUX = 1<<ADLAR | 1<<MUX0;//ADC init REF_VCC(ADMUX=0), left_just(ADLAR=1), chan ADC1=PB2(MUX1..0=01)
  ADCSRA = 1<<ADEN | 1<<ADPS2 | 1<<ADPS1;//ADC on (ADEN=1), 4.8/64(prescaler)=75kHz(ADPS2:0=110)
  DIDR0 = 1<<ADC1D;//ADC digital input on PB2 disable
  ADCSRA |= 1<<ADSC;//start single conversion
  //ADC only ADCH read 

 DDRB |=  1<<PB0 | 1<<PB1;//timers out ON  
  PORTB |= 1<<MIDDLE | 1<<SWEEP | 1<<RESET;//pullup enable on button and reset

 SREG |=  1<<7; //interrupt enable


 for(;;)
 {
 }
}

 

 

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

А в переводчик запихать то, что говорит компилятор не пробовали?
"Fade.ino:2:22: error: iotiny13.h: No such file or directory"
У Вас в проект включён хидер #include "iotiny13.h", а в директории проекта файл физически отсутствует, о чем и сообщает компилятор.
http://ru.aliexpress.com/item/Multi-Servo-Tester-3CH-ECS-Consistency-Spe...

Frolv
Offline
Зарегистрирован: 31.08.2015

Я в программировании дуб-дубом! Сервотестер выписал, но ждать еще месяц....а нужно сейчас.

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

 

Что-то моя Тинька не заводится( фьюзы заводские, их пишет/читает, а светодиодом не моргает(

Писал стд блинк на С . на 2313 код едет, на 13( с изменённым портом) не едет

 

 

Frolv
Offline
Зарегистрирован: 31.08.2015

нашел (http://telesys-ru.1gb.ru/wwwboards/mcontrol/945/messages/39444.shtml) такой файлик. Ну компилятор ругается еще на 23 и 24 строку. Что там неправильно?

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

Frolv, ваш скетч из стартового сообщения мало того, что не адаптирован для ардуино, так он ещё и для другого компилятора. Переделать вполне реально, но кто это за вас станет делать, вот в чём вопрос. Думаю вам проще залить hex как советует автор той статьи.

Frolv
Offline
Зарегистрирован: 31.08.2015

Час назад залил Hex, увы для моих целей это не подошло...моторчик то "пищит" - то нет, т.е. не армится... в общем у меня задача такая: есть бесколекторный мотор и регулятор к нему (спользуется на коптерах), как не используя приемник-передатчик радиомодели, а только "приблуду" на МК заставить мотор вращаться и менять обороты с помощью переменного резистора? Нашел вот ссылку https://ssl.instructables.com/id/Attiny254585-PWM-generator-and-Servo-tester/ попробую по ней. Но она на тинку 45...

 

Frolv
Offline
Зарегистрирован: 31.08.2015

уффф..нашел и для тинки13..

*

Led flasher

PB0  pwm channel 1
PB1  pwm channel 2
PB2
PB3  Analog 2 in
PB4  Analog 1 in
PB5 (RESET)


*/
#include<avr/io.h>

#define OUTPUT  1
#define INPUT   0

#define SetBit(BIT, PORT)     PORT |= (1<<BIT)
#define ClearBit(BIT, PORT)   PORT &= ~(1<<BIT)
#define IsHigh(BIT, PORT)    (PORT & (1<<BIT)) != 0
#define IsLow(BIT, PORT)     (PORT & (1<<BIT)) == 0

#define CH1On()                 SetBit(0, PORTB)
#define CH1Off()                ClearBit(0, PORTB)

#define CH2On()                 SetBit(1, PORTB)
#define CH2Off()                ClearBit(1, PORTB)

void Delay(unsigned int delay);
void InitADC( void );
void readADC(void) ;
 
 
int main( void ) {
 
  unsigned int i, d;
 
  // Set clock prescaler: 0 gives full 4.8 MHz from internal oscillator.
  CLKPR = (1 << CLKPCE);
  CLKPR = 0;

  DDRB = ((OUTPUT << PB0) | (OUTPUT << PB1) |(INPUT << PB2) |(INPUT << PB3) |(INPUT << PB4) |(INPUT << PB5 ));
  
  InitADC();

  while(1)  {
    d = 33000;
    
    readADC();
    i = (ADC*4)+980;
    d -= i;
    
        
    ADMUX = 3;  
    CH1On();    
    for(; i != 0; i--) asm volatile ("nop"::); // 900 is 0.5ms, 5000 is 2.5ms
    CH1Off();  
   
              
    
    readADC();
    i = (ADC*4)+980;
    d -= i;
    
    ADMUX = 2;
    CH2On();    
    for(; i != 0; i--) asm volatile ("nop"::); // 900 is 0.5ms, 5000 is 2.5ms
    CH2Off();  
    
    Delay(d); // 18000 is a full 17ms cycle 
  }
  
}



void Delay(unsigned int delay) {
  unsigned int x;
  for (x = delay; x != 0; x--) {
    asm volatile ("nop"::); 
  }
}



void InitADC( void ) {
  // VCC voltager ref, ADC2 (PB4) as default input
  ADMUX = 2;
  // Enable ADC, ADC prescaler /64
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);

  // Start conversion and wait for it to complete (result not used)
  ADCSRA |= (1<<ADSC);            // Start convertion
  while (ADCSRA & (1<<ADSC));     // Wait for conversion to complete
  ADCSRA = ADCSRA;                // Clear ADC interrupt flag

 
}

void readADC(void) {

    SetBit(ADIF, ADCSRA);
    SetBit(ADSC, ADCSRA);    

    while(IsLow(ADIF, ADCSRA));  // wait for conversion done, ADIF flag active

}

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

vitix
Offline
Зарегистрирован: 18.09.2015

вопрос, 

а можно ли на Attiny13a подключить OLED дисплей по шине I2C. для работы с библиотекой u8glib. ?

 

 

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

vitix пишет:

вопрос, 

а можно ли на Attiny13a подключить OLED дисплей по шине I2C. для работы с библиотекой u8glib. ?

 

 

библиотека огромна не влезет.

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

Привет коллеги!

Прошу помощи, кто вник кто разобрался  с даташитом tinny13.

Мой код позволяет получить аппаратный ШИМ 4КГц, мне нужно больше. Как поднять частоту?

void setup() 
{ 
   PORTB=0x00;DDRB=0x01;// порт
   TCCR0A=0x83;TCCR0B=0x01;OCR0A=0x00;//Аппаратный   ШИМ 
} 
void loop() 
{ 
   OCR0A=125;//устанавливаем скважность.    
} 

 

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

bodriy2014, вам на будущее -считается более корректным для оценки человеком там-же запись, но в формате:

void setup() { 
PORTB&=~(1<<1);
DDRB|=1<<1;
TCCR0A= (1<<COM0A0)|(1<<COM0B0)|(1<<WGM01)|(1<<WGM00);// oc0b enable(?) ;  mode 3,FASTPWM   
TCCR0B=1<<CS0; //divider=1
OCR0A=125;//устанавливаем начальную скважность.    
} 
void loop() { } 

Из неё сразу видно, что таймер работает на максимальной частоте, которая рассчитывается если не ошибаюсь:  F_тактовая / 256 Значит увеличить частоту можно только увеличением тактовой частоты контроллера.  ps: кстати с битами -конфигурацией выхода (COM0**)  что-то не то. Судя по даташиту так не должно работать.

 

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

dimax пишет:

bodriy2014, вам на будущее -считается более корректным для оценки человеком там-же запись, но в формате:

void setup() { 
PORTB|=~(1<<1);
DDRB|=1<<1;
TCCR0A= (1<<COM0A0)|(1<<COM0B0)|(1<<WGM01)|(1<<WGM00);// oc0b enable(?) ;  mode 3,FASTPWM   
TCCR0B=1<<CS0; //divider=1
OCR0A=125;//устанавливаем начальную скважность.    
} 
void loop() { } 

Из неё сразу видно, что таймер работает на максимальной частоте, которая рассчитывается если не ошибаюсь:  F_тактовая / 256 Значит увеличить частоту можно только увеличением тактовой частоты контроллера.  ps: кстати с битами -конфигурацией выхода (COM0**)  что-то не то. Судя по даташиту так не должно работать.

 

Спасибо за отклик.

О формате записи подтяну знания.

Залил только что свой скетч для проверки рабоатет.

Ваш залил не работает((

А на счет скорости считал так 9,6МГц/256=37,5КГц

В меге восьмой так сходилось, где-то в тиньке косяк в моем коде-может она 37КГц

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

bodriy2014, может я при пересчете двоичных кодов где-то ошибся, но касательно частоты -получается что у вас тактовая 1МГц а не 9,6. Какие фьюзы стоят?

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

Залил скомпилированный в Atmel Studio .hex получил то-же 4КГц

/*
Апаратный ШИМ тини13
 */ 
#include <avr/io.h>
int main(void)
{
PORTB=0x00;DDRB=0x01;// порт
TCCR0A=0x83;TCCR0B=0x01;OCR0A=0x00;//Аппаратный   ШИМ
OCR0A=125;//устанавливаем скважность.
    while(1)
    {
		
    }
}

Вот мои фьюзы из сигна прог

 

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

dimax Огромное спасибо за наводку.

Поправил фьюзы-поставил 0x  LOW

Теперь 37КГц!!!!

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

bodriy2014, разобрался где я ошибся - я число 0x83 посчитал как десятичное :)

void setup() {
PORTB&=~(1<<PB0); DDRB|=1<<PB0; //PB0- OUTPUT mode
TCCR0A= (1<<COM0A1)|(1<<WGM01)|(1<<WGM00);
// Clear OC0A on Compare Match, set OC0A at TOP;  mode 3,FASTPWM   
TCCR0B=1<<CS00; //divider=1
OCR0A=127;//устанавливаем начальную скважность.    
}
void loop() { }

Ps в вашем скетче ошибки небыло, это я 2 раза ошибся ))

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

Сейчас сравниваю для тини13 ардуиновский код и читый С.

НЕ ВСЕ ардуиновские команды жрут  ресурсов больше!

Другой вопрос через С настроить работу можно более тонко.

например эти жрут одинаково.

С

int Volts = 0; // Вольтметр
void setup()
{
}
void loop()
{
 Volts = analogRead_C(2); // РВ4 в ATtiny13
}
unsigned int analogRead_C(byte channel){ 
  ADMUX = channel; // ADC pin
  ADCSRA |= 1<<ADEN;
  ADCSRA |= 1<<ADSC;
  while(!(ADCSRA & (1<<ADIF)));
  ADCSRA |= 1<<ADIF;
  byte low  = ADCL;
  byte high = ADCH;
  ADCSRA &= ~(1 << ADEN);  // отключаем АЦП, для уменьшения энергопотребления
  return (high << 8) | low;
}

Ардуино

int Volts = 0; // Вольтметр
void setup() {  } 
void loop() 
{ 
Volts=analogRead(2);
} 

 

auct
Offline
Зарегистрирован: 14.12.2014

Народ! ХЕЛП!!!!

не могу прошить тиньку в смд корпусе. Выдает

Размер скетча в двоичном коде: 396 байт (из 1 024 байт максимум)
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny13
avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override
         this check.
 
В дипкорпусе прошивается без проблем. 
Где копать?
Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Проблема решаема...http://bigbarrel.ru/error_attiny4585/

auct
Offline
Зарегистрирован: 14.12.2014

auct пишет:

Народ! ХЕЛП!!!!

не могу прошить тиньку в смд корпусе. Выдает

Размер скетча в двоичном коде: 396 байт (из 1 024 байт максимум)
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny13
avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override
         this check.
 
В дипкорпусе прошивается без проблем. 
Где копать?

Все оказалось просто - всему виной Великая наука о контактах

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

dimax пишет:

bodriy2014, разобрался где я ошибся - я число 0x83 посчитал как десятичное :)

void setup() {
PORTB&=~(1<<PB0); DDRB|=1<<PB0; //PB0- OUTPUT mode
TCCR0A= (1<<COM0A1)|(1<<WGM01)|(1<<WGM00);
// Clear OC0A on Compare Match, set OC0A at TOP;  mode 3,FASTPWM   
TCCR0B=1<<CS00; //divider=1
OCR0A=127;//устанавливаем начальную скважность.    
}
void loop() { }

Ps в вашем скетче ошибки небыло, это я 2 раза ошибся ))

Спасибо. Прошил, попробова, работает. Как установить частоту не понял.

А возможно ли на тиньке сделать такое - на двух выходах синхронно импульсы с частотой примерно 20-25 килогерц как на рисунке? Нужно для управления мостом.

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

Joiner пишет:

Спасибо. Прошил, попробова, работает. Как установить частоту не понял.

А возможно ли на тиньке сделать такое - на двух выходах синхронно импульсы с частотой примерно 20-25 килогерц как на рисунке? Нужно для управления мостом.

Вам на тини нужно менять частоту или на ардутно?

Если тини то менять частоту можно только с определенным шагом до 37,5КГц

На ардуино как хотите вплоть до 500КГц!)))

А что за мост?

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

bodriy2014 пишет:

Вам на тини нужно менять частоту или на ардутно?

Если тини то менять частоту можно только с определенным шагом до 37,5КГц

На ардуино как хотите вплоть до 500КГц!)))

А что за мост?

Нужен генератор, который имеет 2 выхода, на которых импульсы управляющие H-мостом, как на драйвере ШД L293. Первый выход формирует положительную полуволну, второй отрицательную. Форма напряжения после моста примерно такая, как на обмотке биполярного двигателя.

Нужен очень мощный звук на излучателе с частотой 20-25 килогерц.

Генератор хотелось бы сделать на тиньке 13.

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

Joiner пишет:

Нужен генератор, который имеет 2 выхода, на которых импульсы управляющие H-мостом, как на драйвере ШД L293. Первый выход формирует положительную полуволну, второй отрицательную. Форма напряжения после моста примерно такая, как на обмотке биполярного двигателя.

Нужен очень мощный звук на излучателе с частотой 20-25 килогерц.

Генератор хотелось бы сделать на тиньке 13.

Опустите частоту тини13 и получите 4,8МГц/256=17,7КГц

Это самое близкое к вашим запросам.

Еще вариант-если у вас код короткий можно сделать то что хотите програмно.

 

 

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

bodriy2014 пишет:

Опустите частоту тини13 и получите 4,8МГц/256=17,7КГц

Это самое близкое к вашим запросам.

Маловасто будет :) Мне надо 20-25 и может даже с частотной модуляцией 1-2 герца.

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

Позавчера пришли из китая Тиньки. Собрал на бредборде, подключил к ардуинке, поморгал светодиодиками. Потом решил сделать платку отдельную для прошивки тинек. Сделал. Соорудил соединительный шнурок на разъем ICSP Ардуинки. Купился на вот этот рисунок

Трахался с Тиньками 2 дня, несколько раз  переустанавливал Ардуино IDE. Ни хрена ни чего не получалось. Оказалось, что пин 10 Ардуины к этому разъему вообще не подключен.

Немного переделал (один проводок втыкаю в пин 10). Все заработало........но не совсем. В первый день работало все...И скетчи прошивались, и загрузчики записывались. Записывая загрузчики я переключал вн.частоту тиньки не вдаваясь особо в теорию. Сейчас загрузчики не записываются, выдается ошибка. Правда в первый день в Ардуино IDE добавлял другие файлы.

Вот что получилось...макетик для освоения тиньки....потом панельки на другие тиньки добавлю

г

Где-то прочитал про конденсатор, что надо поставить между +5в и GND (его видно на фотке на ардуинке). Сделал вывод - он нахрен не нужен. Без него все прекрасно работает.

zilibob4ik
Offline
Зарегистрирован: 02.06.2014

На последнем билде Ардуино ИДЕ 1.6.5 перетсл компилироваться код для ATTINY13 с ядром из первого сообщения.

Кто нибудь разобрался как победить это нежелание компилировать?

Сколько искал, максимум нашёл установку ядара для Тини 45-85 онлайн (по новому из настроек и Боард Менеджера)

zilibob4ik
Offline
Зарегистрирован: 02.06.2014

урл для установки 45-85 тиньки (13 нету пока что)

https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json

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

у меня с 1.6.5 такое ядро работает.

Не помню где качал.

http://my-files.ru/9mihx8

 

 

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

zilibob4ik пишет:

На последнем билде Ардуино ИДЕ 1.6.5 перетсл компилироваться код для ATTINY13 с ядром из первого сообщения.

Кто нибудь разобрался как победить это нежелание компилировать?

Сколько искал, максимум нашёл установку ядара для Тини 45-85 онлайн (по новому из настроек и Боард Менеджера)

Я вставлял как-то через пень-колоду,т.е не очень понимая файлы из двух источников для тиньки 13. Первый раз в списке появились тиньки на 1.2, 4.8, 9.6 мегагерц. Все прекрасно работало. Второй раз поставил другие файлы. Появились тиньки 128, 600 килогерц, 1.2,  4.8, 9.6 мегагерц. Все шьется, но "записать загрузчик" выдает ошибку, типа что-то в файле конфигурации.

zilibob4ik
Offline
Зарегистрирован: 02.06.2014

Странно всё.

Запускаю версию 1.0.5.  всё нормально компилируется

запускаю 1.6.5, выдаёт

my.ino: In function 'void EEPROM_write(int, char)':
my.ino:132: error: 'EEWE' was not declared in this scope
my.ino:135: error: 'EEMWE' was not declared in this scope
my.ino:136: error: 'EEWE' was not declared in this scope
my.ino: In function 'char EEPROM_read(int)':
my.ino:141: error: 'EEWE' was not declared in this scope
'EEWE' was not declared in this scope

Похоже, надо забрасывать это дело и переходить на Code Vision AVR

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

zilibob4ik пишет:

Похоже, надо забрасывать это дело и переходить на Code Vision AVR

Если и переходить, то на AVR Studio/Atmel Studio.

zilibob4ik
Offline
Зарегистрирован: 02.06.2014

В чём их отличие ?

Так же интересует, конечный откомпилированный объём,

будет отличаться по размеру от результата полученного в Arduino ?

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

Всвязи с необходимостью сделать генератор на тиньке, спаял макетик для прошивки тиньки. Попробовал залить несколько готовых скетчей. Как ни странно - работает. Нашел на просторах интернета такой скетч

// 1.2 MHz (default) built in resonator
#define F_CPU 1200000UL

#include <avr/io.h>
#include <util/delay.h>

#define LED_BIT _BV(PB0)

int main()
{
        DDRB |= LED_BIT; // OUTPUT

        while (1)
        {
                PORTB |= LED_BIT; // HIGH
                _delay_ms(1000);
                PORTB &= ~LED_BIT; // LOW
                _delay_ms(1000);
        }
}

Если закомментить дилеи, то моргание происходит с частотой более 196 килогерц, в отличии от ардуиновского Blink, который на тиньке с закомментированными дилеями даже до 7 килогерц не дотягивает.

Про операторы, которые здесь применяются я не слышал, и вообще ни чего не понимаю. Подскажите где можно про это почитать.

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

http://easyelectronics.ru/avr-uchebnyj-kurs-programmirovanie-na-si-chast-1.html

А также остальные части.

Сам по ним постигал))

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

Yarik.Yar пишет:

http://easyelectronics.ru/avr-uchebnyj-kurs-programmirovanie-na-si-chast-1.html

А также остальные части.

Сам по ним постигал))

Yarik.Yar спасибо огромное!

Вроде, самое то, что надо!

Пошел читать.

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

Я его сделал! Как и хотел...генератор прямоугольных импульсов на 2 выхода, как и хотел примерно 23 килогерца. Максимальная частота 117 килогерц. В скетче можно подстроить для своих нужд. Выкладываю скетч, может кто подскажет, что можно подправить

/* Генератор прямоугольных импульсов на два выхода. Максимальная частота 117 килогерц.
*если поиграться с delay_ями (они в микросекундах), то можно настроить под свои нужды
* Я для себя частоту примерно 23 килогерца сделал :)
*/



// 1.2 MHz (default) built in resonator
#define F_CPU 1200000UL//Если закомментить - все равно работает

#include <avr/io.h>//Если закомментить - все равно работает
#include <util/delay.h>//delay.h - этот файл содержит функции для создания пауз в программе.


#define out1 _BV(PB0)
#define out2 _BV(PB1)

int main()
{
        DDRB |= out1; // OUTPUT
        DDRB |= out2; // OUTPUT

        while (1)
        {
                PORTB |= out1; // HIGH
               _delay_us(15);//Длительность импульса на выходе1 при 15 - 23.38 килогерц
                              //при 300 - 1586 герц
                PORTB &= ~out1; // LOW
               _delay_us(1);//Ни чего нет на выходах

                PORTB |= out2; // HIGH
               _delay_us(15);//Длительность импульса на выходе2

                PORTB &= ~out2; // LOW
                _delay_us(1);//Ни чего нет на выходах
               
                                               
        }
}

 

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

DDRB |= out1; // OUTPUT
 DDRB |= out2; // OUTPUT

можно 
DDRB |= out1 | out2;

 

 

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

Yarik.Yar пишет:

Вместо

DDRB |= out1; // OUTPUT
 DDRB |= out2; // OUTPUT

можно 
DDRB |= out1 | out2;

Спасибо :)

А возможно ли с Attiny в порт сразу все биты записывать? Я пробовал, что-то у меня не получается :(

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

То есть?

 

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

У тиньки порт В урезан, только 6 пинов

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014
Ты имел в виду

PORTB = 0b10110101; //типа так

 

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

Yarik.Yar пишет:

Ты имел в виду

PORTB = 0b10110101; //типа так

Да, так. Но что-то не получилось

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

0b в начале не забыл?)

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

Не забыл. И ob00001111, и B00001111, и 0b001111 пробовал, что-то не записалось. Может неправильно pinMode назначил....тоже кучей пытался назначить. Может там где ошибка. Завтра попытаюсь еще

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

Joiner пишет:

Я его сделал! Как и хотел...генератор прямоугольных импульсов на 2 выхода, как и хотел примерно 23 килогерца. Максимальная частота 117 килогерц. В скетче можно подстроить для своих нужд. Выкладываю скетч, может кто подскажет, что можно подправить

/* Генератор прямоугольных импульсов на два выхода. Максимальная частота 117 килогерц.
*если поиграться с delay_ями (они в микросекундах), то можно настроить под свои нужды
* Я для себя частоту примерно 23 килогерца сделал :)
*/



// 1.2 MHz (default) built in resonator
#define F_CPU 1200000UL//Если закомментить - все равно работает

#include <avr/io.h>//Если закомментить - все равно работает
#include <util/delay.h>//delay.h - этот файл содержит функции для создания пауз в программе.


#define out1 _BV(PB0)
#define out2 _BV(PB1)

int main()
{
        DDRB |= out1; // OUTPUT
        DDRB |= out2; // OUTPUT

        while (1)
        {
                PORTB |= out1; // HIGH
               _delay_us(15);//Длительность импульса на выходе1 при 15 - 23.38 килогерц
                              //при 300 - 1586 герц
                PORTB &= ~out1; // LOW
               _delay_us(1);//Ни чего нет на выходах

                PORTB |= out2; // HIGH
               _delay_us(15);//Длительность импульса на выходе2

                PORTB &= ~out2; // LOW
                _delay_us(1);//Ни чего нет на выходах
               
                                               
        }
}

 

Это программный ШИМ не каждому подойдет, добавить еще пару строк кода и выход уже будет не таким.

Есть же апартный таймер с выходом как раз на два порта и совсем не занимает вычислительную мощность МК, при запуске настраиваете его парой строк а дальше весь килобайт под программу ваш!

вот простой пример

int skv=100;
void setup()
{
   PORTB=0x00;
   DDRB=0b00000001;// устанавливаем порт PB0 как выход а остальные вход
   //DDRB &= ~(1<<4); // устанавливаем вывод PB2 как вход
   TCCR0A=0x83;TCCR0B=0x01;OCR0A=0x00;//Аппаратный   ШИМ   
}
void loop()
{

 OCR0A=skv;//устанавливаем скважность.
}
 

 

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

bodriy2014 пишет:

Это программный ШИМ не каждому подойдет, добавить еще пару строк кода и выход уже будет не таким.

Есть же апартный таймер с выходом как раз на два порта и совсем не занимает вычислительную мощность МК, при запуске настраиваете его парой строк а дальше весь килобайт под программу ваш!

вот простой пример

А какая частота или диапазон частот? И где 2 выхода? Может глупые вопросы....но я пока плохо понимаю в программировании.

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

Joiner пишет:

А какая частота или диапазон частот? И где 2 выхода? Может глупые вопросы....но я пока плохо понимаю в программировании.

Я выше вам писал как считается частота

9,6МГц/256=37,5КГц

Это пример для одного выхода PB0

Но легко и для двух ног делается PB1 и PB0.

Зато это не отнимает место в программе там что хотите можете писать МК сам в фоне следить за счетчиками будет.

Пример подробней не куда большее будет просто медвежьей услугой, посмотрите есть хорошие видео и текстовые уроки на русском по апаратному шиму AVR.

П.С. А на счет атмеги и ардуино вы не правы есть библиотека позволяющая делать ШИМ до 500КГц с любой частотой и скважностью!

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

простой пример высокочастотного ШИМа на ардуино

#include <PWM.h>//библиотека для поднятия частоты ШИМ
int pwm = 100;  // PWM 0..255               //
int pinDOWN = 9;                //
int32_t frequency = 45000; //частота Hz
void setup()
{
InitTimersSafe();// запуск таймера 
bool successDOWN = SetPinFrequencySafe(pinDOWN, frequency);//установка пина повышенной частоты
}

void loop()
{
    pwmWrite(pinDOWN,pwm);//установка шим на пине     
}