Добавить форум Lasers.fonarevka.ru в Избранное ×
LASERS.FONAREVKA.RU - Всё о лазерах и лазерной технике  

Вернуться   Форум Lasers.fonarevka.ru > Электроника > Микроконтроллеры
Забыли пароль? Регистрация
Темы с вашим участием Новые сообщения Сообщения за день

  • Бесплатные розыгрыши призов
  • Для гостей форума
  • Пожертвования (Donate)
На форуме ежемесячно проходят бесплатные розыгрыши призов для зарегистрированных и активно общающихся форумчан. Вы можете выиграть не только различные лазерные указки и другое лазерное оборудование, но и фонарики, зарядные устройства, аккумуляторы и другие аксессуары известных брендов, а также фонари и компоненты от известных кастомщиков и мелкосерийных производителей. Также разыгрываются и другие призы, такие как мультитулы, ножи, рюкзаки и другое снаряжение. Все проходящие розыгрыши призов являются действительно абсолютно бесплатными для самих участников, т.к. все расходы берут на себя организаторы (т.е. владельцы данного форума) и сами спонсоры, которые предоставляют тот или иной приз для наших розыгрышей призов. Форумчане не несут никаких имущественных рисков, связанных с участием в данных розыгрышах (т.е. вы ничего не оплачиваете и ничем не рискуете). Вам достаточно нажать кнопку "Принять участие" и ждать результата!

На данный момент проходит 1 розыгрыш призов.

1. Зарядное устройство XTAR XP4 Panzer + 2 аккумулятора Panasonic NCR18650B 3400 мАч

Рекомендуем Вам подписаться на тему (оптимальнее с уведомлением на ваш E-mail), где публикуется информация о новых розыгрышах призов.
Подробная информация по ссылке
Искренне рады видеть Вас на нашем независимом проекте о лазерах и лазерной технике!

Что Вам даст регистрация на нашем проекте:


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

и много других приятных привилегий

Искренне надеемся, что Вам у нас понравится!
Если вы хотите финансово поддержать работу проекта LASERS.FONAREVKA.RU, будем искренне благодарны!
Даже самая малая сумма поможет дальнейшему развитию и прогрессу нашего с вами уже общего проекта.


Ответ
Просмотров в теме 31919   Ответов в теме 149   Подписчиков на тему 0   Добавили в закладки 0
Опции темы
Старый 04.10.2010, 17:44   41
Lum1noFor
Модератор
 
Регистрация: 14.02.2010
Последняя активность: 25.11.2018 14:03
Адрес: Москва
Сообщений: 874
Сказал(а) спасибо: 1
Поблагодарили 8 раз(а) в 7 сообщениях
По умолчанию

Цитата:
Посмотреть сообщение Сообщение от SviMik :
Вторую паузу забыл
Спасибо, нашел ошибку. Исправил.
Lum1noFor вне форума   Ответить с цитированием Вверх
Старый 04.10.2010, 19:51   42
Lum1noFor
Модератор
 
Регистрация: 14.02.2010
Последняя активность: 25.11.2018 14:03
Адрес: Москва
Сообщений: 874
Сказал(а) спасибо: 1
Поблагодарили 8 раз(а) в 7 сообщениях
По умолчанию

Разобрался с АЦП. Всем спасибо за ответы.
Lum1noFor вне форума   Ответить с цитированием Вверх
Старый 04.10.2010, 21:10   43
INFERION
Старший модератор
 
Аватар для INFERION
 
Регистрация: 15.02.2010
Адрес: Украина, Полтава
Сообщений: 1498
Сказал(а) спасибо: 0
Поблагодарили 2 раз(а) в 2 сообщениях
По умолчанию

Код:
_main:
	LDI        R27, 255
	OUT        SPL+0, R27
	LDI        R27, 0
	OUT        SPL+1, R27

