PIC16F873A как сбросить стек?

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Аватара пользователя
maks14
Друг Кота
Сообщения: 8785
Зарегистрирован: Пн апр 11, 2011 14:56:46
Откуда: Дальний восток.

PIC16F873A как сбросить стек?

Сообщение maks14 »

учусь писать на асьме.
тут вопрос возник по PIC16F873A может кто подскажет как его аппаратный стек сбросить?
а то у меня он че то переполнился еще до сохранения в нем данных.
вызов подпрограммы(CALL)-возвращение RETURN тут мой отладчик пишет что произошло оно...переполнение стека :dont_know:
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: PIC16F873A как сбросить стек?

Сообщение BOB51 »

Скорее всего неверная конфигурация проекта...
Попробуй воспользоваться стандартными шаблонами MPLABa:
"диск":\Program Files\Microchip\MPASM Suite\Template
"диск":\Program Files\Microchip\MPASM Suite\Template\Code -- 16F873ATEMP.asm
или для относительной адресации
"диск":\Program Files\Microchip\MPASM Suite\Template\Object -- 16F873ATMPO.asm
только не позатирай и не утащи исходные файлы из их каталогов (лучше "копировать-вставить") !!!
Ежли чего - насчет ассемблера позлодействуем... ( http://radiokot.ru/forum/viewtopic.php? ... 0%BA%D0%B8)
:beer:
Реклама
Аватара пользователя
maks14
Друг Кота
Сообщения: 8785
Зарегистрирован: Пн апр 11, 2011 14:56:46
Откуда: Дальний восток.

Re: PIC16F873A как сбросить стек?

Сообщение maks14 »

Спасибо что откликнулись :) бум мучить. :beer:
так то если не использовать стек-программа будет в 3 раза больше...жесть :shock: .
это я дисплей 1602 инициализировать пытаюсь.
писал простую программку для PIC16F629(другой проект) в ней все пучком-стек не переполняется.
а тут грабли с 873 :)
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: PIC16F873A как сбросить стек?

Сообщение BOB51 »

У среднемалых пиков баловаться с аппаратным стеком есть садомазохизмо однако... :shock:
Другое дело ежли программно-организованный стек (или более корректное применение регистров СОЗУ) или на крайний случай верхушка стека у 18-х. :roll:
А самый муррр - у MCS51 или у AVR.
:beer:
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: PIC16F873A как сбросить стек?

Сообщение dosikus »

Вы здесь какие то страсти описываете . Какие еще махинации . Стек аппаратный, софтово НЕДОСТУПЕН.
У ТС банальное не понятие структуры программы . Код выкладывайте.
Реклама
Аватара пользователя
maks14
Друг Кота
Сообщения: 8785
Зарегистрирован: Пн апр 11, 2011 14:56:46
Откуда: Дальний восток.

Re: PIC16F873A как сбросить стек?

Сообщение maks14 »

Так и код банален-сконфигурирован процессор-организуем любую подпрограмму с вызовом call и возвратом return.
ошибка на моменте возврата из подпрограммы. отладчик(PIC simulator IDE) пишет дойдя до стоки return= hardware stack underflow.
и останавливает работу.
и в протеусе не вылазит из подпрограммы.

пс. если что- компилятор не ругается.


код во вложении. для примера=подпрограмма записывает из акамулятора в порт.
Спойлер#include P16F873A.inc ; подключение фаила для 16F873A
__config B'11111000001' ; КОНФИГУРИРОВАНИЕ контрллера.
org 0
goto START
;------------------------------

CYCLE

;ПРОЦЕСС

movlw B'11111111'
movwf TRISB


GOTO CYCLE





;--------------------------------------------------------------
START


clrf STATUS ;очистка регистра статус
clrf INTCON ;очиска регистра прерывания

;КОНФИГУРАЦИЯ ПОРТОВ ВВОДА ВЫВОДА

CLRF PORTA ;
CLRF PORTB
CLRF PORTC ;
BSF STATUS, RP0
movlw 00
movwf TRISA
movlw 00
movwf TRISB
movlw B'11111111'
movwf TRISC
clrf STATUS
movlw 00
;------------------------






;----------------------------
;----------------------------
;ИНИЦИАЛИЗАЦИЯ ДИСПЛЕЯ WH1602
;----------------------------
;----------------------------
;----------------------------


;

movlw b'00110011'
call pause1; вызов нашей подпрограммы



; вот этот тип странной наружности ;)--

pause1

movwf TRISB

return

;---------------------------------------


GOTO CYCLE

end
Реклама
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: PIC16F873A как сбросить стек?

Сообщение Ser60 »

Похоже, программа составлена из кусков других программ. Уберите return в конце и все перестанут ругаться на stack (может будут ругаться на что-то еще). return нужет для возврата из подпрограмм а у Вас никакие подпрограммы не вызываются.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: PIC16F873A как сбросить стек?

Сообщение BOB51 »

:)))
растущий в геометрической прогрессии RETurn...
:)))


movlw b'00110011'
call pause1; вызов нашей подпрограммы

STOP:
goto stop ; !!!!!!!!!!!!!!!!!
или на точку вызова pause1 оа худой конец :)))

