Светодиодные фонари и световые приборы. Всё о светотехнике.
Вернуться   Форум FONAREVKA.RU Лаборатория Разработка и модификация фонарей Разработка и модификация электроники фонарей
Расширенный поиск
Забыли пароль? Регистрация

  • О нашем проекте
  • Светотехника и световые приборы
  • Правила форума
Проект FONAREVKA.RU специализируется на предоставлении всей необходимой информации по светотехнике:

— светодиодные фонари;
— различные источники питания;
— разнообразные зарядные устройства;
— освещение помещений и наружное освещение;
— световые приборы для личного, пассажирского и грузового транспорта;
— специальные световые приборы для медицины, для растений, для аквариумов, для террариумов, а также аварийно-сигнальные световые приборы;
— альтернативные источники света;
— лазеры и лазерная техника.

Если у вас есть вопросы по выбору фонарей, аккумуляторов и зарядных устройств ознакомьтесь с FAQ от наших экспертов:

F.A.Q. по выбору фонарей различных типов;
F.A.Q. по выбору аккумуляторов;
F.A.Q. по выбору зарядных устройств.
Ответ  Создать новую тему
Просмотров в теме 26263   Ответов в теме 46   Подписчиков на тему 2   Добавили в закладки 0
Опции темы Поиск в этой теме
Старый 01.05.2012, 15:38   21
VladislavS
Завсегдатай Фонарёвки
 
Регистрация: 16.02.2011
Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Цитата:
Посмотреть сообщение Сообщение от Tamagotchi :
Это просто не красиво.
А по мне так очень даже симпатично. PB4 зачем-то дёргать и неопределённое начальное состояние PORTB в первом проходе цикла - вот это некрасиво!

Цитата:
Посмотреть сообщение Сообщение от Tamagotchi :
Ну, 2 байта экономии
Не просто 2, а 2 в сегменте кода и ещё 1 в стеке.

А если твой код написать без непонятного дёрганья PB4 и корректным первым циклом:
Код:
void test1(void)
{ 
  while (1)
  {
    PORTB = 1;
    for (int i = 0; i < 4; i++)
    {
      _delay_ms(250);
      PORTB = PORTB << 1;
    }
    _delay_ms(250);
    PORTB=0;
    _delay_ms(250);
  }
}
То разница в сегменте кода будет уже 6 байт.

Интересная у нас темка получается, придумываем сами себе левые задачки, а вопрошающий и не чухается с ответами...
VladislavS вне форума   Ответить с цитированием Вверх
Старый 01.05.2012, 18:05   22
Tamagotchi

 
Аватар для Tamagotchi
 
Регистрация: 07.09.2011
Последняя активность: 04.08.2023 18:59
Адрес: Волгоградская обл.
Сообщений: 13705
Сказал(а) спасибо: 3333
Поблагодарили: 7886 раз(а) в 3523 сообщениях

Отправить сообщение для Tamagotchi с помощью Skype™
По умолчанию Re: Простая моргалка на Attiny13A

Цитата:
Посмотреть сообщение Сообщение от VladislavS :
а вопрошающий и не чухается с ответами
Да, пора завязывать
Tamagotchi вне форума   Ответить с цитированием Вверх
Старый 01.05.2012, 20:51   23
AVSel
Консультант

 
Аватар для AVSel
 
Регистрация: 15.11.2010
Последняя активность: 27.01.2024 20:53
Адрес: Москва
Сообщений: 8206
Сказал(а) спасибо: 1077
Поблагодарили: 1713 раз(а) в 912 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Цитата:
Посмотреть сообщение Сообщение от andory :
Ну и комментарии нужны, формально, для каждой строки.
ИМХО: Комментарии для каждой строки - это уже маразм. Какой смысл комментировать сдвиг влево на один бит, что это сдвиг влево на один бит Вот комментировать переменные, и функции, если их смысл из названия непонятен - вполне желательно.
AVSel вне форума   Ответить с цитированием Вверх
Старый 01.05.2012, 22:35   24
andory
Завсегдатай Фонарёвки
 