;Migalka.c,1 :: 		void main() {
;Migalka.c,3 :: 		PORTB.F0 = 0;
	IN         R27, PORTB+0
	CBR        R27, 1
	OUT        PORTB+0, R27
;Migalka.c,4 :: 		PORTB.F1 = 0;
	IN         R27, PORTB+0
	CBR        R27, 2
	OUT        PORTB+0, R27
;Migalka.c,5 :: 		PORTB.F2 = 0;   // Выставляем все порты в 0.
	IN         R27, PORTB+0
	CBR        R27, 4
	OUT        PORTB+0, R27
;Migalka.c,6 :: 		PORTB.F3 = 0;
	IN         R27, PORTB+0
	CBR        R27, 8
	OUT        PORTB+0, R27
;Migalka.c,7 :: 		PORTB.F4 = 0;
	IN         R27, PORTB+0
	CBR        R27, 16
	OUT        PORTB+0, R27
;Migalka.c,9 :: 		DDRB.F0 = 1;
	IN         R27, DDRB+0
	SBR        R27, 1
	OUT        DDRB+0, R27
;Migalka.c,10 :: 		DDRB.F1 = 1;
	IN         R27, DDRB+0
	SBR        R27, 2
	OUT        DDRB+0, R27
;Migalka.c,11 :: 		DDRB.F2 = 1;   // Выставляем направление порта на выход.
	IN         R27, DDRB+0
	SBR        R27, 4
	OUT        DDRB+0, R27
;Migalka.c,12 :: 		DDRB.F3 = 1;
	IN         R27, DDRB+0
	SBR        R27, 8
	OUT        DDRB+0, R27
;Migalka.c,13 :: 		DDRB.F4 = 1;
	IN         R27, DDRB+0
	SBR        R27, 16
	OUT        DDRB+0, R27
;Migalka.c,15 :: 		while( 1 ) {           // Циклим программу.
L_main0:
;Migalka.c,16 :: 		PORTB.F0 = 1;         // Включаем первый светодиод.
	IN         R27, PORTB+0
	SBR        R27, 1
	OUT        PORTB+0, R27
;Migalka.c,17 :: 		Delay_ms( 500 );     // Ждем 0.5 секунд.
	LDI        R18, lo_addr(R3)
	LDI        R17, 138
	LDI        R16, 86
L_main2:
	DEC        R16
	BRNE       L_main2
	DEC        R17
	BRNE       L_main2
	DEC        R18
	BRNE       L_main2
	NOP
	NOP
;Migalka.c,18 :: 		PORTB.F0 = 0;         // Выключаем первый светодиод.
	IN         R27, PORTB+0
	CBR        R27, 1
	OUT        PORTB+0, R27
;Migalka.c,19 :: 		PORTB.F1 = 1;         // Включаем второй светодиод.
	IN         R27, PORTB+0
	SBR        R27, 2
	OUT        PORTB+0, R27
;Migalka.c,20 :: 		Delay_ms( 500 );     // Ждем 0.5 секунд.
	LDI        R18, lo_addr(R3)
	LDI        R17, 138
	LDI        R16, 86
L_main4:
	DEC        R16
	BRNE       L_main4
	DEC        R17
	BRNE       L_main4
	DEC        R18
	BRNE       L_main4
	NOP
	NOP
;Migalka.c,21 :: 		PORTB.F1 = 0;         // Выключаем второй светодиод.
	IN         R27, PORTB+0
	CBR        R27, 2
	OUT        PORTB+0, R27
;Migalka.c,22 :: 		PORTB.F2 = 1;         // Включаем третий светодиод.
	IN         R27, PORTB+0
	SBR        R27, 4
	OUT        PORTB+0, R27
;Migalka.c,23 :: 		Delay_ms( 500 );     // Ждем 0.5 секунд.
	LDI        R18, lo_addr(R3)
	LDI        R17, 138
	LDI        R16, 86
L_main6:
	DEC        R16
	BRNE       L_main6
	DEC        R17
	BRNE       L_main6
	DEC        R18
	BRNE       L_main6
	NOP
	NOP
;Migalka.c,24 :: 		PORTB.F2 = 0;         // Выключаем третий светодиод.
	IN         R27, PORTB+0
	CBR        R27, 4
	OUT        PORTB+0, R27
;Migalka.c,25 :: 		PORTB.F3 = 1;         // Включаем четвертый светодиод.
	IN         R27, PORTB+0
	SBR        R27, 8
	OUT        PORTB+0, R27
;Migalka.c,26 :: 		Delay_ms( 500 );     // Ждем 0.5 секунд.
	LDI        R18, lo_addr(R3)
	LDI        R17, 138
	LDI        R16, 86
L_main8:
	DEC        R16
	BRNE       L_main8
	DEC        R17
	BRNE       L_main8
	DEC        R18
	BRNE       L_main8
	NOP
	NOP
;Migalka.c,27 :: 		PORTB.F3 = 0;         // Выключаем четвертый светодиод.
	IN         R27, PORTB+0
	CBR        R27, 8
	OUT        PORTB+0, R27
;Migalka.c,28 :: 		PORTB.F4 = 1;         // Включаем пятый светодиод.
	IN         R27, PORTB+0
	SBR        R27, 16
	OUT        PORTB+0, R27
;Migalka.c,29 :: 		Delay_ms( 500 );     // ЖЖдем 0.5 секунд.
	LDI        R18, lo_addr(R3)
	LDI        R17, 138
	LDI        R16, 86
L_main10:
	DEC        R16
	BRNE       L_main10
	DEC        R17
	BRNE       L_main10
	DEC        R18
	BRNE       L_main10
	NOP
	NOP
;Migalka.c,30 :: 		PORTB.F4 = 0;         // Выключаем пятый светодиод.
	IN         R27, PORTB+0
	CBR        R27, 16
	OUT        PORTB+0, R27
;Migalka.c,32 :: 		PORTB.F3 = 1;         // Включаем четвертый светодиод.
	IN         R27, PORTB+0
	SBR        R27, 8
	OUT        PORTB+0, R27
;Migalka.c,33 :: 		Delay_ms( 500 );     // Ждем 0.5 секунд.
	LDI        R18, lo_addr(R3)
	LDI        R17, 138
	LDI        R16, 86
L_main12:
	DEC        R16
	BRNE       L_main12
	DEC        R17
	BRNE       L_main12
	DEC        R18
	BRNE       L_main12
	NOP
	NOP
;Migalka.c,34 :: 		PORTB.F3 = 0;         // Выключаем четвертый светодиод.
	IN         R27, PORTB+0
	CBR        R27, 8
	OUT        PORTB+0, R27
;Migalka.c,35 :: 		PORTB.F2 = 1;         // Включаем третий светодиод.
	IN         R27, PORTB+0
	SBR        R27, 4
	OUT        PORTB+0, R27
;Migalka.c,36 :: 		Delay_ms( 500 );     // Ждем 0.5 секунд.
	LDI        R18, lo_addr(R3)
	LDI        R17, 138
	LDI        R16, 86
L_main14:
	DEC        R16
	BRNE       L_main14
	DEC        R17
	BRNE       L_main14
	DEC        R18
	BRNE       L_main14
	NOP
	NOP
;Migalka.c,37 :: 		PORTB.F2 = 0;         // Выключаем третий светодиод.
	IN         R27, PORTB+0
	CBR        R27, 4
	OUT        PORTB+0, R27
;Migalka.c,38 :: 		PORTB.F1 = 1;         // Включаем второй светодиод.
	IN         R27, PORTB+0
	SBR        R27, 2
	OUT        PORTB+0, R27
;Migalka.c,39 :: 		Delay_ms( 500 );     // Ждем 1 секунду.
	LDI        R18, lo_addr(R3)
	LDI        R17, 138
	LDI        R16, 86
L_main16:
	DEC        R16
	BRNE       L_main16
	DEC        R17
	BRNE       L_main16
	DEC        R18
	BRNE       L_main16
	NOP
	NOP
;Migalka.c,40 :: 		PORTB.F1 = 0;         // Выключаем второй светодиод.
	IN         R27, PORTB+0
	CBR        R27, 2
	OUT        PORTB+0, R27
;Migalka.c,42 :: 		}
	JMP        L_main0
;Migalka.c,43 :: 		}
L_end_main:
	JMP        L_end_main
