Страница 1 из 2
Atmega162
Добавлено: Сб авг 28, 2010 13:27:44
Archangel089
Доброго времяни суток!
Года 2 назад программировал на 90s2313. Недавно купил себе Atmega162. И не могу написать даже самой простой программы-моргание диода. Подскажите пожалуйста исходный код на ассемблере!
Зы- для компиляции использую avr studio 4 и для прошивки avreal
Re: Atmega162
Добавлено: Сб авг 28, 2010 13:47:10
SII
Код Вам не напишут хотя бы потому, что неизвестно, к какой ноге прицеплен светодиод, а значит, непонятно, какой ногой нужно дрыгать, чтобы он мигал (а номер ноги зависит ещё и от вида корпуса микросхемы -- вроде 2 варианта существуют). И вообще, в чём проблема-то? Программа ж элементарнее некуда...
Re: Atmega162
Добавлено: Сб авг 28, 2010 14:24:12
Archangel089
Atmega162-16pu.
Ну пускай будет на первой ножке-pb0.
Знаю что элементарно. Но что то не могу сделать даже этого. Хотя поднимал все старые записи. Может быть все из за того, что другой контролер...
Re: Atmega162
Добавлено: Сб авг 28, 2010 15:20:40
SII
Что-нибудь в этом роде:
Код: Выделить всё
.CSEG
.ORG 0
; =======================
;
; Таблица векторов прерываний
;
; =======================
jmp Reset ; Сброс, включение питания, сторожевой таймер
jmp _IRQ ; Внешнее прерывание INT0
jmp _IRQ ; Внешнее прерывание INT1
jmp _IRQ ; Внешнее прерывание INT2
jmp _IRQ ; Pin Change Interrupt Request 0
jmp _IRQ ; Pin Change Interrupt Request 1
jmp _IRQ ; Timer/Counter3 Capture Event
jmp _IRQ ; Timer/Counter3 Compare Match A
jmp _IRQ ; Timer/Counter3 Compare Match B
jmp _IRQ ; Timer/Counter3 Overflow
jmp _IRQ ; Timer/Counter2 Compare Match
jmp _IRQ ; Timer/Counter2 Overflow
jmp _IRQ ; Timer/Counter1 Capture Event
jmp _IRQ ; Timer/Counter1 Compare Match A
jmp _IRQ ; Timer/Counter1 Compare Match B
jmp _IRQ ; Timer/Counter1 Overflow
jmp _IRQ ; Timer/Counter0 Compare Match
jmp _IRQ ; Timer/Counter0 Overflow
jmp _IRQ ; Serial Transfer Complete
jmp _IRQ ; USART0, Rx Complete
jmp _IRQ ; USART1, Rx Complete
jmp _IRQ ; USART0 Data Register Empty
jmp _IRQ ; USART1 Data Register Empty
jmp _IRQ ; USART0, Tx Complete
jmp _IRQ ; USART1, Tx Complete
jmp _IRQ ; EEPROM Ready
jmp _IRQ ; Analog Comparator
jmp _IRQ ; Store Program Memory Ready
_IRQ: reti
; =======================
;
; Точка входа по сбросу/включению питания
;
; =======================
Reset:
; Инициализация указателя стека: вершина по адресу 4FF (конец ОЗУ)
ldi R16, 4
out SPH, R16
ldi R16, 0xFF
out SPL, R16
; Инициализация порта B (линия 0 работает на выход)
ldi R16, 0x01
out DDRB, R16
Loop:
; Выдача на PB0 единицы
ldi R16, 0x01
out PORTB, R16
; Задержка
ldi R31, 0xFF
ldi R30, 0xFF
L1: sbiw R31:R30, 1
brne L1
; Выдача на PB0 нуля
ldi R16, 0x00
out PORTB, R16
; Задержка
ldi R31, 0xFF
ldi R30, 0xFF
L2: sbiw R31:R30, 1
brne L2
rjmp Loop
Re: Atmega162
Добавлено: Сб авг 28, 2010 16:28:11
Archangel089
Большое спасибо!
Ещё буду очень признателен за ссылки на учебники по данному способу программирования, ибо первый раз вижу такое исполнение...
Re: Atmega162
Добавлено: Сб авг 28, 2010 16:37:25
SII
Ссылки уж точно не ко мне, я программированию учился четверть века назад. Ну а документацию по контроллеру можно (и нужно) найти на сайте Атмел.
Re: Atmega162
Добавлено: Сб авг 28, 2010 23:10:36
GP1
SII писал(а):Что-нибудь в этом роде:
Код: Выделить всё
.CSEG
.ORG 0
; =======================
;
; Таблица векторов прерываний
;
; =======================
jmp Reset ; Сброс, включение питания, сторожевой таймер
jmp _IRQ ; Внешнее прерывание INT0
jmp _IRQ ; Внешнее прерывание INT1
jmp _IRQ ; Внешнее прерывание INT2
jmp _IRQ ; Pin Change Interrupt Request 0
jmp _IRQ ; Pin Change Interrupt Request 1
jmp _IRQ ; Timer/Counter3 Capture Event
jmp _IRQ ; Timer/Counter3 Compare Match A
jmp _IRQ ; Timer/Counter3 Compare Match B
jmp _IRQ ; Timer/Counter3 Overflow
jmp _IRQ ; Timer/Counter2 Compare Match
jmp _IRQ ; Timer/Counter2 Overflow
jmp _IRQ ; Timer/Counter1 Capture Event
jmp _IRQ ; Timer/Counter1 Compare Match A
jmp _IRQ ; Timer/Counter1 Compare Match B
jmp _IRQ ; Timer/Counter1 Overflow
jmp _IRQ ; Timer/Counter0 Compare Match
jmp _IRQ ; Timer/Counter0 Overflow
jmp _IRQ ; Serial Transfer Complete
jmp _IRQ ; USART0, Rx Complete
jmp _IRQ ; USART1, Rx Complete
jmp _IRQ ; USART0 Data Register Empty
jmp _IRQ ; USART1 Data Register Empty
jmp _IRQ ; USART0, Tx Complete
jmp _IRQ ; USART1, Tx Complete
jmp _IRQ ; EEPROM Ready
jmp _IRQ ; Analog Comparator
jmp _IRQ ; Store Program Memory Ready
_IRQ: reti
Сколько раз уже повторялось, оформление таблицы векторов в
ТАКОМ ВИДЕ 
- есть прямой путь к ошибкам и гемору при отладке программы.
по теме:
мне как-то попадалась именно мега162 которая напрочь отказывалась работать пока не подключил на свободных ногах пуллапы.
Re: Atmega162
Добавлено: Вс авг 29, 2010 10:34:32
SII
Не знаю, какие у Вас возникали проблемы с таким оформлением, а у меня проблем никаких никогда не возникало.
Re: Atmega162
Добавлено: Вс авг 29, 2010 19:28:50
GP1
У меня проблем не возникало, так как я никогда не писал, но на форуме не реже 1 раза в месяц, просто сейчас мало кого асм-ом заинтересуешь, появляются темы типа:
"HELP! Ничего не работает", при разборе которых оказывается, что вся проблема в таблице векторов прерываний.
Re: Atmega162
Добавлено: Вс авг 29, 2010 20:17:56
SII
Ну так надо правильно определять эту самую таблицу, что я и сделал. Вот и хотелось бы узнать, какие проблемы при её оформлении в ТАКОМ ВИДЕ могут возникнуть? Где здесь путь к "ошибкам и гемору при отладке программы"? И какой способ оформления таблицы прерываний Вы предпочитаете?
Re: Atmega162
Добавлено: Пн авг 30, 2010 08:40:36
GP1
я предпочитаю такой стиль написания:
http://radiokot.ru/forum/viewtopic.php?p=543675#p543675
и чуть выше у того же автора есть пара постов с объяснениями, просто я не умею так излагать свои мысли, мне бы чего по-проще, асм например.
Re: Atmega162
Добавлено: Пн авг 30, 2010 09:55:22
SII
Ну, такой подход имеет право на жизнь, но лично мне он не нравится. Мне кажется куда более простым и, главное, надёжным один раз написать таблицу переходов с командами jmp (именно ими -- rjmp имеет меньший размер) и возвращаться к ней только в том случае, если надо указать имя обработчика того или иного прерывания, что у меня, собсно, и сделано. Конечно, можно допустить какую-нибудь ошибку, но точно так же её можно допустить и в альтернативном подходе (указал случайно, например, неверное имя вектора -- ведь некоторые из них имеют почти одинаковые имена, отличающиеся лишь, например, номерами таймеров). Проблем с отладкой тоже никаких: ставишь брякпоинт на нужный вектор, да и всё. Правда, мой подход требует обязательного комментирования, какой jmp к какому вектору относится, поскольку их названия отсутствуют, но лично я не ленюсь снабжать свои программы комментариями.
Re: Atmega162
Добавлено: Пн авг 30, 2010 10:18:23
GP1
SII писал(а): один раз написать таблицу переходов с командами jmp (именно ими -- rjmp имеет меньший размер)
Один раз не получится полюбому
1. у
tiny нет команды
jmp
2. а у младших mega вектора переходов
однословные, а
jmp занимает 2 слова
так что вот как-то так, плавно перетекаем к правилам написания векторов, описанных в предыдущем посте
указал случайно, например, неверное имя вектора
как можно указать неправильное имя вектора при копи-пастном методе, необходимые имена тупо копируются из
def* файла.
Re: Atmega162
Добавлено: Пн авг 30, 2010 10:36:03
Archangel089
А вот подскажите вот такой вот вопрос-решил попробывать пропатчить AVRStudio на C++. скачал патч.... и ничего что то не пропатчилось... патч-WinAVR-20100110-install.exe. установился как отдельна прога. и при меню опен открывает кучу экзешников. но ни один выбрать нельзя. качал отседа-http://cdnetworks-kr-2.dl.sourceforge.net/project/winavr/WinAVR/20100110/WinAVR-20100110-install.exe.
Re: Atmega162
Добавлено: Пн авг 30, 2010 11:14:28
ARV
Archangel089 писал(а):А вот подскажите вот такой вот вопрос-решил попробывать пропатчить AVRStudio на C++. скачал патч.... и ничего что то не пропатчилось... патч-WinAVR-20100110-install.exe. установился как отдельна прога. и при меню опен открывает кучу экзешников. но ни один выбрать нельзя. качал отседа-http://cdnetworks-kr-2.dl.sourceforge.net/project/winavr/WinAVR/20100110/WinAVR-20100110-install.exe.
вы что-то ересь какую-то пишите... скачали WinAVR - но называете это патчем... какой патч? AVR Studio не значет про С++ ничего (не поддерживает подсветку синтаксиса, не умеет показывать в отладчике и т.п.) - и патча, как я понимаю, нет для лечения этой проблемы. а вот Си прекрасно понимает, и WinAVR в том числе. можно писать в студии и на С++ и компилировать при помощи WinAVR (при соблюдении минимума условий) - однако отлаживать в симуляторе не выйдет.
Re: Atmega162
Добавлено: Пн авг 30, 2010 11:19:25
Archangel089
ARV писал(а):[вы что-то ересь какую-то пишите... скачали WinAVR - но называете это патчем... какой патч? AVR Studio не значет про С++ ничего (не поддерживает подсветку синтаксиса, не умеет показывать в отладчике и т.п.) - и патча, как я понимаю, нет для лечения этой проблемы. а вот Си прекрасно понимает, и WinAVR в том числе. можно писать в студии и на С++ и компилировать при помощи WinAVR (при соблюдении минимума условий) - однако отлаживать в симуляторе не выйдет.
А можно поинтересоваться-что это собственно за минимумы???
Re: Atmega162
Добавлено: Пн авг 30, 2010 11:24:49
ARV
минимумы? ну, как минимум, использовать правильные расширения файлов, чтобы avr-gcc правильно компилировал С++ исходники. может быть придется отказаться от настроек параметров компиляции в мастере - придется использовать вручную сделанный makefile... ну и в чем тогда польза студии, скажите мне?

Re: Atmega162
Добавлено: Пн авг 30, 2010 11:35:58
Archangel089
Что то я в этой жизни определённо не понимаю...
Нашел вот такой код:
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
int N=0;
ISR(TIMER0_COMP_vect)
{
N=TCNT1;
TCNT0=0;
N=0;
}
int main(void)
{
DDRA=0xFF;
PORTA=0xFF;
TCCR0=0x01;//Set timer0
OCR0=0x5F;
TIMSK=0x01;
sei();
while(1)
{
asm volatile ("nop");
volatile N=N+1;
asm volatile ("nop");
asm volatile ("nop");
}
}
Programmer's Notepad,создал новый проэкт C/C++, встывил и выбрал Tools-> Make All. Вылазит окно "сохранить как"...
как я понял-надо сохранить под каким либо именем и расширением .HEX? или я опять что то не так понял?
Re: Atmega162
Добавлено: Пн авг 30, 2010 11:41:09
ARV
во-первых, ща придет злобный дядя-модератор (или красивая тетя-модератор) и прикроет ваши (и мои) словоизлияния, как не имеющие к atmega162 никакого отношения...
во-вторых, такие "примеры" я бы выбрасывал сразу, не пытаясь скомпилировать
в-третьих, где в вашем примере С++ ??? им и не пахнет. А Сишные проекты собираются без всякого нотепада - прямиком в студии.
с нотепадами не работал, ничего не скажу...
Re: Atmega162
Добавлено: Пн авг 30, 2010 12:05:17
Archangel089
Ну надеюсь не прикроют пока....
Так в том то и дело-в какой именно студии??? Можно по пунктам что и как делать?!