Свежие обсуждения
Микроконтроллеры

Счетчик импульсов на MCS-51

Здравствуйте !
Давно изучал микроконтроллер MCS51, вот сделал попытку написать такую программку не сложную, оцените пожалуйста, чувствую есть ошибки:
(написал пока основу, далее если все верно в чем я не уверен ... буду реализовывать индикацию)

.ORG 0H ;Начало программы
AJMP START
.ORG 03
AJMP INT

;------------------------------ инициализация ------------------------
START:
SETB IP.0 ;приоритет перывания от INT0
SETB P3.2 ;вкл. альт. ф-ии(требование сист.)
MOV TCON,#00000001b ;тип прерывания - по срезу
CLR A ;очистка аккумулятора
;MOV R7,#00h ;счетчик сотен мегаВт
MOV R6,#00h ;десятки мегаВт
MOV R5,#00h ;мегаВт
MOV R4,#00h ;100 кВт
MOV R3,#00h ;10 кВт
MOV R2,#00h ;кВт
MOV R1,#00h ;сотни Вт
MOV R0,#00h ;десятки Вт
SETB EA ;cнятие блокировки прерываний (IE.7)
AJMP $ ;зацикливаемся

;------------------ ПП обработки прерывания по срезу INT0(порт 3.2) --------------------------
INT:
INC R0 ;inc счетчика десятков Вт
СJNE R0,#09h,EXIT ;проверка достижения 9, если != 9 выход из ПП
CLR R0 ;если = 9, переход и очищаем регистр
INC R1 ;inc следущего счетчика - сотен Вт
СJNE R1,#09h,EXIT
CLR R1
INC R2
СJNE R2,#09h,EXIT
CLR R2
INC R3
СJNE R3,#09h,EXIT
CLR R3
INC R4
СJNE R4,#09h,EXIT
CLR R4
INC R5
СJNE R5,#09h,EXIT
CLR R5
INC R6
EXIT: RETI

END

 

Ну как минимум надо сохранять PSW на стеке при входе в прерывание ( в принципе надо сохранять все регистры, что используются в прерываниях) . И наверное более рационально было бы включить таймер в режим счетчика им импульсов и считать аппаратно так сказать, без прерываний.

 

Ilya_z: ЗАчем таймер в счетик ? Те же прерывания и там будут.
Тут вот необходимый минимум.

На счет сохранения PSW в стек, зачем ? Тут подпрограмма обрабоки прерывания от INT0 на сколько я помню она не требует сохранния в стек данных но я могу ошибаться

 

На быстрый взгляд тут особенность:
Зона для адресов векторов прерываний занята под программу...
это не запрещено, но надо запретить все остальные прерывания, кроме вектора 03h...

 

Во ! спасибо Vlad_Petr.

Сделаю лучше
.ORG 09H ;Начало программы
AJMP START

допустим ...

 

03H - INT0
0BH - CT0
13H - INT1
1BH - CT1
23Н - от приемо-передатчика ...

начинай лучше со 100Н,
а будет места мало - спускайтесь ниже.

 

Cheeeper: да, согласен !

 

lex: Ilya_z: ЗАчем таймер в счетик ? Те же прерывания и там будут.
Прерывания будут только по переполнению, а так будет считать безо всяких прерываний.

lex: На счет сохранения PSW в стек, зачем ? Тут подпрограмма обрабоки прерывания от INT0 на сколько я помню она не требует сохранния в стек данных но я могу ошибаться
Ну если тела программы как такового совсем нет, то можно конечно и не сохранять.

 

Cheeeper: 03H - INT0
0BH - CT0
13H - INT1
1BH - CT1
23Н - от приемо-передатчика

параноидально настроенный народ любит на всякий случай по этим адресам RETI ставить ;)))

 

"параноидально настроенный народ любит на всякий случай по этим адресам RETI ставить ;)))"
Ilya_z: Ну это вопрос решенный, просто начинать Память программ с адреса 100h ...