Регистрация: 28.05.2010
Последняя активность: 22.12.2013 16:40
Адрес: msk
Сообщений: 843
Сказал(а) спасибо: 0
Поблагодарили: 80 раз(а) в 53 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Понятно, что каждую строку комментировать не надо. А факт, что прозрачный сейчас код через неделю без комментариев станет галиматьей, надо четко представлять. В нашем примере#21 PORTB=0; нет в тз, в коде-есть, я-бы это отметил (какие-то соображения были, чтобы его вставить?).
Цитата:
Посмотреть сообщение Сообщение от frotnline :
...поочерёдно зажигая каждый из них...
andory вне форума   Ответить с цитированием Вверх
Старый 01.05.2012, 22:45 Автор темы   25
frotnline
Новичок
 
Регистрация: 24.04.2012
Последняя активность: 25.05.2012 10:56
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Свасибо за ваши советы, буду пробовать! Да в схеме напутал с питанием, на деле собрано правильно! Использую для компиляции CodeVisionAVR. Кстати, тот код что я выложил нормально компилируется. Какие заводские FUSE у Attiny13A, а то я уже их менял, а листок с исходными потерял.

[Исправлено: frotnline, 01.05.2012 в 23:02]
frotnline вне форума   Ответить с цитированием Вверх
Старый 01.05.2012, 23:35   26
andory
Завсегдатай Фонарёвки
 
Регистрация: 28.05.2010
Последняя активность: 22.12.2013 16:40
Адрес: msk
Сообщений: 843
Сказал(а) спасибо: 0
Поблагодарили: 80 раз(а) в 53 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

#13
andory вне форума   Ответить с цитированием Вверх
Старый 02.05.2012, 08:57   27
VladislavS
Завсегдатай Фонарёвки
 
Регистрация: 16.02.2011
Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Цитата:
Посмотреть сообщение Сообщение от frotnline :
Кстати, тот код что я выложил нормально компилируется.
Это есть не может быть, потому что не может быть никогда. Я даже глазами там ошибки вижу. А уж компилятор там будет вопить.

Начни вот с этого кода:
Код:
#include <avr/io.h>
#include <avr/interrupt.h>

unsigned char bits[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
#define set_bit(x,y) x|=bits[y]
#define clear_bit(x,y) x&=~bits[y]
#define inv_bit(x,y) x^=bits[y]

ISR (SIG_OUTPUT_COMPARE0A)
{
  inv_bit(PORTB,4);
}

int main (void)
{
  DDRB=0x1F;
  PORTB=0x1F;
  TCCR0A=0x02;  // WGM01=1 WGM00=0;  Режим CTC=0-OCRA
  TCCR0B=0x05;  // 128кГц / 1024 = 125 Гц
  OCR0A=125;     // 1 Гц по CompareA 
  TIMSK0=0x04;  // Compare Match A Interrupt
  sei();
  for(;;);
}
Ставим фьюзы на CKSEL0=1, CKSEL1=1 (“1” means unprogrammed ) и смотрим результат. Один из диодов должен замигать.

[Исправлено: VladislavS, 02.05.2012 в 09:00]
VladislavS вне форума   Ответить с цитированием Вверх
Старый 02.05.2012, 10:27   28
VladislavS
Завсегдатай Фонарёвки
 
Регистрация: 16.02.2011
Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Цитата:
Посмотреть сообщение Сообщение от frotnline :
Использую для компиляции CodeVisionAVR.
Что очень даже сомнительно. Смотри какой код для него должен быть.
Код:
#include <tiny13a.h>

typedef enum { pause=0x0F, DzS=0x0E, Z=0x0D, Dz=0x0B, KP=0x07} STATES;
typedef struct
{
  STATES oS;
  unsigned char oD;
} PROGRAM;
flash const PROGRAM program[]={{Dz,20},{Z,20},{KP,10},{Z,30},{KP,10},{Dz,20},{KP,20},{DzS,30},{pause,10},{KP,30},{pause,10},{Dz,30},{pause,20},{Z,20},{pause,40},{DzS,30}};

interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
  static unsigned char program_counter;
  static unsigned char delay_counter;
  if(++delay_counter==program[program_counter].oD) 
  { 
    delay_counter=0; 
    if( ++program_counter==( sizeof(program)/sizeof(PROGRAM)) ){ program_counter=0; }; 
    PORTB=(PORTB&0x10)|program[program_counter].oS;
  }
  PORTB^=(1<<PORTB4);
}