; end of _main
Интересно, насколько быстрее и компактнее получится тоже самое, но написанное на ассемблере . В МК есть же таймеры, зачем считать интервалы программно? Это же полностью загружает камень, его и не отвлечь на другие операции...
Не, не,не. Не заставите вы меня пересесть на язык высокого уровня. Это же жесть полная!..
Как освобожусь - напишу эту мигалку на ассемблере, для сравнения ...

[Исправлено: Hobbi TV, 04.10.2010 в 22:11].
INFERION вне форума   Ответить с цитированием Вверх
Старый 04.10.2010, 22:05   44
yuri
Лазеростроитель
 
Аватар для yuri
 
Регистрация: 12.02.2010
Последняя активность: 15.02.2011 21:41
Адрес: Москва
Сообщений: 292
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
По умолчанию

Цитата:
Посмотреть сообщение Сообщение от INFERION :
Интересно, насколько быстрее
На ассемблере даже 600-миллисекундные паузы выполняются в 10 раз быстрее, чем на Си!
__________________
yuri вне форума   Ответить с цитированием Вверх
Старый 04.10.2010, 23:04   45
AVSel
Глобальный модератор
 
Аватар для AVSel
 
Регистрация: 15.02.2010
Последняя активность: 26.05.2019 20:08
Адрес: Москва
Сообщений: 3138
Сказал(а) спасибо: 79
Поблагодарили 107 раз(а) в 76 сообщениях
По умолчанию

Цитата:
Посмотреть сообщение Сообщение от yuri :
На ассемблере даже 600-миллисекундные паузы выполняются в 10 раз быстрее, чем на Си!
+1
AVSel вне форума   Ответить с цитированием Вверх
Старый 05.10.2010, 01:05   46
INFERION
Старший модератор
 
Аватар для INFERION
 
Регистрация: 15.02.2010
Адрес: Украина, Полтава
Сообщений: 1498
Сказал(а) спасибо: 0
Поблагодарили 2 раз(а) в 2 сообщениях
По умолчанию

Написал бегущий огонёк на ассемблере :
Код:
;Бегущий огонь на ATtiny13. Тактовая 128кГц.

	.INCLUDE "tn13def.inc"

;Векторы прерываний:

	rjmp	RESET
	.ORG	0x0006
	rjmp	compA
	.ORG	0x000A


;Конфигурация:

RESET:	ldi	R16, 0b10000000	;Отключить аналоговый компаратор
	out	ACSR, R16

	ldi	R16, 0b100000	;Разрешить Sleep, режим idle
	out	MCUCR, R16

	ser	R16		;Все порты на выход
	out	DDRB, R16

	ldi	R16, 0b100	;Включить прерывание compA
	out	TIMSK0, R16

	ldi	R16, 0b101	;Предделитель таймера на 1024
	out	TCCR0B, R16

	ldi	R16, 1		;Начинать с PB0


;Программа:

compA:	out	PORTB, R16	;Вывести бит в порт
	lsl	R16		;Сдвинуть бит влево
	sbrc	R16, 5		;При зашкаливании переместить бит в начало
	ldi	R16, 1
	in	R17, TCNT0	;Установить компаратор на срабатывание через 125 тактов таймера
	subi	R17, -125
	out	OCR0A, R17
	sei			;Разрешить прерывания
	Sleep
44 байта, их них только 18 байт непосредственно программа. Почти всё время МК спит и его можно спокойно заставить делать параллельно что-то ещё. Прогнал через симулятор, заработал с пол пинка...

[Исправлено: INFERION, 05.10.2010 в 01:22].
INFERION вне форума   Ответить с цитированием Вверх
Старый 05.10.2010, 01:21   47
SviMik
Администратор
 
Аватар для SviMik
 
Регистрация: 26.02.2010
Последняя активность: 18.08.2015 20:47
Адрес: Tallinn, Estonia
Сообщений: 1101
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
По умолчанию

Цитата:
зачем считать интервалы программно?
потому что сишнику проще написать Delay_ms() и компилятор накодит сам, чем настроить таймер и прерывания
SviMik вне форума   Ответить с цитированием Вверх
Старый 09.10.2010, 21:16   48
Gall
Старший научный сотрудник
 
Аватар для Gall
 
Регистрация: 21.06.2010
Последняя активность: 02.08.2015 01:26
Адрес: Екатеринбург
Сообщений: 205
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
По умолчанию

Цитата:
Посмотреть сообщение Сообщение от Lum1noFor :
Gall, ну прям личный репетитор . Не совсем разобрался со знаком "<<" - зачем нужен этот сдвиг? И чем "не правильна" такая мигалка:
Об этом лучше скажет компилятор.
Код:
#include <avr/io.h>

