Роман Романович

Помогите, простой стробоскоп

7 сообщений в этой теме

Прошу помощи. Понимаю что пограммистам это на раз плюнуть.

Нужна программа прошивки на Attiny13.

Алгоритм следующий:

- при подачи питания на МК на ноге мк постоянная 1 и лампочка горит

- при повторной подаче питания мк лампа мигает стробоскопом.

- при повторной подаче питания снова лампа горит, и так по кругу

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

ПОМОГИТЕ, ОЧЕНЬ НУЖНО"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

часть программы стробоскопа

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


void main(void)
{

int i;

PORTB=0x00;
DDRB=0x03;

while (1)
      {
for (i = 0; i<3 ; i++)
          { 
PORTB.0=1; 
delay_ms(100);
PORTB.0=0;
delay_ms(100);
          } 
       
  delay_ms(400);


      }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Mishany    47

использовать Eeprom при каждом включении считывать бит если 1 или 0 - это и есть режим, после считывания инвертировать бит для следующего включения

но епром ограничена 100000 циклов записи

#include <avr/eeprom.h>
//определить переменную в епром:
unsigned char rezhim EEMEM;

//чтение:

eeprom_read_byte(&rezhim);

//запись:

eeprom_update_byte(&rezhim, ххх);

 

Изменено пользователем Mishany

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 223
25 минут назад, Роман Романович сказал:

Алгоритм следующий:

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

хотя вариант с изнасилованием ЕЕПРОМ тоже имеет право на жизнь :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Спасибо, просто у меня с программированием тяжело, а данная прошивка край нужна

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Falconist    4 843
7 часов назад, Роман Романович сказал:

у меня с программированием тяжело

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

Сочувствую я вам, ребята, не видящим других возможностей, кроме МК...

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 часов назад, Mishany сказал:

использовать Eeprom при каждом включении считывать бит если 1 или 0 - это и есть режим, после считывания инвертировать бит для следующего включения

но епром ограничена 100000 циклов записи


#include <avr/eeprom.h>
//определить переменную в епром:
unsigned char rezhim EEMEM;

//чтение:

eeprom_read_byte(&rezhim);

//запись:

eeprom_update_byte(&rezhim, ххх);

 

Если можно весь код напишите пожалуйста!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
snn_krs    18
On 4/17/2018 at 9:01 AM, Роман Романович said:

Если можно весь код напишите пожалуйста!!!

Spoiler

#include <tiny13a.h>
#include <delay.h>

eeprom unsigned char mode;

void main(void)
{
// Declare your local variables here
 int i;
 
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Reset Source checking
if (MCUSR & (1<<PORF))
   {
     // Power-on Reset
     MCUSR=0;

     delay_ms( 500 );
     if ( mode == 0 )
     {
       mode = 1;
     } else {
       mode = 0;     
     }
   }

DDRB=(0<<DDB5) | (1<<DDB4) | (1<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

  if ( mode == 0 )
  { 
    while ( 1 )
    {
      for ( i = 0; i < 3 ; i++ )
      { 
         PORTB.3 = 1; 
         delay_ms( 100 );
         PORTB.3 = 0;
         delay_ms( 100 );
      } 
      delay_ms( 400 );
    }
  } else {
      
    PORTB.3 = 1;
    while ( 1 )
    {
    }
  }
}

 

Попробуйте этот код. У меня ATtiny13A, но они совместимы и я вывел мигание на 3-ю ножку т.к. к 0-й подпаян программатор

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас