Ассемблер (ASM) для AVR в вопросах и ответах
И еще нескромный вопрос, сколько вам лет?
Ставим плюсы: )
- Реклама
Мой пост выше. Это совсем меняет дело. Я сам вижу, что что-то у меня не так. Тем более мне 3 человека утверждают, что я ошибаюсь. Не я ошибаюсь, а мой компилятор тупит. Сейчас переустановлю и посмотрю. О результате доложу.DX168B писал(а):Кстати, вспомнил. У меня недавно был сбойный сектор на HDD в районе Студии. Возможно это из-за него. Сектор восстановил, но Студию придётся как я понял переустанавливать.
I am DX168B and this is my favourite forum on internet!
Ну всё правильно.
00000000
OR
00000001
OR
00001010
=
00001011
= 0x0B
Эту константу и заносите в регистр
00000000
OR
00000001
OR
00001010
=
00001011
= 0x0B
Эту константу и заносите в регистр
один из миллиона вероятность того, что это битый сектор HDD. уверен на 99% в природной упертости и на 99% в трусости.
Ставим плюсы: )
это вы к этому куску кода?ploop писал(а):Ну всё правильно.
00000000
OR
00000001
OR
00001010
=
00001011
= 0x0B
Эту константу и заносите в регистр
Код: Выделить всё
sbr temp,0|1|30=00000000
1=00000001
3=00000011
Ставим плюсы: )
- Реклама
Результат после переустановки:

За одно пропала проблема с 8й мегой.
Тупил всё-таки компилятор, принимая запись 0|1|3 за (1<<0)|(1<<1)|(1<<3)
За одно пропала проблема с 8й мегой.
- Вложения
-
- SCREEN.PNG
- (22.26 КБ) 732 скачивания
I am DX168B and this is my favourite forum on internet!
Да, тут я тупанул. Считал биты, писал как часла.Если да, то возьмите хоть виндовский калькулятор и переведите значения.....
О как...За одно пропала проблема с 8й мегой. Тупил всё-таки компилятор, принимая запись 0|1|3 за (1<<0)|(1<<1)|(1<<3)
Вот и пронадейся на него. Может какая-нибудь опция была включена/выключена?
Да вроде проверял перед этим.
Всё было так-же как и сейчас.

И ещё одна проблема пропала в одном из моих исходников.
Применял в одной схеме совковый дешифратор для опроса кнопок. Там надо было инкрементировать один регистр и отправлять в порт, потом на одном из пинов проверить наличие лог.0. Только вот что-то не шло. Ошибок нет, а в железе не работало. Пришлось массивом это дело делать. Сейчас переделал по изначальной задумке, прошил и всё работает. Массив выкинул и сократил размер программы.
И ещё одна проблема пропала в одном из моих исходников.
Применял в одной схеме совковый дешифратор для опроса кнопок. Там надо было инкрементировать один регистр и отправлять в порт, потом на одном из пинов проверить наличие лог.0. Только вот что-то не шло. Ошибок нет, а в железе не работало. Пришлось массивом это дело делать. Сейчас переделал по изначальной задумке, прошил и всё работает. Массив выкинул и сократил размер программы.
- Вложения
-
- SCREEN.PNG
- (19.85 КБ) 746 скачиваний
I am DX168B and this is my favourite forum on internet!
Неужели Вы верите в это?ploop писал(а):О как...DX168B писал(а):За одно пропала проблема с 8й мегой. Тупил всё-таки компилятор, принимая запись 0|1|3 за (1<<0)|(1<<1)|(1<<3)![]()
Вот и пронадейся на него. Может какая-нибудь опция была включена/выключена?
Новости в контакте:
Знакомая: - да не добавляла я никого и дружбу никому не предлагала, это контакт тупит.Новости в контакте писал(а):Знакомая* добавила в друзья Ивана Ивановича.
Ставим плюсы: )
А мне пофиг, верят мне или нет. У меня был "мистический"
баг и теперь его нет.
При ошибках всякое может быть. Не раз видел подобные приколы в виндовозе.
Даже в Visual Studio 6.0 было подобное с директивой #define После проверки диска всё встало на свои места.
Тем более за компом не я один сижу. После "проделок" сестры, винда быстро умирает.
Была-бы возможность - тогда бы и видео Вам снял. Но уже поздно и нет возможности.
При ошибках всякое может быть. Не раз видел подобные приколы в виндовозе.
Даже в Visual Studio 6.0 было подобное с директивой #define После проверки диска всё встало на свои места.
Тем более за компом не я один сижу. После "проделок" сестры, винда быстро умирает.
Была-бы возможность - тогда бы и видео Вам снял. Но уже поздно и нет возможности.
I am DX168B and this is my favourite forum on internet!
А я пользуюсь Виндовозным калькулятором.

- Вложения
-
- SCREEN.PNG
- (19.49 КБ) 773 скачивания
I am DX168B and this is my favourite forum on internet!
Господа, посоветуйте, как правильно сформировать меандр заданной частоты на одном из свободных протов (не предназначенных для работы со счетчиком)
Счетчик использовать буду 8-битный (Timer/Counter 0)
Ясно, что нужно сделать прерывание, но какое? По совпадению, по переполнению, или еще как-то (например PWM со скважностью 0.5)?
ЗЫ: "правильней" я имею ввиду с минимальными затратами ресурсов (дефицит тактов, а не объёма кода)
Счетчик использовать буду 8-битный (Timer/Counter 0)
Ясно, что нужно сделать прерывание, но какое? По совпадению, по переполнению, или еще как-то (например PWM со скважностью 0.5)?
ЗЫ: "правильней" я имею ввиду с минимальными затратами ресурсов (дефицит тактов, а не объёма кода)
Господа коты. Вопрос не совсем по ассемблеру, но задам тут. Только без холиваров пожалуйста.
Вопрос в следующем: Составим к примеру простую программу:
Прерываниями пользоваться не будем. Сама программа по сути ничего не делает.
Она просто инициализирует стек и потом присваивает регистру r16 значение 0x0F.
ВНИМАНИЕ ВОПРОС:
Что будет с регистром r16, если МК сбросить внешним сбросом, не отключая питание?
Значение в регистре r16 сбросится вместе с МК или сохранится?
Вопрос в следующем: Составим к примеру простую программу:
Код: Выделить всё
.cseg
.org 0x0000
ldi r16, Low(RAMend)
out SPL, r16
ldi r16, 0x0F
LOOP: rjmp LOOP
Она просто инициализирует стек и потом присваивает регистру r16 значение 0x0F.
ВНИМАНИЕ ВОПРОС:
Что будет с регистром r16, если МК сбросить внешним сбросом, не отключая питание?
Значение в регистре r16 сбросится вместе с МК или сохранится?
I am DX168B and this is my favourite forum on internet!
Я помню применял прерывание по совпадению таймера со значением в регистре OCRploop писал(а):Господа, посоветуйте, как правильно сформировать меандр заданной частоты на одном из свободных протов (не предназначенных для работы со счетчиком)
Счетчик использовать буду 8-битный (Timer/Counter 0)
Ясно, что нужно сделать прерывание, но какое? По совпадению, по переполнению, или еще как-то (например PWM со скважностью 0.5)?
ЗЫ: "правильней" я имею ввиду с минимальными затратами ресурсов (дефицит тактов, а не объёма кода)
В некоторых МК таймеры умеют аппаратно сбрасываться при прерывании по сравнению и сбрасывать счётчик своего подделителя (прескалера). Это я и применял с успехом в МК ATTINY26L
Вот даже пример:
Настройка таймера:
Код: Выделить всё
ldi temp0, 0xAF ;Наше число для сравнения
out OCR1C, temp0
ldi temp0, (1<<OCIE1B)
out TIMSK, temp0 ;Разрешение прерывания
lds temp0, (1<<CTC1)+(1<<CS13)+(1<<CS10)
out TCCR1B, temp0 ;подделитель и прочее
Код: Выделить всё
TIM_COMP1B: ;Прерывание таймера 1
in temp1, SREG
cpi front, 0x00
breq SET1
cbi PortA, 6
clr front
out SREG, temp1
reti
SET1:
sbi PortA, 6
ser front
out SREG, temp1
reti
Обе ветви съедают одинаковое количество тактов и в итоге интервал и длинна импульса были практически одинаковыми.
Последний раз редактировалось DX168B Чт янв 27, 2011 22:02:21, всего редактировалось 1 раз.
I am DX168B and this is my favourite forum on internet!
Сохранится. Если ногу RESET подтянуть к земле, а потом отпустить - управление перебросится на вектор RESET, который идёт сразу за директивой .cseg (начало программного кода). Если вектора там нет - просто пойдёт код заново. Регистры и память сохраняются.Что будет с регистром r16, если МК сбросить внешним сбросом, не отключая питание?
Значение в регистре r16 сбросится вместе с МК или сохранится?
ЗЫ: за точность не ручаюсь, где-то вычитал...
В некоторых МК таймеры умеют аппаратно сбрасываться при прерывании по сравнению и сбрасывать счётчик своего подделителя (прескалера). Это я и применял с успехом в МК ATTINY26L
Так.. Но в принципе можно TCNT зарядить нужным числом и использовать переполнение... А то что-то запутался с этими сравнениями...
Сравнение работает быстрее и не надо постоянно следить за таймером, чтобы постоянно заряжать его числом.
Тут один раз всё настроил и дальше он сам занимается. В процессе работы основной программы в любой момент можно забросить любое число в регистр сравнения и частота изменится.
Этот пример у меня работает в подмотчике электронного спидометра для Лады Самары.
Там я даже опрос кнопки приделал в основной программе для смены частоты.
От содержимого одного из регистров зависит состояние одного устройства.
При старте программы(подаче питания) в регистре должно быть 0x00
Как устройство меняет свой статус, то она сначала проверяет содержимое этого регистра и в зависимости от него уже выбирается один из его статусов и изменяется содержимое этого регистра на 0xFF. При следующей сработке, его содержимое снова меняется на 0x00.
Так вот: Прошил я значит девайс и стал проверять его работу. Всё было как надо.
Потом оставил его во втором статусе и подключил программатор. Зашил изменённую программу и отрубил RESET. Девайс запустился, но во втором статусе и из-за этого он запустился некорректно. Сейчас исправил, добавив принудительное присвоение регистру 0x00 в начале программы. Значение в этом регистре сохранилось даже после перепрошивки.
Тут один раз всё настроил и дальше он сам занимается. В процессе работы основной программы в любой момент можно забросить любое число в регистр сравнения и частота изменится.
Этот пример у меня работает в подмотчике электронного спидометра для Лады Самары.
Там я даже опрос кнопки приделал в основной программе для смены частоты.
Спросил из-за того, что у меня прикол сегодня был в одной программе.ploop писал(а): Сохранится. Если ногу RESET подтянуть к земле, а потом отпустить - управление перебросится на вектор RESET, который идёт сразу за директивой .cseg (начало программного кода). Если вектора там нет - просто пойдёт код заново. Регистры и память сохраняются.
ЗЫ: за точность не ручаюсь, где-то вычитал...
От содержимого одного из регистров зависит состояние одного устройства.
При старте программы(подаче питания) в регистре должно быть 0x00
Как устройство меняет свой статус, то она сначала проверяет содержимое этого регистра и в зависимости от него уже выбирается один из его статусов и изменяется содержимое этого регистра на 0xFF. При следующей сработке, его содержимое снова меняется на 0x00.
Так вот: Прошил я значит девайс и стал проверять его работу. Всё было как надо.
Потом оставил его во втором статусе и подключил программатор. Зашил изменённую программу и отрубил RESET. Девайс запустился, но во втором статусе и из-за этого он запустился некорректно. Сейчас исправил, добавив принудительное присвоение регистру 0x00 в начале программы. Значение в этом регистре сохранилось даже после перепрошивки.
I am DX168B and this is my favourite forum on internet!
А что ему будет то? Изменилась flash, а RAM никто не трогалЗначение в этом регистре сохранилось даже после перепрошивки.
Вот поэтому я всегда инициализирую регистры. Привычка со времён "компьтерного" программирования - не раз шишки набивал...
Тоно! А что включить, чтоб счетчик обнулялся сам? Что-то не понял из даташита...Сравнение работает быстрее и не надо постоянно следить за таймером, чтобы постоянно заряжать его числом.
Да. У меня за это отвечал бит CTC1. А какой у тебя МК?
Работа таймера была следующей: как только таймер сровняется с регистром OCR, то срабатывало прерывание по сравнению и таймер автоматом сбрасывал регистр TCNT в 0x00. Ну и снова начинал считать сначала. Далее тот-же процесс.
Работа таймера была следующей: как только таймер сровняется с регистром OCR, то срабатывало прерывание по сравнению и таймер автоматом сбрасывал регистр TCNT в 0x00. Ну и снова начинал считать сначала. Далее тот-же процесс.
I am DX168B and this is my favourite forum on internet!



