Программа для ATMega8

Обсуждаем контроллеры компании Atmel.
dafttttttt
Родился
Сообщения: 11
Зарегистрирован: Сб янв 05, 2013 14:56:53

Программа для ATMega8

Сообщение dafttttttt »

Имеется задание:
Составить программу, которая осуществляет последовательную запись и вывод пяти трехбитных чисел. Программа использует переменные, введенные с ключей, и выводит их на цифровую индикацию. Ввод осуществить через выводы PD4…PD6, ввод сигнала внешнего прерывания – PD3 (INT1), а вывод – через PB2…PB5

Если говорить проще, то вводим и записываем последовательно значения PD4, PD5, PD6, после записи выводим на индикаторную панель.

Написал программу, компилирую... Но программа работает не правильно. Ввожу число, происходит запись в контроллер, далее дохожу до первого "reti" (loop11) и вылетает на строку "rjmp start"... так же выводит ошибки:
AVR Simulator: Uninitialized stack pointer used at 0x001e
AVR Simulator: Invalid opcode 0xffff at address 0x003838
Раз 40 уже прогонял программу, менял адрес ".org 0x003", но толку нет...

Код: Выделить всё

.cseg
.include "m8def.inc"
.device ATmega8
.org 0x000
  rjmp start
.org 0x003
rjmp prer
start:
ldi  r16,low(RAMEND)
out SPL,r16
ldi  r19,high(RAMEND)
out SPH,r16
ldi r20,0b111100
out DDRB,r20
ldi r20,0b000000
out DDRD,r20
ldi r21,0b11
out mcucr,r21
ldi r21,0b1000000
out gimsk,r21
ldi r20,0b0
sei
main:
sbis  pind,3
rjmp prer
prer:
sbis pind,3
reti
inc r20
cpi r20,0b1011
brne loop11
ldi r20,0b1
ldi r21,0b0
rcall podpr2
loop11:
cpi r20,0b1
brne loop1
rcall podpr
mov r23,r21
reti
loop1:
cpi r20,0b10
brne loop2
rcall podpr
mov r24,r21
reti
loop2:
cpi r20,0b11
brne loop3
rcall podpr
mov r25,r21
reti
loop3:
cpi r20,0b100
brne loop4
rcall podpr
mov r26,r21
reti
loop4:
cpi r20,0b101
brne loop5
rcall podpr
mov r27,r21
reti
loop5:
cpi r20,0b110
brne loop6
mov r21,r23
rcall podpr2
reti
loop6:
cpi r20,0b111
brne loop7
mov r21,r24
rcall podpr2
reti
loop7:
cpi r20,0b1000
brne loop8
mov r21,r25
rcall podpr2
reti
loop8:
cpi r20,0b1001
brne loop9
mov r21,r26
rcall podpr2
reti
loop9:
cpi r20,0b1010
brne loop10
mov r21,r27
rcall podpr2
loop10:
reti
podpr:
in r21,PIND
andi r21,0b1110000
lsr r21
lsr r21
lsr r21
lsr r21
ret
podpr2:
lsl r21
lsl r21
out PORTB,r21
     ret
Реклама
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Программа для ATMega8

Сообщение ILYAUL »

Код: Выделить всё

main:
sbis  pind,3
rjmp main
inc r20
cpi r20,0b1011
brne loop11
ldi r20,0b1
Короче переписать весь код , убрать где не надо reti , добавить сохранение-восстановление SREG
Последний раз редактировалось ILYAUL Пт окт 25, 2013 18:33:43, всего редактировалось 1 раз.
Реклама
dafttttttt
Родился
Сообщения: 11
Зарегистрирован: Сб янв 05, 2013 14:56:53

Re: Программа для ATMega8

Сообщение dafttttttt »