; вот этот тип странной наружности --

pause1

movwf TRISB

return
koms48
Встал на лапы
Сообщения: 132
Зарегистрирован: Пт окт 19, 2012 05:54:55

Re: PIC16F873A как сбросить стек?

Сообщение koms48 »

Вынеси подпрограмму из цикла, поставь перед END-ом, и вся любоф.
koms48
Встал на лапы
Сообщения: 132
Зарегистрирован: Пт окт 19, 2012 05:54:55

Re: PIC16F873A как сбросить стек?

Сообщение koms48 »

Bоще бардак с выбором банков, по-твоему все регистры в одном находятся?
Аватара пользователя
maks14
Друг Кота
Сообщения: 8785
Зарегистрирован: Пн апр 11, 2011 14:56:46
Откуда: Дальний восток.

Re: PIC16F873A как сбросить стек?

Сообщение maks14 »

BOB51 писал(а)::)))
растущий в геометрической прогрессии RETurn...
:)))
Да уж :)) ..короче пробовал даже убирать вообще "гото".
убрал команду вызова подпрограммы (call)
все равно залазит в подпрограмму :shock: :dont_know: ..
не должно быть такого....
Спойлер#include P16F873A.inc ; подключение фаила для 16F873A
__config B'11111000001' ; КОНФИГУРИРОВАНИЕ контрллера.
org 0
;------------------------------
;--------------------------------------------------------------



clrf STATUS ;очистка регистра статус
clrf INTCON ;очиска регистра прерывания

;КОНФИГУРАЦИЯ ПОРТОВ ВВОДА ВЫВОДА

CLRF PORTA ;
CLRF PORTB
CLRF PORTC ;
BSF STATUS, RP0
movlw 00
movwf TRISA
movlw 00
movwf TRISB
movlw B'11111111'
movwf TRISC
clrf STATUS
movlw 00
;------------------------






;----------------------------
;----------------------------
;ИНИЦИАЛИЗАЦИЯ ДИСПЛЕЯ WH1602
;----------------------------
;----------------------------
;----------------------------


;



;---------------------------------------







movlw b'00110011'




; вот этот тип странной наружности ;)--

pause1

movwf TRISB

return




end
Последний раз редактировалось maks14 Сб июн 15, 2013 04:09:17, всего редактировалось 1 раз.
koms48
Встал на лапы
Сообщения: 132
Зарегистрирован: Пт окт 19, 2012 05:54:55

Re: PIC16F873A как сбросить стек?

Сообщение koms48 »

#include P16F873A.inc ; подключение фаила для 16F873A
__config B'11111000001' ; КОНФИГУРИРОВАНИЕ контрллера.
org 0
goto START
;------------------------------

CYCLE

;ПРОЦЕСС
banksel TRISB
movlw B'11111111'
movwf TRISB

GOTO CYCLE

;--------------------------------------------------------------
START

banksel STATUS
clrf STATUS ;очистка регистра статус
clrf INTCON ;очиска регистра прерывания

;КОНФИГУРАЦИЯ ПОРТОВ ВВОДА ВЫВОДА

CLRF PORTA ;
CLRF PORTB
CLRF PORTC ;
BSF STATUS, RP0
movlw 00
banksel TRISA
movwf TRISA
movlw 00
movwf TRISB
movlw B'11111111'
movwf TRISC
banksel STATUS
clrf STATUS
movlw 00
;------------------------

;ИНИЦИАЛИЗАЦИЯ ДИСПЛЕЯ WH1602
;----------------------------

movlw b'00110011'
call pause1; вызов нашей подпрограммы

;---------------------------------------

GOTO CYCLE
pause1
banksel TRISB
movwf TRISB

return
end
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: PIC16F873A как сбросить стек?

Сообщение Ser60 »

Посудите сами, что будет происходить в первой версии программы в следующем фрагменте кода:

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

call pause1; вызов нашей подпрограммы

; вот этот тип странной наружности ;)--
pause1
movwf TRISB
return
После вызова подпрограммы pause1 в стеке будет адрес возврата, а управление передастся на метку pause1. Оператор movwf TRISB проработает, затем return вынет адрес возврата из стека и передаст управление на команду, следующую за инструкцией call pause1, т.е. опять на метку pause1. Это только Вы знаете, что это должна быть подпрограмма. Процессору это все равно, он и не знает, что такое подпрограммы вообще. Короче, тело подпрограммы выполнится опять и при выполнении команды return процессор полезет в стек за адресом возврата. А там ничего нет. Поэтому и Stack Underflow.
Аватара пользователя
maks14
Друг Кота
Сообщения: 8785
Зарегистрирован: Пн апр 11, 2011 14:56:46
Откуда: Дальний восток.

Re: PIC16F873A как сбросить стек?

Сообщение maks14 »

koms48 Усе работает. спасибо мил человек :) ...
только переключение банки(banksel TRISB) оказалось лишним.
теперь понял свой косяк :)) тему можно в утиль.

Ser60 я на примерах привык учится. вот выложили код-и сразу понял как организовано обращение к подпрограмме.
Ответить

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