программа оболочка для win и программирование
Re: программа оболочка для win и программирование
Собственно я имел в виду, что взяв данное устройство либо устройство предложенное PB_EXPERT за основу, можно написать управляющую программу для компьютера, работающую с данным простым устройством. Позже можно будет расширить аппаратную часть, когда более - менее разберетесь.
- Реклама
Re: программа оболочка для win и программирование
Можно писать на бейсике.А для написания программы микроконтроллера достаточно знать бейсика или же программа там пишется исключительно на ассемблере?
Для PIC это mikroBasic (у него есть библиотека функций, для создания HID устройства. Пробовал создавать устройства - работают
Для AVR, это BASCOM.
Re: программа оболочка для win и программирование
А какой именно микроконтроллер, по своему опыту, можете предложить использовать?Yftul писал(а):Собственно я имел в виду, что взяв данное устройство либо устройство предложенное PB_EXPERT за основу, можно написать управляющую программу для компьютера, работающую с данным простым устройством. Позже можно будет расширить аппаратную часть, когда более - менее разберетесь.
С PureBasic они не совместимы? Для изучения более одного языка программирования меня не хватитPB_EXPERT писал(а):Можно писать на бейсике.А для написания программы микроконтроллера достаточно знать бейсика или же программа там пишется исключительно на ассемблере?
Для PIC это mikroBasic (у него есть библиотека функций, для создания HID устройства. Пробовал создавать устройства - работают).
Для AVR, это BASCOM.
Re: программа оболочка для win и программирование
Частично совместимы.memento писал(а): С PureBasic они не совместимы? Для изучения более одного языка программирования меня не хватит
То есть, основы очень похожы, а дальше есть отличия.
В бейсике для МК есть команды для работы с I2C, SPI, 1-Wire устройствами, которых в компе нет, поэтому в бейсике для компа, нет таких команд, но зато есть команды для создания окон, меню, чего нет в контроллерах.
Re: программа оболочка для win и программирование
Вопрос сложный:) проще всего наверное будет освоить AVR, тем более что пара схем у Вас практически есть, да и программатор для него схемой повторяет одно из устройств, которые Вам все равно делать придется. Но в любом случае это не более чем мое имхо.
- Реклама
Re: программа оболочка для win и программирование
Вашему ИМХУ я, в этом вопросе, доверяю больше, чем своему.Yftul писал(а):Вопрос сложный:) проще всего наверное будет освоить AVR, тем более что пара схем у Вас практически есть, да и программатор для него схемой повторяет одно из устройств, которые Вам все равно делать придется. Но в любом случае это не более чем мое имхо.
а расширить количество входов-выходов будет сложно в дальнейшем или это решится лишь добавлением ещё одного МК?
эти слова сейчас для меня ничего, надеюсь пока, не значат.PB_EXPERT писал(а):Частично совместимы.memento писал(а): С PureBasic они не совместимы? Для изучения более одного языка программирования меня не хватит
То есть, основы очень похожы, а дальше есть отличия.
В бейсике для МК есть команды для работы с I2C, SPI, 1-Wire устройствами, которых в компе нет, поэтому в бейсике для компа, нет таких команд, но зато есть команды для создания окон, меню, чего нет в контроллерах.
Буду учиться программировать, паять уже умею.
Re: программа оболочка для win и программирование
>> расширить количество входов-выходов будет сложно в дальнейшем или это решится лишь добавлением ещё одного МК?
Даже в исходной схеме полно незадействованных выводов, на худой конец действительно можно будет поставить банальные регистры или еще один МК .
Даже в исходной схеме полно незадействованных выводов, на худой конец действительно можно будет поставить банальные регистры или еще один МК .
Re: программа оболочка для win и программирование
Не обязательно МК.а расширить количество входов-выходов будет сложно в дальнейшем или это решится лишь добавлением ещё одного МК
Расширитель выходов можно сделать на основе микросхемы 74HC595N. Стоят они копейки и их программировать не нужно.
Если включить последовательно 10 таких микросхем, можно получить 80 выходов, задействовав всего 3 вывода МК.
Re: программа оболочка для win и программирование
PB_EXPERT Не встречали HID компонентов для Delphi случайно? Или может примеров для FASM? Правда я уже забыл когда последний раз программировал и на том и на другом
а слово BASIC (именно так, большими буквами) вызывает стойкий рвотный рефлекс
.
Re: программа оболочка для win и программирование
Посмотри здесь http://www.radiokot.ru/forum/viewtopic. ... &start=100Yftul писал(а):PB_EXPERT Не встречали HID компонентов для Delphi случайно?
Там есть DLLка для работры с HID. На бейсике написана.
А на предыдущих страницах темы, есть упоминание про дельфи.
Re: программа оболочка для win и программирование
Ок, спс. Интересная DLL'ка, будем посмотреть как (если
) будет время 
А Вы профессионально этим занимаетесь или тоже баловства ради?
А Вы профессионально этим занимаетесь или тоже баловства ради?
Re: программа оболочка для win и программирование
Мне просто интересна тема HID устройств.
Есть небольшой опыт разработки HID устройтв на PIC и AVR контроллерах.
Есть небольшой опыт разработки HID устройтв на PIC и AVR контроллерах.
Re: программа оболочка для win и программирование
ИМХО хватит плодить быдлокодеров - не стоит замусоривать мозг Basic'ом. Лучше сразу изучать С для ПК и МК и ассемблер для МК - без знания специфического ассемблера невозможно достаточно хорошо изучить архитектуру МК и писать эффективные программы (и вообще понимать, что к чему), а про реализацию USB (и четких временных интервалов вообще) на бейсике можно просто забыть. Максимум, для чего он пригоден - мигалки и свистелки. Ассемблер нужен для понимания процессов, происходящих в железе, да и небольшие программы для МК гораздо удобнее писать на нем, а начинать так вообще однозначно надо с него, иначе выйдет быдлокодер. Под С есть куча библиотек, в частности и реализации USB-HID, хотя я предпочитаю общаться с USB с помощью FT232 и ей подобных микросхем.
Кратко:
Для ПК - C/C++;
Для МК - ассемблер (для обучения и небольших проектов, типа той же мигалки, также для критических участков кода); С (для более серьезных проектов, либо когда есть желание воспользоваться готовой библиотекой для чего-либо).
Кстати, тот же AVR-GCC генерит довольно приличный и компактный код. Но повторяю - начинать изучать МК надо ТОЛЬКО С АССЕМБЛЕРА (и да, ассемблер х86 тоже хорошо бы знать, хотя бы на уровне mov/out/in), и только потом переходить на С и все остальное.
А Бэйсики, Алгоритмбилдеры и прочую туфту - фтопку. На код, который генерят эти компиляторы, невозможно смотреть без слез. Кстати, это же относится и к CodeVisionAVR. Так что, либо IAR, либо AVR-GCC.
И вообще, любые упрощатели (в частности, автоматические кодогенераторы) можно использовать только тогда, когда четко представляешь, как этого же достичь руками, и можешь при случае поправить код. Иначе в 99% случаев получается быдлокод, а программа приобретает глючность, и служит поводом создания таких тем - http://radiokot.ru/forum/viewtopic.php?f=17&t=29144 . Объясняй потом человеку, что это не микроконтроллеры не заслуживают доверия, а программист начинал изучение не с ассемблера, а с какого-нибудь алгоритмбилдера, и на нем же писал систему, что привело к тому, что логика уделывает микроконтроллер.
Кратко:
Для ПК - C/C++;
Для МК - ассемблер (для обучения и небольших проектов, типа той же мигалки, также для критических участков кода); С (для более серьезных проектов, либо когда есть желание воспользоваться готовой библиотекой для чего-либо).
Кстати, тот же AVR-GCC генерит довольно приличный и компактный код. Но повторяю - начинать изучать МК надо ТОЛЬКО С АССЕМБЛЕРА (и да, ассемблер х86 тоже хорошо бы знать, хотя бы на уровне mov/out/in), и только потом переходить на С и все остальное.
А Бэйсики, Алгоритмбилдеры и прочую туфту - фтопку. На код, который генерят эти компиляторы, невозможно смотреть без слез. Кстати, это же относится и к CodeVisionAVR. Так что, либо IAR, либо AVR-GCC.
И вообще, любые упрощатели (в частности, автоматические кодогенераторы) можно использовать только тогда, когда четко представляешь, как этого же достичь руками, и можешь при случае поправить код. Иначе в 99% случаев получается быдлокод, а программа приобретает глючность, и служит поводом создания таких тем - http://radiokot.ru/forum/viewtopic.php?f=17&t=29144 . Объясняй потом человеку, что это не микроконтроллеры не заслуживают доверия, а программист начинал изучение не с ассемблера, а с какого-нибудь алгоритмбилдера, и на нем же писал систему, что привело к тому, что логика уделывает микроконтроллер.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: программа оболочка для win и программирование
А на мой взгляд начинать обучение стоит с паскаля и лишь после, получив должный уровень програмистской самодисциплины стоит переходить на C/ассемблер.
С другой стороны это же не выбор программы обучения специалистов, пусть каждый использует то, что ему удобно/подходит под поставленные задачи.
С другой стороны это же не выбор программы обучения специалистов, пусть каждый использует то, что ему удобно/подходит под поставленные задачи.
Re: программа оболочка для win и программирование
Быдлокодеров хватает на любых языках!ИМХО хватит плодить быдлокодеров - не стоит замусоривать мозг Basic'ом
Тут многое от моска зависит, а не от языка!
Думаете? Это всего лишь ваше ИМХО!Лучше сразу изучать С для ПК
Мой котяра ржал как угорелый после прочтения этих строк!а про реализацию USB (и четких временных интервалов вообще) на бейсике можно просто забыть.
Вот вам USB HID термометр на бейсике (BASCOM) http://purebasic.mybb.ru/viewtopic.php?id=46
Вы реально не правы!
Типа под бейсик нет!Под С есть куча библиотек, в частности и реализации USB-HID
Котяра подсталомммммммммм.
Библиотека написана на чистом бейсике (PureBasic)
Прочитайте отзывы. Её даже на сях и шарпе юзали. Вот вам и бейсик!
Да?Кстати, тот же AVR-GCC генерит довольно приличный и компактный код.
А вы сравнивали коды, созданные с помощью AVR-GCC и FastAVR (бейсик)?
Если нет, то рекомендую это сделать и не писать того, что вы не знаете!
Читайте выше.А Бэйсики, Алгоритмбилдеры и прочую туфту - фтопку. На код, который генерят эти компиляторы, невозможно смотреть без слез.
Вывод.
Не пишите того, чего не знаете!
И помните, "Бейсик" это лишь название языка, а основные возможности зависят от компилятора и имеющихся библиотек!
Re: программа оболочка для win и программирование
Истинная правда. Только вот чем ниже порог вхождения (и чем терпимее компилятор относится к ошибкам, что, кстати, взаимосвязано), тем их больше...Быдлокодеров хватает на любых языках!
Я где-то утверждал обратное?Это всего лишь ваше ИМХО!
А ничего, что там один модуль на асме написан?Вот вам USB HID термометр на бейсике (BASCOM)
Э, так это либа для ПК. Там точных таймингов и не надо - аппаратура все сделает. Это уже абстракция, тут хоть на Хаскеле пиши...Библиотека написана на чистом бейсике
Давайте устроим простенький контест - я напишу простейший бегущий огонек на С (AVR-GCC) и ассемблере под AVR (с использованием таймера), а Вы на Бейсике в Вашем любимом компиляторе. И сравним ассемблерные листинги... OK?А вы сравнивали коды, созданные с помощью AVR-GCC и FastAVR (бейсик)?
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: программа оболочка для win и программирование
Си - компилятор иногда такие ошибки "проглатывает" и даже не "давится"...Только вот чем ниже порог вхождения (и чем терпимее компилятор относится к ошибкам, что, кстати, взаимосвязано), тем их больше
Найти их бывает не просто!
А ничего что в проекте V-USB тоже присутсвует модуль на асме, отвечающий за работу с USB, а прога на Си лишь обращается к нему?А ничего, что там один модуль на асме написан?
Очень интересно на это бы взглянуть.тут хоть на Хаскеле пиши
Давайте, только где я написал что FastAVR мой любимый компилятор?Давайте устроим простенький контест - я напишу простейший бегущий огонек на С (AVR-GCC) и ассемблере под AVR (с использованием таймера), а Вы на Бейсике в Вашем любимом компиляторе.
Я лишь указал что он создаёт довольно оптимальный код.
Re: программа оболочка для win и программирование
Я имел в виду способность компилятора делать из быдлокода работающую программу. Да, компилятор С проглатывает ошибки. Да только вот скомпилированная программа с ошибками работать не будет, и это заставляет человека искать ошибки и проводить оптимизацию/исправление ошибок, более широко говоря - развиваться и совершенствоваться, углублять понимание. А зачем в чем-то разбираться, когда компилятор в любом случае сделает из тотальной жути что-то работающее?Си - компилятор иногда такие ошибки "проглатывает" и даже не "давится"...
Итак, начнем. Код простого бегущего огонька на ассемблере.
Код: Выделить всё
;**************************************
;****Device: ATmega48 Clock: 8MHz******
;**************************************
.include "m48def.inc"
.def t=R16
.def LED=R17
.macro outu
.if @0<0x40
out @0,@1
.else
sts @0,@1
.endif
.endm
.macro outi
ldi t,@1
outu @0,t
.endm
.cseg
.org 0
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp PCINT0 ; PCINT0 Handler
rjmp PCINT1 ; PCINT1 Handler
rjmp PCINT2 ; PCINT2 Handler
rjmp WDT ; Watchdog Timer Handler
rjmp TIM2_COMPA ; Timer2 Compare A Handler
rjmp TIM2_COMPB ; Timer2 Compare B Handler
rjmp TIM2_OVF ; Timer2 Overflow Handler
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 Compare A Handler
rjmp TIM1_COMPB ; Timer1 Compare B Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_COMPA ; Timer0 Compare A Handler
rjmp TIM0_COMPB ; Timer0 Compare B Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
rjmp USART_RXC ; USART, RX Complete Handler
rjmp USART_UDRE ; USART, UDR Empty Handler
rjmp USART_TXC ; USART, TX Complete Handler
rjmp ADC_CCPL ; ADC Conversion Complete Handler
rjmp EE_RDY ; EEPROM Ready Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp TWI ; 2-wire Serial Interface Handler
rjmp SPM_RDY ; Store Program Memory Ready Handler
EXT_INT0 :
EXT_INT1 :
_PCINT0 :
_PCINT1 :
_PCINT2 :
WDT :
TIM2_COMPA:
TIM2_COMPB:
TIM2_OVF :
TIM1_CAPT :
TIM1_COMPB:
TIM1_OVF :
TIM0_COMPA:
TIM0_COMPB:
TIM0_OVF :
SPI_STC :
USART_RXC :
USART_UDRE:
USART_TXC :
ADC_CCPL :
EE_RDY :
ANA_COMP :
TWI :
SPM_RDY :
reti
RESET:
outi SPH,HIGH(RamEnd)
outi SPL,LOW(RamEnd)
ldi LED,0x80
outi DDRB,0xFF
clr t
outu TCNT1H,t
outu TCNT1L,t
outi OCR1AH,0x3D
outi OCR1AL,0x09
outi TIMSK1,1<<OCIE1A
outi TCCR1B,(1<<CS11) | (1<<CS10)
sei
LOOP:
rjmp LOOP
TIM1_COMPA:
clr t
outu TCNT1H,t
outu TCNT1L,t
ror LED
outu portB,LED
reti
Код: Выделить всё
AVRASM: AVR macro assembler 2.1.17 (build 435 Apr 10 2008 09:27:55)
Copyright (C) 1995-2008 ATMEL Corporation
D:\mc\prj\asm\experiment\experiment.asm(5): Including file 'C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc'
D:\mc\prj\asm\experiment\experiment.asm(116): No EEPROM data, deleting D:\mc\prj\asm\experiment\experiment.eep
ATmega48 memory use summary [bytes]:
Segment Begin End Code Data Used Size Use%
---------------------------------------------------------------
[.cseg] 0x000000 0x00007a 122 0 122 4096 3.0%
[.dseg] 0x000100 0x000100 0 0 0 512 0.0%
[.eseg] 0x000000 0x000000 0 0 0 256 0.0%
Assembly complete, 0 errors. 0 warnings
Последний раз редактировалось YS Пт май 28, 2010 16:30:35, всего редактировалось 4 раза.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: программа оболочка для win и программирование
Бегущий огонёк на FastAVR.
Код на бейсике.
Это выдало при компиляции
Использовано 1.2 % памяти ATmega8.
Код на бейсике.
Код: Выделить всё
'/////////////////////////////////////////////////////////
'/// FastAVR Basic Compiler for AVR by MICRODESIGN ///
'/////////////////////////////////////////////////////////
$Device= m8 ' ATmega8
$Stack = 32 ' Глубина стека
$Clock = 8.000000 ' Тактовая частота - 8 МГц.
Declare Interrupt Ovf1()
Dim Led As Byte
Led = 1
DDRD=&hFF
PORTD=1
$Timer1=Timer , Prescale=64
Enable Ovf1
Enable Interrupts
Start Timer1
Do ' place your code in next line
Loop
Interrupt Ovf1()
Rotate(Left, 1, Led)
PORTD=Led
End Interrupt Код: Выделить всё
;FastAVR Basic Compiler, ver.4.3.0, by MicroDesign
;Created 13:59:52, 28-05-2010
;
.include "C:\Program Files\FastAVR\inc\m8def.inc"
;
.DSEG
led: .byte 1
.CSEG
.ORG 0x0000
rjmp _Reset
.ORG INT0addr
reti
.ORG INT1addr
reti
.ORG OC2addr
reti
.ORG OVF2addr
reti
.ORG ICP1addr
reti
.ORG OC1Aaddr
reti
.ORG OC1Baddr
reti
.ORG OVF1addr
rjmp IntN8
_Reset:
ldi yl,byte1(RAMEND)
out SPL,yl
ldi yh,byte2(RAMEND)
out SPL+1,yh
sbiw yl,32
;****** USERS BASIC CODE **********************
;-Line--0009----Led = 1--
ldi zl,byte1(1)
sts led,zl
;-Line--0010----DDRD=&hFF--
ldi zl,byte1(255)
out DDRD,zl
;-Line--0011----PORTD=1--
ldi zl,byte1(1)
out PORTD,zl
;-Line--0013----$Timer1=Timer , Prescale=64--
;-Line--0014----Enable Ovf1--
in zl,TIMSK
sbr zl,0x04
out TIMSK,zl
;-Line--0015----Enable Interrupts--
sei
;-Line--0016----Start Timer1--
in zl,TCCR1B
sbr zl,3
out TCCR1B,zl
;-Line--0018----Do ' place your code in next line--
L0000:
;-Line--0019----Loop--
rjmp L0000
L0001:
;-Line--0021----Interrupt Ovf1()--
;-Line--0022----Rotate(Left, 1, Led)--
IntN8:
in r2,SREG
lds zl,led
ldi r24,1
Call _RotBL
sts led,zl
;-Line--0023----PORTD=Led--
lds zl,led
out PORTD,zl
;-Line--0024----End Interrupt--
out SREG,r2
reti
;****** END OF USER BASIC CODE ****************
;////// RotateLeftByte ////////////////////
_RotBL: lsl zl
brcc _RtBL1
sbr zl,1
_RtBL1: dec r24
brne _RotBL
ret
;System Global Variables: 0 bytes
;User Global Variables: 1 bytes
Re: программа оболочка для win и программирование
Цифра, конечно, красивая, но:Использовано 1.2 % памяти ATmega8.
1. У ATmega8 меньше прерываний, что дает выигрыш в суммарном объеме кода за счет меньшей ТВП;
2. У ATmega8 8K Flash, а у ATmega48 - 4K. Очевидно, объем кода в процентах будет меньше.
3. Вы использовали прерывание по переполнению, что, опять же, дало выигрыш в несколько команд на инициализации.
Несколько замечаний по ассемблерному листингу, полученному из программы на бейсике:
1. Программа использует оперативную память, что в таком простом случае явно излишне.
2. Прокомментирую листинг:
Код: Выделить всё
;FastAVR Basic Compiler, ver.4.3.0, by MicroDesign
;Created 13:59:52, 28-05-2010
;
.include "C:\Program Files\FastAVR\inc\m8def.inc"
;
.DSEG
led: .byte 1 [color=red];заводим переменную в оперативной памяти, избыточность[/color]
.CSEG
.ORG 0x0000
rjmp _Reset
.ORG INT0addr
reti
.ORG INT1addr
reti
.ORG OC2addr
reti
.ORG OVF2addr
reti
.ORG ICP1addr
reti
.ORG OC1Aaddr
reti
.ORG OC1Baddr
reti
.ORG OVF1addr
rjmp IntN8
_Reset:
ldi yl,byte1(RAMEND)
out SPL,yl
ldi yh,byte2(RAMEND)
out SPL+1,yh
sbiw yl,32
;****** USERS BASIC CODE **********************
;-Line--0009----Led = 1--
ldi zl,byte1(1)
sts led,zl [color=red]; из-за того, что переменная заведена в памяти, для каждого обращения к ней требуется две инструкции[/color]
;-Line--0010----DDRD=&hFF--
ldi zl,byte1(255)
out DDRD,zl
;-Line--0011----PORTD=1--
ldi zl,byte1(1)
out PORTD,zl
;-Line--0013----$Timer1=Timer , Prescale=64--
;-Line--0014----Enable Ovf1--
in zl,TIMSK [color=red]; бесполезная инструкция[/color]
sbr zl,0x04
out TIMSK,zl
;-Line--0015----Enable Interrupts--
sei
;-Line--0016----Start Timer1--
in zl,TCCR1B [color=red]; бесполезная инструкция[/color]
sbr zl,3
out TCCR1B,zl
;-Line--0018----Do ' place your code in next line--
L0000:
;-Line--0019----Loop--
rjmp L0000
L0001:
;-Line--0021----Interrupt Ovf1()--
;-Line--0022----Rotate(Left, 1, Led)--
IntN8:
in r2,SREG [color=red];бесполезная инструкция[/color]
lds zl,led
ldi r24,1
Call _RotBL [color=red]; теряем время на вызове процедуры[/color]
sts led,zl
;-Line--0023----PORTD=Led--
lds zl,led
out PORTD,zl
;-Line--0024----End Interrupt--
out SREG,r2 [color=red];бесполезная инструкция[/color]
reti
;****** END OF USER BASIC CODE ****************
;////// RotateLeftByte ////////////////////
_RotBL: lsl zl [color=red]; вся эта жуть по-хорошему заменяется командами ROR/ROL. Неоптимальный код.[/color]
brcc _RtBL1
sbr zl,1
_RtBL1: dec r24
brne _RotBL
ret
;System Global Variables: 0 bytes
;User Global Variables: 1 bytes
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
volatile register unsigned char LED asm("r16");
ISR (TIMER1_COMPA_vect)
{
TCNT1=0;
PORTB=LED;
LED=LED>>1;
if (LED==0)
LED=0x80;
}
void main(void)
{
DDRB=0xFF;
TCNT1=0;
OCR1A=0x3D09;
TIMSK1=1<<OCIE1A;
LED=0x80;
TCCR1B=(1<<CS11) | (1<<CS10);
sei();
while (1);
}
Код: Выделить всё
rm -rf expgcc.o expgcc.elf dep/* expgcc.hex expgcc.eep expgcc.lss expgcc.map
Build succeeded with 0 Warnings...
avr-gcc.exe -mmcu=atmega48 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT expgcc.o -MF dep/expgcc.o.d -c ../expgcc.c
../expgcc.c:17: warning: return type of 'main' is not 'int'
avr-gcc.exe -mmcu=atmega48 -Wl,-Map=expgcc.map expgcc.o -o expgcc.elf
avr-objcopy -O ihex -R .eeprom expgcc.elf expgcc.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex expgcc.elf expgcc.eep || exit 0
avr-objdump -h -S expgcc.elf > expgcc.lss
AVR Memory Usage
----------------
Device: atmega48
Program: 196 bytes (4.8% Full)
(.text + .data + .bootloader)
Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)
Build succeeded with 1 Warnings...
Код: Выделить всё
+00000000: C019 RJMP PC+0x001A Relative jump
+00000001: C033 RJMP PC+0x0034 Relative jump
+00000002: C032 RJMP PC+0x0033 Relative jump
+00000003: C031 RJMP PC+0x0032 Relative jump
+00000004: C030 RJMP PC+0x0031 Relative jump
+00000005: C02F RJMP PC+0x0030 Relative jump
+00000006: C02E RJMP PC+0x002F Relative jump
+00000007: C02D RJMP PC+0x002E Relative jump
+00000008: C02C RJMP PC+0x002D Relative jump
+00000009: C02B RJMP PC+0x002C Relative jump
+0000000A: C02A RJMP PC+0x002B Relative jump
+0000000B: C02A RJMP PC+0x002B Relative jump
+0000000C: C028 RJMP PC+0x0029 Relative jump
+0000000D: C027 RJMP PC+0x0028 Relative jump
+0000000E: C026 RJMP PC+0x0027 Relative jump
+0000000F: C025 RJMP PC+0x0026 Relative jump
+00000010: C024 RJMP PC+0x0025 Relative jump
+00000011: C023 RJMP PC+0x0024 Relative jump
+00000012: C022 RJMP PC+0x0023 Relative jump
+00000013: C021 RJMP PC+0x0022 Relative jump
+00000014: C020 RJMP PC+0x0021 Relative jump
+00000015: C01F RJMP PC+0x0020 Relative jump
+00000016: C01E RJMP PC+0x001F Relative jump
+00000017: C01D RJMP PC+0x001E Relative jump
+00000018: C01C RJMP PC+0x001D Relative jump
+00000019: C01B RJMP PC+0x001C Relative jump
+0000001A: 2411 CLR R1 Clear Register
+0000001B: BE1F OUT 0x3F,R1 Out to I/O location
+0000001C: EFCF SER R28 Set Register
+0000001D: E0D2 LDI R29,0x02 Load immediate
+0000001E: BFDE OUT 0x3E,R29 Out to I/O location
+0000001F: BFCD OUT 0x3D,R28 Out to I/O location
+00000020: E011 LDI R17,0x01 Load immediate
+00000021: E0A0 LDI R26,0x00 Load immediate
+00000022: E0B1 LDI R27,0x01 Load immediate
+00000023: ECE4 LDI R30,0xC4 Load immediate
+00000024: E0F0 LDI R31,0x00 Load immediate
+00000025: C002 RJMP PC+0x0003 Relative jump
+00000026: 9005 LPM R0,Z+ Load program memory and postincrement
+00000027: 920D ST X+,R0 Store indirect and postincrement
+00000028: 30A0 CPI R26,0x00 Compare with immediate
+00000029: 07B1 CPC R27,R17 Compare with carry
+0000002A: F7D9 BRNE PC-0x04 Branch if not equal
+0000002B: E011 LDI R17,0x01 Load immediate
+0000002C: E0A0 LDI R26,0x00 Load immediate
+0000002D: E0B1 LDI R27,0x01 Load immediate
+0000002E: C001 RJMP PC+0x0002 Relative jump
+0000002F: 921D ST X+,R1 Store indirect and postincrement
+00000030: 30A0 CPI R26,0x00 Compare with immediate
+00000031: 07B1 CPC R27,R17 Compare with carry
+00000032: F7E1 BRNE PC-0x03 Branch if not equal
+00000033: D018 RCALL PC+0x0019 Relative call subroutine
+00000034: C02B RJMP PC+0x002C Relative jump
+00000035: CFCA RJMP PC-0x0035 Relative jump
@00000036: __vector_11
---- expgcc.c -------------------------------------------------------------------------------------
7: {
+00000036: 921F PUSH R1 Push register on stack
+00000037: 920F PUSH R0 Push register on stack
+00000038: B60F IN R0,0x3F In from I/O location
+00000039: 920F PUSH R0 Push register on stack
+0000003A: 2411 CLR R1 Clear Register
+0000003B: 938F PUSH R24 Push register on stack
8: TCNT1=0;
+0000003C: 92100085 STS 0x0085,R1 Store direct to data space
+0000003E: 92100084 STS 0x0084,R1 Store direct to data space
10: PORTB=LED;
+00000040: 2F80 MOV R24,R16 Copy register
+00000041: B905 OUT 0x05,R16 Out to I/O location
12: LED=LED>>1;
+00000042: 9586 LSR R24 Logical shift right
+00000043: 2F08 MOV R16,R24 Copy register
13: if (LED==0)
+00000044: F409 BRNE PC+0x02 Branch if not equal
14: LED=0x80;
+00000045: E800 LDI R16,0x80 Load immediate
15: }
+00000046: 918F POP R24 Pop register from stack
+00000047: 900F POP R0 Pop register from stack
+00000048: BE0F OUT 0x3F,R0 Out to I/O location
+00000049: 900F POP R0 Pop register from stack
+0000004A: 901F POP R1 Pop register from stack
+0000004B: 9518 RETI Interrupt return
@0000004C: main
18: {
+0000004C: EF8F SER R24 Set Register
+0000004D: B984 OUT 0x04,R24 Out to I/O location
20: TCNT1=0;
+0000004E: 92100085 STS 0x0085,R1 Store direct to data space
+00000050: 92100084 STS 0x0084,R1 Store direct to data space
21: OCR1A=0x3D09;
+00000052: E089 LDI R24,0x09 Load immediate
+00000053: E39D LDI R25,0x3D Load immediate
+00000054: 93900089 STS 0x0089,R25 Store direct to data space
+00000056: 93800088 STS 0x0088,R24 Store direct to data space
22: TIMSK1=1<<OCIE1A;
+00000058: E082 LDI R24,0x02 Load immediate
+00000059: 9380006F STS 0x006F,R24 Store direct to data space
24: TCCR1B=(1<<CS11) | (1<<CS10);
+0000005B: E083 LDI R24,0x03 Load immediate
+0000005C: 93800081 STS 0x0081,R24 Store direct to data space
25: sei();
+0000005E: 9478 SEI Global Interrupt Enable
+0000005F: CFFF RJMP PC-0x0000 Relative jump
+00000060: 94F8 CLI Global Interrupt Disable
+00000061: CFFF RJMP PC-0x0000 Relative jump
Последний раз редактировалось YS Пт май 28, 2010 18:29:15, всего редактировалось 1 раз.
Разница между теорией и практикой на практике гораздо больше, чем в теории.