ILYAUL писал(а):D:\AVR\PROJECT\123455667\123455667.asm(2): Including file 'C:\Program Files (x86)\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc'
D:\AVR\PROJECT\123455667\123455667.asm(109): No EEPROM data, deleting D:\AVR\PROJECT\123455667\123455667.eep

ATmega8 memory use summary [bytes]:
Segment Begin End Code Data Used Size Use%
---------------------------------------------------------------
[.cseg] 0x000000 0x0000b2 174 0 174 8192 2.1%
[.dseg] 0x000060 0x000060 0 0 0 1024 0.0%
[.eseg] 0x000000 0x000000 0 0 0 512 0.0%

Assembly complete, 0 errors. 0 warnings
Не совсем понял смысл?
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Программа для ATMega8

Сообщение Engineer_Keen »

Структура программы неверная у вас.
Основной цикл где?

Код: Выделить всё

RJMP START ;сброс
[векторы прерываний]
START:
[инициализация]
;------------------
MAIN: ;основной цикл
[что-то делаем]
RJMP MAIN
;------------------
[подпрограммы и обработчики прерываний]
Зачем безусловно переходить на следующую строку?

Код: Выделить всё

rjmp prer
prer:
При этом выход оттуда происходит по reti, а так как переход был не по rcall и не по прерыванию, у вас срывает стек, поэтому возврат происходит по х.з. какому адресу (получите ваше Invalid opcode 0xffff) и контроллер сбрасывается (вылетает на строку "rjmp start")
Реклама
Эиком - электронные компоненты и радиодетали
dafttttttt
Родился
Сообщения: 11
Зарегистрирован: Сб янв 05, 2013 14:56:53

Re: Программа для ATMega8

Сообщение dafttttttt »

но если основной цикл не требуется? Не могу же я написать:

Код: Выделить всё

main:
nop
rjmp main
Зацикливание будет
Реклама
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Программа для ATMega8

Сообщение Engineer_Keen »

Ну и что? Можно вообще написать MAIN: RJMP MAIN, и это будет совершенно нормально. Если вам надо что-то делать в основном цикле, так и делайте это между main и rjmp main.
Основной цикл в контроллере есть всегда, это закон, иначе программный счетчик будет проходить все адреса подряд, пока не наткнется на команду перехода, возврата или неверный код операции, или пока не переполнится.
Реклама
dafttttttt
Родился
Сообщения: 11
Зарегистрирован: Сб янв 05, 2013 14:56:53

Re: Программа для ATMega8

Сообщение dafttttttt »

Engineer_Keen писал(а):Ну и что? Можно вообще написать MAIN: RJMP MAIN, и это будет совершенно нормально. Если вам надо что-то делать в основном цикле, так и делайте это между main и rjmp main.
Основной цикл в контроллере есть всегда, это закон, иначе программный счетчик будет проходить все адреса подряд, пока не наткнется на команду перехода, возврата или неверный код операции, или пока не переполнится.
Тоесть получается вот так?:

Код: Выделить всё

.cseg
.device ATmega8
.include    "m8def.inc"   ; èñïîëüçóåì mega8

   RJMP   START
   RJMP   prer
START:
   LDI   R16,HIGH(RAMEND)
   LDI   R17,LOW(RAMEND)
   OUT   SPH,R16
   OUT   SPL,R17

   ldi r20,0b111100
   out DDRB,r20
   ldi r20,0b000000
   out DDRD,r20

   LDI R16, 0b10100000
   out MCUCR, r16 ; õîòèì ðàáîòàòü ïî íèçêîìó óðîâíþ ñ ïðåðûâàíèåì int0 è âûêëþ÷àòüñÿ ïî êîìàíäå sleep sleepmode:

   ldi r16,0b00000000
   out timsk,r16; çàïðåùàåì ïðåðûâàíèÿ ïî òàéìåðó
;   ldi r16, 0
   out tcnt2, r16; ñáðîñèì òàéìåð
   ldi r16, 0b01000000
   out GICR, r16 ; ðàçðåøàåì ïðåðûâàíèå int0
   OUT GIFR,R16 ; ñáðàñûâàåì ôëàã
   sei
   