void main(void)
{
  DDRB=0x1F;
  PORTB=0x1F;
  TCCR0A=0x02;  // WGM01=1 WGM00=0;  Режим CTC=0-OCRA
  TCCR0B=0x05;  // 128кГц / 1024 = 125 Гц
  OCR0A=125;     // 1 Гц по CompareA 
  TIMSK0=0x04;  // Compare Match A Interrupt
  #asm("sei")
  for(;;);
}
То что ты выложил для WinAVR с GCC код.

Вобщем, вот тебе hex - шей.
test.hex

[Исправлено: VladislavS, 02.05.2012 в 11:15]
VladislavS вне форума   Ответить с цитированием Вверх
Старый 15.05.2012, 13:36 Автор темы   29
frotnline
Новичок
 
Регистрация: 24.04.2012
Последняя активность: 25.05.2012 10:56
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Большое спасибо! Сегодня получу микросхемы, завтра буду пробовать, а то свои я уже фьюзами заблокировал! Кстати а здесь какие фьюзы должны быть выставлены?
frotnline вне форума   Ответить с цитированием Вверх
Старый 15.05.2012, 18:35 Автор темы   30
frotnline
Новичок
 
Регистрация: 24.04.2012
Последняя активность: 25.05.2012 10:56
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

И какой лучше программой прошивать, до этого использовал CodeVisionAvr и Lpt программатор?
frotnline вне форума   Ответить с цитированием Вверх
Старый 16.05.2012, 07:45   31
VladislavS
Завсегдатай Фонарёвки
 
Регистрация: 16.02.2011
Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Цитата:
Посмотреть сообщение Сообщение от frotnline :
Кстати а здесь какие фьюзы должны быть выставлены?
CKSEL0=1, CKSEL1=1 (“1” means unprogrammed ). Остальные оставь как были с завода.

Цитата:
Посмотреть сообщение Сообщение от frotnline :
И какой лучше программой прошивать
Лучше той, которой умеешь пользоваться.
VladislavS вне форума   Ответить с цитированием Вверх
Старый 18.05.2012, 18:10 Автор темы   32
frotnline
Новичок
 
Регистрация: 24.04.2012
Последняя активность: 25.05.2012 10:56
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Ну вот вчера попробовал прошить и заработало, хоть и не совсем правильно. Пришлось использовать Fuse CKDIV8=0 иначе программа работала в два раза медленнее. Странно что первый цикл программы начинается с паузы а второй уже идёт почти нормально, без паузы в начале. Но последовательность немного неправильная если придерживаться указанной последовательности в коде. Сейчас программа работатет так: pause,Z,KP,Z,KP,Dz,KP,DZs,pause,KP,pause,Dz,pause,Z,pause,Dz.
Можно ли сделать в таком порядке,как я понял с этим сложностей нет:
Dzs(30),pause(40),Z(20),pause(20),Dz(30),pause(10),KP(30),pause(10),Dzs(30),KP(20),Dz(20),KP(10),Z(30),KP(10),Z(20),Dz(20).
Кстати в какой программе собирали прошивку и можно ли увидеть код интересно до конца разобраться в программе. В любом случае спасибо что помогли, а то был код и схема из предыдущих рук, но всё черновой вариант.
frotnline вне форума   Ответить с цитированием Вверх
Старый 18.05.2012, 23:43   33
VladislavS
Завсегдатай Фонарёвки
 