void main () {
    PORTB.F3 = 0; // Выставляем ноль на выходе порта. F3 - это порт PB3.
    DDRB.F3 = 1; // Выставляем порт на выход.

    while (1) // Циклим прогу.
    {
        PORTB.F3 = 1; // Включаем светодиод
        Delay_ms (600); // Ждем 600 мСек.
        PORTB.F3 = 0; // Выключаем светодиод.
        Delay_ms (600);
    }
}
Код:
blinke.c:3: error: return type of ‘main’ is not ‘int’
blinke.c: In function ‘main’:
blinke.c:4: error: request for member ‘F3’ in something not a structure or union
blinke.c:4:19: error: C++ style comments are not allowed in ISO C90
blinke.c:4:19: error: (this will be reported only once per input file)
blinke.c:5: error: request for member ‘F3’ in something not a structure or union
blinke.c:9: error: request for member ‘F3’ in something not a structure or union
blinke.c:10: error: implicit declaration of function ‘Delay_ms’
blinke.c:11: error: request for member ‘F3’ in something not a structure or union
Gall вне форума   Ответить с цитированием Вверх
Старый 09.10.2010, 21:36   49
Gall
Старший научный сотрудник
 
Аватар для Gall
 
Регистрация: 21.06.2010
Последняя активность: 02.08.2015 01:26
Адрес: Екатеринбург
Сообщений: 205
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
По умолчанию

Цитата:
Посмотреть сообщение Сообщение от INFERION :
Интересно, насколько быстрее и компактнее получится тоже самое, но написанное на ассемблере . В МК есть же таймеры, зачем считать интервалы программно? Это же полностью загружает камень, его и не отвлечь на другие операции...
Если компилировать с опцией -Os, то как правило написанны на Си код оказывается компактнее (компилятор пишет ассемблер лучше, чем человек).

Что же касается таймеров, то загвоздка в том, что количество аппаратных таймеров ограничено. Если какая-то там мигалка светодиодом хавает целый таймер под свои нужды без возможностей заменить его на программную реализацию при необходимости, в сложной программе возможна катастрофа. К сожалению, реально решить эту проблему может только C++. Вот так на нем выглядит мигалка с аппаратным таймером:

Код:
int main() {
    PulseGenerator<OutSinglePin<PortB, 0>, HardwareDelay> generator;
    generator.generate(500, 500);
    return 0;
}
А вот так - с программным:
Код:
int main() {
    PulseGenerator<OutSinglePin<PortB, 0>, SoftwareDelay> generator;
    generator.generate(500, 500);
    return 0;
}
Полученный код на Ассемблере с аппаратным таймером занимает 7 команд в цикле, не считая инициализации. Важно то, что инициализацию компилятор вставит сам совершенно автоматически, что позволяет очень легко использовать один и тот же исходный текст прошивки для совершенно разных контроллеров, разных схем с деталями на разных портах и т.п. Это позволяет, например, компилировать один и тот же код для atmega с аппаратным таймером и схемой на порту D и для attiny с программным таймером и схемой на порту B. В самой программе достаточно лишь изменить два слова. Можно пойти дальше - компилятор знает марку процессора, поэтому можно сделать, чтобы при наличии аппаратной реализации, например, i2c компилятор использовал ее, а при отсутствии - автоматически заменял на программную. У меня есть сделанные подобным образом драйверы для ks0066-совместимых дисплеев, часов реального времени i2c, динамической индикации на произвольное число сегментов, универсальный приемник ИК ДУ и кое-какой еще код.

Вот пример простейшего кода, демонстрирующий работу компилятора.
Код:
#include <avr/io.h>

int main() {
    DDRB |= (1 << 3);
    while (1) {
        PORTB |= (1 << 3);
        asm volatile ("nop");
        PORTB &= ~(1 << 3);
        asm volatile ("nop");
    }
    return 0;
}
Сгенерированный ассемблер (комментарии и прочий хлам я вырезал, gcc -S -Os -mmcu=atmega8 ):
Код:
        sbi 55-32,3
.L2:
        sbi 56-32,3
        nop
        cbi 56-32,3
        nop
        rjmp .L2

[Исправлено: Gall, 09.10.2010 в 22:41].
Gall вне форума   Ответить с цитированием Вверх
Старый 09.10.2010, 22:33   50
Gall
Старший научный сотрудник
 
Аватар для Gall
 
Регистрация: 21.06.2010
Последняя активность: 02.08.2015 01:26
Адрес: Екатеринбург
Сообщений: 205
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
По умолчанию