main:

prer:
sbis pind,3
reti
inc r20
cpi r20,0b1011
brne loop11
ldi r20,0b1
ldi r21,0b0
rcall podpr2
loop11:
cpi r20,0b1
brne loop1
rcall podpr
mov r23,r21
reti
loop1:
cpi r20,0b10
brne loop2
rcall podpr
mov r24,r21
reti
loop2:
cpi r20,0b11
brne loop3
rcall podpr
mov r25,r21
reti
loop3:
cpi r20,0b100
brne loop4
rcall podpr
mov r26,r21
reti
loop4:
cpi r20,0b101
brne loop5
rcall podpr
mov r27,r21
reti
loop5:
cpi r20,0b110
brne loop6
mov r21,r23
rcall podpr2
reti
loop6:
cpi r20,0b111
brne loop7
mov r21,r24
rcall podpr2
reti
loop7:
cpi r20,0b1000
brne loop8
mov r21,r25
rcall podpr2
reti
loop8:
cpi r20,0b1001
brne loop9
mov r21,r26
rcall podpr2
reti
loop9:
cpi r20,0b1010
brne loop10
mov r21,r27
rcall podpr2
loop10:
reti
podpr:
in r21,PIND
andi r21,0b1110000
lsr r21
lsr r21
lsr r21
lsr r21
ret
podpr2:
lsl r21
lsl r21
out PORTB,r21
     ret

rjmp main
Аватара пользователя
Dr. Alex
Это не хвост, это антенна
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков
Контактная информация:

Re: Программа для ATMega8

Сообщение Dr. Alex »

Вот смотрю я на НИК и понимаю, человек зарегистрировался только для того, чтоб ему сделали/помогли с заданием)
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Программа для ATMega8

Сообщение ILYAUL »

Что делает эта команда
reti знаете ? Или просто так от балды пишите, что слышал то пою
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Программа для ATMega8

Сообщение Engineer_Keen »

По ходу не дошло... Делать то что нужно в основном цикле, это не значит запихать туда всю оставшуюся программу. Вот опять у вас

Код: Выделить всё

main:

prer:
sbis pind,3
reti
Ну и? Поставьте себя на место контроллера, что он будет делать?
dafttttttt
Родился
Сообщения: 11
Зарегистрирован: Сб янв 05, 2013 14:56:53

Re: Программа для ATMega8

Сообщение dafttttttt »

Dr. Alex писал(а):Вот смотрю я на НИК и понимаю, человек зарегистрировался только для того, чтоб ему сделали/помогли с заданием)
Ага :) А если вы введете этот ник в поиске, то вас это приятно удивит :)
dafttttttt
Родился
Сообщения: 11
Зарегистрирован: Сб янв 05, 2013 14:56:53

Re: Программа для ATMega8

Сообщение dafttttttt »

ILYAUL писал(а):Что делает эта команда
reti знаете ? Или просто так от балды пишите, что слышал то пою
Выход из прерывания?
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Программа для ATMega8

Сообщение Engineer_Keen »

Dr. Alex писал(а):чтоб ему сделали/помогли с заданием)
Тут принципиальная разница. Помочь можно, сделать за - фигвам :P
dafttttttt писал(а):Выход из прерывания?
Прально, и куда выходить будем в данном случае?
dafttttttt
Родился
Сообщения: 11
Зарегистрирован: Сб янв 05, 2013 14:56:53

Re: Программа для ATMega8

Сообщение dafttttttt »

Engineer_Keen писал(а):

Код: Выделить всё

RJMP START ;сброс
[векторы прерываний]
START:
[инициализация]
;------------------
MAIN: ;основной цикл
[что-то делаем]
RJMP MAIN
;------------------
[подпрограммы и обработчики прерываний]
И всё равно до меня не доходит... Всё что у меня после "PRER:" - это подпрограммы и обработчики прерываний.
Ну а в