Регистрация: 16.02.2011
Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Цитата:
Посмотреть сообщение Сообщение от frotnline :
Пришлось использовать Fuse CKDIV8=0 иначе программа работала в два раза медленнее.
Ну и оставь так

Цитата:
Посмотреть сообщение Сообщение от frotnline :
Странно что первый цикл программы начинается с паузы а второй уже идёт почти нормально, без паузы в начале.
Добавь перед командой разрешения прерываний команду
Код:
PORTB=(PORTB&0x10)|program[0].oS;
Цитата:
Но последовательность немного неправильная
Она просто обратная

Цитата:
Можно ли сделать в таком порядке,как я понял с этим сложностей нет:
Разрешаю Пиши любой порядок состояний какой тебе надо - всё наглядно же написано.

Цитата:
Кстати в какой программе собирали прошивку
Ты же сам назвал CodeVisionAVR. Мне собственно всё равно было в чём делать.

Цитата:
можно ли увидеть код
Он полностью приведён в том сообщении откуда ты hex скачал.

Цитата:
В любом случае спасибо что помогли
Да не за что. Надеюсь с остальным разберёшься сам.

Цитата:
а то был код и схема из предыдущих рук, но всё черновой вариант.
Если честно я вообще сомневался в реальности происходящего. Схема неправильная, код с ошибками, компилятор и тот неправильно указан. Рад что ошибался.

Если что не будет получаться - спрашивай, но надеюсь доделаешь сам ибо так полезней будет.
VladislavS вне форума   Ответить с цитированием Вверх
Старый 20.05.2012, 20:40 Автор темы   34
frotnline
Новичок
 
Регистрация: 24.04.2012
Последняя активность: 25.05.2012 10:56
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Не могли бы вы обьяснить, почему в коде порядок указан так:
{{Dz,20},{Z,20},{KP,10},{Z,30},{KP,10},{Dz,20},{KP,20},{DzS,30},{pause,10},{KP,30},{pause,10},{Dz,30},{pause,20},{Z,20},{pause,40},{DzS,30}};
а на деле выходит так:
pause,Z,KP,Z,KP,Dz,KP,DZs,pause,KP,pause,Dz,pause,Z,pause,Dz?
frotnline вне форума   Ответить с цитированием Вверх
Старый 21.05.2012, 08:00   35
VladislavS
Завсегдатай Фонарёвки
 
Регистрация: 16.02.2011
Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Цитата:
Посмотреть сообщение Сообщение от frotnline :
а на деле выходит так:
Так проходит только первый цикл? Второй идёт чётко по программе?

Я же писал, что не хватает одной команды. main должна так выглядеть:
Код:
void main(void)
{
  DDRB=0x1F;
  PORTB=0x1F;
  TCCR0A=0x02;  // WGM01=1 WGM00=0;  Режим CTC=0-OCRA
  TCCR0B=0x05;  // 128кГц / 1024 = 125 Гц
  OCR0A=125;     // 1 Гц по CompareA 
  TIMSK0=0x04;  // Compare Match A Interrupt
  
  PORTB=(PORTB&0x10)|program[0].oS; // !!!! Пропущенная команда

  #asm("sei")
  for(;;);
}
VladislavS вне форума   Ответить с цитированием Вверх
Старый 21.05.2012, 11:55   36
VladislavS
Завсегдатай Фонарёвки
 
Регистрация: 16.02.2011
Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

frotnline, пробуй
test_1.hex
VladislavS вне форума   Ответить с цитированием Вверх
Старый 21.05.2012, 22:28 Автор темы   37
frotnline
Новичок
 
Регистрация: 24.04.2012
Последняя активность: 25.05.2012 10:56
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Спасибо за помощь!!! Я уже и сам разобрался,всё скомпилировал по новой и прошил, просто не было времени отписать, так что файлы можете удалить. Всё работает на ура, осталась одна проблемка, начал точно замерять время, чтобы соответствовало указанному времени в коде, каждый сигнал работает примерно на 5 сек дольше, чем необходимо. Вот думаю тупо сделать меньше время в коде для каждого сигнала или посоветуете что-нибудь так сказать научное!