Цитата:
Посмотреть сообщение Сообщение от Lum1noFor :
Вобщем, мне нужно учиться С с нуля, а потом уже хвататься за микроконтроллеры... Что такое #define, void и т.д., я не знаю. Буду учить матчасть
void - тип данных "пусто". Функция, для которой указано возвращаемое значение типа "void", не возвращает ничего (в Паскале это называется "процедура"). Переменную типа void объявить нельзя.

#define - объявление макроса. Например:
#define foo abc+def
- примерно то же самое, что нажать в редакторе "найти foo, заменить везде на abc+def". Использование #define может привести к очень неочевидным результатам, поэтому его не рекомендуется использовать никогда (или почти никогда).
Gall вне форума   Ответить с цитированием Вверх
Старый 10.10.2010, 14:36   51
yuri
Лазеростроитель
 
Аватар для yuri
 
Регистрация: 12.02.2010
Последняя активность: 15.02.2011 21:41
Адрес: Москва
Сообщений: 292
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
По умолчанию

Gall, какие есть стандартные библиотеки C++ для программирования авр, совместимые с avr-gcc, и где почитать к ним инструкции?
yuri вне форума   Ответить с цитированием Вверх
Старый 10.10.2010, 15:29   52
yuri
Лазеростроитель
 
Аватар для yuri
 
Регистрация: 12.02.2010
Последняя активность: 15.02.2011 21:41
Адрес: Москва
Сообщений: 292
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
По умолчанию

Цитата:
Посмотреть сообщение Сообщение от Gall :
Например:
#define foo abc+def
- примерно то же самое, что нажать в редакторе "найти foo, заменить везде на abc+def". Использование #define может привести к очень неочевидным результатам, поэтому его не рекомендуется использовать никогда (или почти никогда).
Первый раз слышу, честно говоря. K&R рекомендуют как хороший стиль программирования определять через #define все константы, кроме 0 и 1.

Чтобы не было неочевидных результатов, достаточно писать #define foo (abc+def), и тогда никаких неочевидных результатов (типа foo*bar -> abc+def*bar) не будет. Вся avr-libc это почти что одни макросы, и ничего, работает.
yuri вне форума   Ответить с цитированием Вверх
Старый 11.10.2010, 05:53   53
SviMik
Администратор
 
Аватар для SviMik
 
Регистрация: 26.02.2010
Последняя активность: 18.08.2015 20:47
Адрес: Tallinn, Estonia
Сообщений: 1101
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
По умолчанию

Gall Хорошо, когда человек разбирается в предмете как ты. У него и Си может скомпилиться не хуже, чем человек напишет на ассемблере.
Но, как правило, многие пишут мигалки на Си, даже не зная про опции оптимизации компилятора. И общая тенденция такова, что средняя прошивка на Си - это нечто обьёмное, медленное, а программист даже понятия не имеет, что эти действия могли бы выполниться быстрее (даже если он и заглянет в листинг ассемблера (а большинство про него и не вспоминают), он всё равно не сможет оценить результат (потому что не знает, много это или мало для ассемблера. потому что и ассемблер большинство Сишников совершенно не знает!)).

А вот на ассемблере прошивка никогда не получится слишком утяжелённой. Человек физически не сможет наплохокодить так, как может по дефолту Си
SviMik вне форума   Ответить с цитированием Вверх
Старый 11.10.2010, 15:12   54
Gall
Старший научный сотрудник
 
Аватар для Gall
 
Регистрация: 21.06.2010
Последняя активность: 02.08.2015 01:26
Адрес: Екатеринбург
Сообщений: 205
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
По умолчанию

Цитата:
Посмотреть сообщение Сообщение от yuri :
Первый раз слышу, честно говоря. K&R рекомендуют как хороший стиль программирования определять через #define все константы, кроме 0 и 1.

Чтобы не было неочевидных результатов, достаточно писать #define foo (abc+def), и тогда никаких неочевидных результатов (типа foo*bar -> abc+def*bar) не будет. Вся avr-libc это почти что одни макросы, и ничего, работает.
Хрестоматийный пример:
Код:
#define max(a,b) (a > b ? a : b)
c = max(a++, b++);
На современных компиляторах static const для переменных и static inline для функций работает не хуже. Это более C++-ный стиль, нежели C-шный, но зато и более безопасный.
Gall вне форума   Ответить с цитированием Вверх
Старый 11.10.2010, 15:24   55
Gall
Старший научный сотрудник
 
