|
|
|
26440 46 2 0 |
|
Опции темы | Поиск в этой теме |
01.05.2012, 15:38 | 21 |
Завсегдатай Фонарёвки
Регистрация: 16.02.2011 Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях
|
Re: Простая моргалка на Attiny13A
А по мне так очень даже симпатично. PB4 зачем-то дёргать и неопределённое начальное состояние PORTB в первом проходе цикла - вот это некрасиво!
Не просто 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); } } Интересная у нас темка получается, придумываем сами себе левые задачки, а вопрошающий и не чухается с ответами... |
01.05.2012, 18:05 | 22 |
|
Re: Простая моргалка на Attiny13A
|
01.05.2012, 20:51 | 23 |
Консультант
Регистрация: 15.11.2010 Последняя активность: 26.04.2024 09:58 Адрес: Москва
Сообщений: 8206
Сказал(а) спасибо: 1077
Поблагодарили: 1713 раз(а) в 912 сообщениях
|
Re: Простая моргалка на Attiny13A
ИМХО: Комментарии для каждой строки - это уже маразм. Какой смысл комментировать сдвиг влево на один бит, что это сдвиг влево на один бит Вот комментировать переменные, и функции, если их смысл из названия непонятен - вполне желательно.
|
01.05.2012, 22:35 | 24 |
Завсегдатай Фонарёвки
Регистрация: 28.05.2010 Последняя активность: 22.12.2013 16:40 Адрес: msk
Сообщений: 843
Сказал(а) спасибо: 0
Поблагодарили: 80 раз(а) в 53 сообщениях
|
Re: Простая моргалка на Attiny13A
Понятно, что каждую строку комментировать не надо. А факт, что прозрачный сейчас код через неделю без комментариев станет галиматьей, надо четко представлять. В нашем примере#21 PORTB=0; нет в тз, в коде-есть, я-бы это отметил (какие-то соображения были, чтобы его вставить?).
|
01.05.2012, 22:45 | 25 |
Новичок
Регистрация: 24.04.2012 Последняя активность: 25.05.2012 10:56
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях
|
Re: Простая моргалка на Attiny13A
Свасибо за ваши советы, буду пробовать! Да в схеме напутал с питанием, на деле собрано правильно! Использую для компиляции CodeVisionAVR. Кстати, тот код что я выложил нормально компилируется. Какие заводские FUSE у Attiny13A, а то я уже их менял, а листок с исходными потерял.
[Исправлено: frotnline, 01.05.2012 в 23:02] |
01.05.2012, 23:35 | 26 |
Завсегдатай Фонарёвки
Регистрация: 28.05.2010 Последняя активность: 22.12.2013 16:40 Адрес: msk
Сообщений: 843
Сказал(а) спасибо: 0
Поблагодарили: 80 раз(а) в 53 сообщениях
|
Re: Простая моргалка на Attiny13A
#13
|
02.05.2012, 08:57 | 27 |
Завсегдатай Фонарёвки
Регистрация: 16.02.2011 Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях
|
Re: Простая моргалка на Attiny13A
Это есть не может быть, потому что не может быть никогда. Я даже глазами там ошибки вижу. А уж компилятор там будет вопить.
Начни вот с этого кода: Код:
#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(;;); } [Исправлено: VladislavS, 02.05.2012 в 09:00] |
02.05.2012, 10:27 | 28 |
Завсегдатай Фонарёвки
Регистрация: 16.02.2011 Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях
|
Re: Простая моргалка на Attiny13A
Что очень даже сомнительно. Смотри какой код для него должен быть.
Код:
#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(;;); } Вобщем, вот тебе hex - шей. test.hex [Исправлено: VladislavS, 02.05.2012 в 11:15] |
15.05.2012, 13:36 | 29 |
Новичок
Регистрация: 24.04.2012 Последняя активность: 25.05.2012 10:56
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях
|
Re: Простая моргалка на Attiny13A
Большое спасибо! Сегодня получу микросхемы, завтра буду пробовать, а то свои я уже фьюзами заблокировал! Кстати а здесь какие фьюзы должны быть выставлены?
|
15.05.2012, 18:35 | 30 |
Новичок
Регистрация: 24.04.2012 Последняя активность: 25.05.2012 10:56
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях
|
Re: Простая моргалка на Attiny13A
И какой лучше программой прошивать, до этого использовал CodeVisionAvr и Lpt программатор?
|
16.05.2012, 07:45 | 31 |
Завсегдатай Фонарёвки
Регистрация: 16.02.2011 Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях
|
Re: Простая моргалка на Attiny13A
|
18.05.2012, 18:10 | 32 |
Новичок
Регистрация: 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). Кстати в какой программе собирали прошивку и можно ли увидеть код интересно до конца разобраться в программе. В любом случае спасибо что помогли, а то был код и схема из предыдущих рук, но всё черновой вариант. |
18.05.2012, 23:43 | 33 | ||||||||
Завсегдатай Фонарёвки
Регистрация: 16.02.2011 Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях
|
Re: Простая моргалка на Attiny13A
Цитата:
Цитата:
Код:
PORTB=(PORTB&0x10)|program[0].oS; Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Если что не будет получаться - спрашивай, но надеюсь доделаешь сам ибо так полезней будет. |
||||||||
20.05.2012, 20:40 | 34 |
Новичок
Регистрация: 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? |
21.05.2012, 08:00 | 35 |
Завсегдатай Фонарёвки
Регистрация: 16.02.2011 Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях
|
Re: Простая моргалка на Attiny13A
Так проходит только первый цикл? Второй идёт чётко по программе?
Я же писал, что не хватает одной команды. 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(;;); } |
21.05.2012, 11:55 | 36 |
Завсегдатай Фонарёвки
Регистрация: 16.02.2011 Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях
|
Re: Простая моргалка на Attiny13A
frotnline, пробуй
test_1.hex |
21.05.2012, 22:28 | 37 |
Новичок
Регистрация: 24.04.2012 Последняя активность: 25.05.2012 10:56
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях
|
Re: Простая моргалка на Attiny13A
Спасибо за помощь!!! Я уже и сам разобрался,всё скомпилировал по новой и прошил, просто не было времени отписать, так что файлы можете удалить. Всё работает на ура, осталась одна проблемка, начал точно замерять время, чтобы соответствовало указанному времени в коде, каждый сигнал работает примерно на 5 сек дольше, чем необходимо. Вот думаю тупо сделать меньше время в коде для каждого сигнала или посоветуете что-нибудь так сказать научное!
[Исправлено: frotnline, 21.05.2012 в 22:35] |
21.05.2012, 22:58 | 38 | |
Завсегдатай Фонарёвки
Регистрация: 16.02.2011 Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях
|
Re: Простая моргалка на Attiny13A
Очень странно. Так не должно быть. Они все должны быть пропорциональны. Например, если вместо 10 секунд получилось 15, то вместо 20 будет 30, а вместо 30 соответственно 45. Так получилось?
Если честно, я никогда раньше тиньку не запускал от 128 кГц генератора. Если это он даёт такую погрешность, то очень плохо. Надо переделывать программу на 9.6 МГц генератор. Цитата:
А вот если уменьшить на 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] |
|
21.05.2012, 23:25 | 39 |
Новичок
Регистрация: 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] |
21.05.2012, 23:36 | 40 | |
Завсегдатай Фонарёвки
Регистрация: 16.02.2011 Последняя активность: 22.05.2017 13:07
Сообщений: 731
Сказал(а) спасибо: 4
Поблагодарили: 177 раз(а) в 92 сообщениях
|
Re: Простая моргалка на Attiny13A
Как будет возможность, выясни поточней. Потому что я не понимаю как оно может быть непропорционально.
Цитата:
А какова вообще нужна точность временных интервалов? Что это за устройство? [Исправлено: VladislavS, 21.05.2012 в 23:42] |
|