[Исправлено: frotnline, 21.05.2012 в 22:35]
frotnline вне форума   Ответить с цитированием Вверх
Старый 21.05.2012, 22:58   38
VladislavS
Завсегдатай Фонарёвки
 
Регистрация: 16.02.2011
Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Цитата:
Посмотреть сообщение Сообщение от frotnline :
каждый сигнал работает примерно на 5 сек дольше, чем необходимо.
Очень странно. Так не должно быть. Они все должны быть пропорциональны. Например, если вместо 10 секунд получилось 15, то вместо 20 будет 30, а вместо 30 соответственно 45. Так получилось?

Если честно, я никогда раньше тиньку не запускал от 128 кГц генератора. Если это он даёт такую погрешность, то очень плохо. Надо переделывать программу на 9.6 МГц генератор.

Цитата:
Посмотреть сообщение Сообщение от frotnline :
Вот думаю тупо сделать меньше время в коде для каждого сигнала или посоветуете что-нибудь так сказать научное!
Если нужно ПРОПОРЦИОНАЛЬНО уменьшить ВСЕ интервалы, то проще уменьшить значение регистра OCR0A. Тогда таймер будет быстрее считать.

А вот если уменьшить на 5 секунд надо все интервалы, то я не знаю... что-то не так с программой...

Сколько раз в минуту мигает PB4?

-------------------------------------------------------- добавлено --------------------------
Если интересно повозиться с генераторами, то можно запустить программу от 9,6 МГц. Для этого надо:
1. в самом начале main добавить две команды
CLKPR|=0x80; //Разрешить изменение прескалера
CLKPR=6; //Снизим тактовую частоту до 9.6/64 МГц
2. Изменить OCR0A=146;
3. Прошить фьюзы CKSEL1=1 и CKSEL0=0 как они шли с завода.

[Исправлено: VladislavS, 21.05.2012 в 23:27]
VladislavS вне форума   Ответить с цитированием Вверх
Старый 21.05.2012, 23:25 Автор темы   39
frotnline
Новичок
 
Регистрация: 24.04.2012
Последняя активность: 25.05.2012 10:56
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Сейчас не могу подсчитать, нет всего под рукой, но получается что если 10 секунд то на самом деле ~13-14, если 20,30, или 40 то 25,35,45. Ну примерно получается везде погрешность на 5 секунд. Да, я согласен что это странно, всмысле что непропорционально. Про PB4 сейчас точно не скажу, но точно что реже чем раз в секунду, а должно быть раз в сеекунду как я понимаю.

[Исправлено: frotnline, 21.05.2012 в 23:28]
frotnline вне форума   Ответить с цитированием Вверх
Старый 21.05.2012, 23:36   40
VladislavS
Завсегдатай Фонарёвки
 
Регистрация: 16.02.2011
Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях

По умолчанию Re: Простая моргалка на Attiny13A

Цитата:
Посмотреть сообщение Сообщение от frotnline :
Да, я согласен что это странно, всмысле что непропорционально.
Как будет возможность, выясни поточней. Потому что я не понимаю как оно может быть непропорционально.

Цитата:
Посмотреть сообщение Сообщение от frotnline :
Про PB4 сейчас точно не скажу, но точно что реже чем раз в секунду, а должно быть раз в сеекунду как я понимаю.
Не, раз в секунду меняет состояние. То есть, период 2 секунды.

А какова вообще нужна точность временных интервалов? Что это за устройство?

[Исправлено: VladislavS, 21.05.2012 в 23:42]
VladislavS вне форума   Ответить с цитированием Вверх
Ответ  Создать новую тему
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск





Copyright ©2007 - 2024, FONAREVKA.RU

Powered by vBulletin®
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Перевод: zCarot

Правила форума | Отказ от ответственности

Время генерации страницы 0.12819 секунды с 17 запросами