Аватар для Gall
 
Регистрация: 21.06.2010
Последняя активность: 02.08.2015 01:26
Адрес: Екатеринбург
Сообщений: 205
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
По умолчанию

Цитата:
Посмотреть сообщение Сообщение от SviMik :
Gall Хорошо, когда человек разбирается в предмете как ты. У него и Си может скомпилиться не хуже, чем человек напишет на ассемблере.
Но, как правило, многие пишут мигалки на Си, даже не зная про опции оптимизации компилятора. И общая тенденция такова, что средняя прошивка на Си - это нечто обьёмное, медленное, а программист даже понятия не имеет, что эти действия могли бы выполниться быстрее
В случае с gcc - это не совсем так. Достаточно поставить "волшебную" опцию -Os, и компилятор сделает все остальное. И очень рекомендуется добавить опции -Wall -Wextra --pedantic , чтобы компилятор буквоедствовал по отношению ко всем неточностям написания - это быстро дисциплинирует. При программировании несложных вещей вроде мигалок на Си можно даже особо не следить за ресурсами процессора, потому что запас под несколько сотен лишних команд всегда есть. А с опытом приходит умение делать gcc -S и мелко оптимизировать программу, и к тому времени, как прошивки станут сложнее, проблем с оптимальностью уже не будет.

Что касается кода на Ассемблере, то основная его проблема - это то, что его тяжело переделывать. В процессе отладки схемы на макетке часто приходится, например, поменять местами пару проводов для удобства разводки платы - или наоборот, для удобства программирования. Иногда в программу приходится добавлять совершенно новую функциональность - подключили что-то дополнительное. Ассемблерный код тут плохой помощник. Не говоря уже про то, что на Си можно написать 100 строк нетривиальной программы, скомпилировать, прошить - и оно СРАЗУ начнет правильно работать, потому что ошибки отловит компилятор.

Добавлено через 3 минуты
Цитата:
Посмотреть сообщение Сообщение от yuri :
Gall, какие есть стандартные библиотеки C++ для программирования авр, совместимые с avr-gcc, и где почитать к ним инструкции?
Основная библиотека - это avr-libc, распространяемая в комплекте с avr-gcc. http://www.nongnu.org/avr-libc/ . Эта библиотека содержит достаточно оптимально написанные функции, похожие на функции обычного Си (например, sqrt() и printf() ), а также низкоуровневые утилиты для работы с периферией процессора.

Большое количество различных готовых библиотек можно скачать на http://avrfreaks.net
Gall вне форума   Ответить с цитированием Вверх
Старый 11.10.2010, 18:25   56
AVSel
Глобальный модератор
 
Аватар для AVSel
 
Регистрация: 15.02.2010
Последняя активность: 26.05.2019 20:08
Адрес: Москва
Сообщений: 3138
Сказал(а) спасибо: 79
Поблагодарили 107 раз(а) в 76 сообщениях
По умолчанию

Gall прав. Ассемблер хорош, пока не приходилось перетаскивать код на другой процессор/ платформу. Любому поклоннику ассемблера oбычно хватает одного раза. Лучше сразу Си учить
AVSel вне форума   Ответить с цитированием Вверх
Старый 11.10.2010, 21:11   57
yuri
Лазеростроитель
 
Аватар для yuri
 
Регистрация: 12.02.2010
Последняя активность: 15.02.2011 21:41
Адрес: Москва
Сообщений: 292
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
По умолчанию

На avrfreaks именно плюсовых библиотек не густо, причём все они для AVR32. Сделать на основе avr-libc что-то вроде описанного таймера или драйвера UART можно, но не хотелось бы изобретать велосипед.
yuri вне форума   Ответить с цитированием Вверх
Старый 18.10.2010, 23:18   58
INFERION
Старший модератор
 
Аватар для INFERION
 
Регистрация: 15.02.2010
Адрес: Украина, Полтава
Сообщений: 1498
Сказал(а) спасибо: 0
Поблагодарили 2 раз(а) в 2 сообщениях
По умолчанию