Код: Выделить всё

MAIN:
RJMP MAIN
ничего не должно быть. и если я сделаю таким образом

Код: Выделить всё

OUT GIFR,R16 ; ñáðàñûâàåì ôëàã
sei
MAIN:
RJMP MAIN
prer:
sbis pind,3
то программа просто зациклится между этих двух строчек. Так ведь?
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Программа для ATMega8

Сообщение Engineer_Keen »

Принцип действия прерываний вам известен?
Если сложно сообразить сразу на ассемблере, нарисуйте для начала блок-схему алгоритма.

PS:Сваливаю на дачу, ответ не гарантирую :)))
Аватара пользователя
Dr. Alex
Это не хвост, это антенна
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков
Контактная информация:

Re: Программа для ATMega8

Сообщение Dr. Alex »

dafttttttt писал(а):Ага :) А если вы введете этот ник в поиске, то вас это приятно удивит :)
и натыкаюсь на первой-же ссылке вот на это
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
dafttttttt
Родился
Сообщения: 11
Зарегистрирован: Сб янв 05, 2013 14:56:53

Re: Программа для ATMega8

Сообщение dafttttttt »

Dr. Alex писал(а):и натыкаюсь на первой-же ссылке вот на это
Смысл не по ссылкам тыкать, а посмотреть что на почти всех сайтах/форумах/блогах, на которых я регистрируюсь, мной указывается этот самый ник.
dafttttttt
Родился
Сообщения: 11
Зарегистрирован: Сб янв 05, 2013 14:56:53

Re: Программа для ATMega8

Сообщение dafttttttt »

Engineer_Keen писал(а):Если сложно сообразить сразу на ассемблере, нарисуйте для начала блок-схему алгоритма.
Спасибо Вам огромное за помощь! Думаю разберусь всё-таки.
Аватара пользователя
Dr. Alex
Это не хвост, это антенна
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков
Контактная информация:

Re: Программа для ATMega8

Сообщение Dr. Alex »

dafttttttt писал(а):Смысл не по ссылкам тыкать, а посмотреть что на почти всех сайтах/форумах/блогах, на которых я регистрируюсь, мной указывается этот самый ник.
Я конечно прошу прощения, но кроме того, что указывается ваш ник, больше никакой информации полезной я не узнал... На одном форуме вас заблокировали, за нарушение правил, вы там хотели купить кряк для какой-то программы, или игры.... На других форумах вообще непонятки...... Хм, молодчина, зато везде зарегился) ТАК ДЕРЖАТЬ!
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Аватара пользователя
Eugene.Negrobov
Мучитель микросхем
Сообщения: 472
Зарегистрирован: Ср фев 15, 2012 09:00:34
Откуда: Киев

Re: Программа для ATMega8

Сообщение Eugene.Negrobov »

Dr. Alex писал(а):Вот смотрю я на НИК и понимаю, человек зарегистрировался только для того, чтоб ему сделали/помогли с заданием)
Хе, и без ника же очевидно... Если задача из шапки была бы частью другого проекта... То писался бы таковой точно уж не на асме. А так... Типичная задачка из методички.

Но если честно... Я видел, как у нас преподают... Учится по-честному тут не получится физически, уже на первом курсе становится понятно, что к сессии допускаются либо те, кто бросит стобаксов на загребущую лапу морозившегося весь семестр неадеквата-препода... Либо читерством, когда все задания решаются через онлайн-калькуляторы, маткады, мольбы на форумах помочь решить, репетиторов(научить которые тоже не успевают или не желают вовсе, тупо решают задачки и хапают бабло)...
А сессия сдается либо тоже стобаксами, либо таким-же читерством в виде шпаргалок различной степени запрятанности.
I'm on a huge rock, flying through space!
Ответить

Вернуться в «AVR»