Народ, кто-нибудь связывался с HV программированием? С протоколом разобрался, но не могу вывести МК в режим программирования. В даташите говорится, что надо плясать с бубном над временными интервалами. Мол включили 5V, подождали 20...60мкс, подали на ресет 12V, подождали ещё столько-то и т.д. Это получается мне надо городить огород на ключах, и ставить вместо 13-й тиньки сороконожку, чтоб ими рулить. У меня под рукой только 8-ми лапые МК, я могу включать преобразователь, но он явно за 20мкс не успеет набрать 12V (LM27313). Смотрю на готовые схемы HV программаторов - там особо с этим и не заморачиваются. +5V вообще не коммутируется. Просто я не хочу лепить лишний огород, если в нём нет необходимости. Кто что подскажет мне интересного по этому поводу?..
INFERION вне форума   Ответить с цитированием Вверх
Старый 19.10.2010, 17:06   59
Gall
Старший научный сотрудник
 
Аватар для Gall
 
Регистрация: 21.06.2010
Последняя активность: 02.08.2015 01:26
Адрес: Екатеринбург
Сообщений: 205
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
По умолчанию

На самом деле важно, чтобы после подачи питания 5 вольт и до подачи 12 вольт контроллер успел "прогреться" и начать работать. Подавать 12 вольт надо резко, качать преобразователем нельзя, нужен отдельный ключ. В остальном ничего особенного нету. В принципе можно подавать 5 и 12 вольт через оптроны 4N35 в качестве реле, чтобы проще. Тока хватит. Или даже питать прошиваемый МК от обычного порта прошивающего.

Как правило, HV-программатор нужен для перепрошивки контроллера после неправильно прошитых фуз, чтобы не выбрасывать хорошую вещь. Поэтому можно сделать упрощенный программатор, который умеет только стирать контроллеры, а шить прошивку уже обычным внутрисхемным. Особенно это ценно для многоногих контроллеров, где такой подход позволяет не подключать индивидуально каждый вывод прошиваемого МК, а параллелить выводы.
Gall вне форума   Ответить с цитированием Вверх
Старый 20.10.2010, 01:30   60
INFERION
Старший модератор
 
Аватар для INFERION
 
Регистрация: 15.02.2010
Адрес: Украина, Полтава
Сообщений: 1498
Сказал(а) спасибо: 0
Поблагодарили 2 раз(а) в 2 сообщениях
По умолчанию

Я восстановитель фьюзов и собрал. Просто мне нужно запрограммировать RSTDISBL, но к чему это приведёт думаю можно не объяснять...
Я уже влепил в схему два ключа на сдвоенном полевике. Рулить ими буду с одной лапы МК. Один закрывается, другой открывается. Преобразователь работает постоянно и МК программатора подождёт пока он накопит достаточное напряжение.

Я подавал резко 12V. МК сбрасывается, но не шьётся. Как я понял - есть у него таймер на 64мс, который заводится при подаче питания, и если время истекло - МК не войдёт в режим программирования. Подавать же на ресет 12V, если на Vcc меньше вольта - недопустимо. Вот и приходится плясать с бубном. Во всяком случае так в даташите сказано. Соберу схему с ключами и думаю она заведётся . Спасибо за внимание, вопросов пока не имею...

Добавлено:
Запустил, работает . Фьюзы шьются и верифицируются за доли секунды.

[Исправлено: INFERION, 21.10.2010 в 10:08].
INFERION вне форума   Ответить с цитированием Вверх
Ответ


Здесь присутствуют: 4 (пользователей: 0 , гостей: 4)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекомедации для начинающих AVSel FAQ 59 07.12.2015 14:05
Микроконтроллеры серии STM32 (ARM Cortex M3) INFERION Микроконтроллеры 44 06.12.2012 00:03
Микроконтроллеры PIC и среда разработки MPLAB Lum1noFor Микроконтроллеры 0 15.09.2012 22:50
электроника для начинающих! spartanec Электроника для начинающих 24 16.11.2010 03:48


Текущее время: 13:58. Часовой пояс GMT +4.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2020, vBulletin Solutions, Inc. Перевод: zCarot
Template-Modifications by TMS

Copyright ©2010 - 2015, Hobbi.TV & FONAREVKA.RU.

Если Вы не являетесь правообладателем того или иного контента размещенного на форуме (фото/видео/текст),
то при любом использовании материалов форума необходимо получить письменное разрешение
на использование того или иного материала у администрации форума.

При использовании материалов форума ссылка на Lasers.fonarevka.ru обязательна.

Украинский портАл CATALOG.METKA.RU
Каталог webplus.info Каталог сайтов Zabor.com