Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-дек-12 17:24

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: 1886ВЕ2У для начинающих
СообщениеДобавлено: 2010-июл-12 14:40 
Не в сети

Зарегистрирован: 2010-июл-12 14:25
Сообщения: 2
Здравствуйте. У меня на плате на выводах портов PORTG,PORTE висят светодиоды через логику. Выводить на них(на порты) единицы не получается. Пользуюсь компилятором СС7А. Вроде настраиваю их на вывод(DDRx=0;), присваиваю PORTx=0xff;(и т.п.), но эффекта нет. В чём дело. Работал с отладочным комплектом EVAL8 вроде нормально там было, а что здесь не так? На выводах PORTG сидит переферия(АЦП), игрался и сним, но эффекта нет. Что я делаю не так, подскажите начинающему..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ2У для начинающих
СообщениеДобавлено: 2010-июл-12 15:22 
Не в сети

Зарегистрирован: 2009-май-25 16:41
Сообщения: 206
Откуда: АО "ПКК Миландр"
Milarndr писал(а):
Здравствуйте. У меня на плате на выводах портов PORTG,PORTE висят светодиоды через логику. Выводить на них(на порты) единицы не получается. Пользуюсь компилятором СС7А. Вроде настраиваю их на вывод(DDRx=0;), присваиваю PORTx=0xff;(и т.п.), но эффекта нет. В чём дело. Работал с отладочным комплектом EVAL8 вроде нормально там было, а что здесь не так? На выводах PORTG сидит переферия(АЦП), игрался и сним, но эффекта нет. Что я делаю не так, подскажите начинающему..


PORTG после сброса устанавливается в режим аналоговых входов для АЦП. Для полноценного использования его в качестве цифровых входов/выходов, необходимо дополнительно сконфигурировать ADCON1. Альтернативная функция порта PORTE - управляющие сигналы системной шины в режиме микропроцессора или расширенного микроконтроллера. Больше ни каких особенностей у этих портов нет. Проверьте Вашу программу и установленную конфигурацию микроконтроллера (режим, WDT и т.д.). Посмотрите уровень сигналов непосредственно на портах микроконтроллера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 2010-июл-13 15:14 
Не в сети

Зарегистрирован: 2010-июл-12 14:25
Сообщения: 2
Самое пугающее это, то что порты на плате вдруг начали работать как надо и даже без настройки ADCON1. Может схемная где-то ошибка? :?: :?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ2У для начинающих
СообщениеДобавлено: 2012-апр-19 08:54 
Не в сети

Зарегистрирован: 2012-апр-19 08:47
Сообщения: 8
Подскажите, в чем ошибка? пытаюсь на отладочной плате 1886ВЕ2У кнопками влиять на линейку светодиодов(PORTEF, похоже, ошибка с кнопками(PORTE) хотя вроде написал как в демо программе. :?

Include 1886ve2m.INC
radix dec
WORK1 EQU 022H
ORG 0000H
Start: BSF CPUSTA,GLINTD ; запрет всех прерываний
CLRF BSR,F ; установка SFR и GPR Bank 0
; Начальная установка портов ввода/вывода и т.д.
MOVLB 01H ; * установка SFR Bank 1
SETF DDRE,F ; PORTE - входы
MOVLB 05H ; * установка SFR Bank 5
SETF PORTF,F ; сброс порта PORTF
CLRF DDRF,F ; PORTF - выходы
;-----------------------------------------
m1:
CLRWDT ; сброс "сторожевого таймера"
BTFSS PORTE,1
goto m2
movlw 0AAH
movwf PORTF
goto m1
m2: movlw 055H
movwf PORTF
goto m1
END


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ2У для начинающих
СообщениеДобавлено: 2012-апр-19 09:26 
Не в сети

Зарегистрирован: 2009-май-25 15:07
Сообщения: 158
Откуда: АО "ПКК Миландр"
Andre писал(а):
Подскажите, в чем ошибка? пытаюсь на отладочной плате 1886ВЕ2У кнопками влиять на линейку светодиодов(PORTEF, похоже, ошибка с кнопками(PORTE) хотя вроде написал как в демо программе. :?

Include 1886ve2m.INC
radix dec
WORK1 EQU 022H
ORG 0000H
Start: BSF CPUSTA,GLINTD ; запрет всех прерываний
CLRF BSR,F ; установка SFR и GPR Bank 0
; Начальная установка портов ввода/вывода и т.д.
MOVLB 01H ; * установка SFR Bank 1
SETF DDRE,F ; PORTE - входы
MOVLB 05H ; * установка SFR Bank 5
SETF PORTF,F ; сброс порта PORTF
CLRF DDRF,F ; PORTF - выходы
;-----------------------------------------
m1:
CLRWDT ; сброс "сторожевого таймера"
BTFSS PORTE,1
goto m2
movlw 0AAH
movwf PORTF
goto m1
m2: movlw 055H
movwf PORTF
goto m1
END
Код:
MOVLB   05H     ; * установка SFR Bank 5
SETF    PORTF,F ; сброс порта PORTF
CLRF    DDRF,F  ; PORTF - выходы
;-----------------------------------------
m1:
  BTFSS  PORTE,1  <<< установлен банк 5, надо банк 1
goto m2
movlw 0AAH
            << не забыть снова переключиться на банк 5
movwf PORTF
goto m1
m2: movlw 055H
            << не забыть снова переключиться на банк 5
movwf PORTF
goto m1
         END


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ2У для начинающих
СообщениеДобавлено: 2012-апр-19 09:32 
Не в сети

Зарегистрирован: 2012-апр-19 08:47
Сообщения: 8
Спасибо! :D буду проверять, не работал до этого с банками, думал надо 1 раз указать только)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ2У для начинающих
СообщениеДобавлено: 2012-май-03 15:34 
Не в сети

Зарегистрирован: 2012-фев-01 08:43
Сообщения: 15
Привет. Нашёл в экземлах компилятора(INT17XX.C) вот такой обработчик:

Код:
shrBank char sBSR, sALUSTA;
bank0 char sWREG, sPCLATH;

#pragma origin = 0x8
interrupt INT_server( void)
{
   #asm
    ; ADDRESS 0x08
    ; process INT pin interrupt
    ; INTF is automatically cleared when the CPU vectors to 0x8
    ; 8 application instructions can be inserted here
    MOVFP BSR,sBSR           ; unbanked
    CLRF  BSR
    BSF   b1                 ; set flag
    BSF   PORTB,1            ; pulse on port pin
    NOP
    BCF   PORTB,1
    MOVFP sBSR,BSR
    RETFIE
   #endasm
}

#pragma origin = 0x10
interrupt TMR0_server( void)
{
   #asm
    ; ADDRESS 0x10
    ; TMR0_service: process Timer 0 interrupt
    ; T0IF is automatically cleared when the CPU vectors to 0x10
    ; 8 application instructions can be inserted here
    INFSNZ a      ; 'a' must be unbanked
    RETFIE
    RETFIE
   #endasm
}


#pragma origin = 0x18
interrupt iServer( void)
{
   #asm
    ; ADDRESS 0x18
    MOVFP BSR,sBSR           ; unbanked
    MOVFP ALUSTA, sALUSTA    ; unbanked
    CLRF BSR
    MOVPF PCLATH, sPCLATH    ; bank 0
    MOVWF sWREG              ; bank 0
    CLRF PCLATH
    GOTO T0CKI_service
    NOP

    ; ADDRESS 0x20
    MOVFP BSR,sBSR           ; unbanked
    MOVFP ALUSTA, sALUSTA    ; unbanked
    CLRF BSR
    MOVPF PCLATH, sPCLATH    ; bank 0
    MOVWF sWREG              ; bank 0
    CLRF PCLATH
    ; GOTO PERIPHERAL_service
   #endasm


PERIPHERAL_service:
    // save on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1
    // the right peripheral interrupt flag must be cleared manually
    /* process periferal interrupt */
    if (RC1IF)  {
        RC1IF = 0;   // application code to be inserted here
    }
    if (TX1IF)  {
        TX1IF = 0;   // application code to be inserted here
    }
    if (CA1IF)  {
        CA1IF = 0;  // application  code to be inserted here
    }
    if (CA2IF)  {
        CA2IF = 0;  // application  code to be inserted here
    }
    if (TMR1IF)  {
        TMR1IF = 0; // application code to be inserted here
    }
    if (TMR2IF)  {
        TMR2IF = 0; // application code to be inserted here
    }
    if (TMR3IF)  {
        TMR3IF = 0; // application code to be inserted here
    }
    if (RBIF)  {
        RBIF = 0;   // application code to be inserted here
    }
    // restore on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1

   #asm
    MOVFP sWREG,W            ; bank 0
    MOVFP sPCLATH, PCLATH    ; bank 0
    MOVFP sALUSTA, ALUSTA    ; unbanked
    MOVFP sBSR, BSR          ; unbanked
    RETFIE
   #endasm


T0CKI_service:
    // save on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1

    /* process T0CKI pin interrupt */
    // T0CKIF is automatically cleared when the CPU vectors to 0x18
    // application code to be inserted here

    // restore on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1

   #asm
    MOVFP sWREG,W            ; bank 0
    MOVFP sPCLATH, PCLATH    ; bank 0
    MOVFP sALUSTA, ALUSTA    ; unbanked
    MOVFP sBSR, BSR          ; unbanked
    RETFIE
   #endasm
}



как сохранять правильно рег. FSR0 при переходе в этот обработчик. Я пытался сделать это, дописав на месте, где указывают комменты "// save on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1" и "// restore on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1" соответственно sFSR0=FSR0;и FSR0=sFSR0; но компилятор выводит ошибку FSR0 not saved/restored during interrupt 'iServer'. Пробовал такж ассемблерной ставкой сохраниться, то же самое. Где ошибся?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ2У для начинающих
СообщениеДобавлено: 2012-май-03 16:55 
Не в сети

Зарегистрирован: 2009-май-25 15:07
Сообщения: 158
Откуда: АО "ПКК Миландр"
qwe522y писал(а):
как сохранять правильно рег. FSR0 при переходе в этот обработчик. Я пытался сделать это, дописав на месте, где указывают комменты "// save on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1" и "// restore on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1" соответственно sFSR0=FSR0;и FSR0=sFSR0; но компилятор выводит ошибку FSR0 not saved/restored during interrupt 'iServer'. Пробовал такж ассемблерной ставкой сохраниться, то же самое. Где ошибся?
Вот этот код замечательно транслируется
Код:
char sFSR0;
................
    multi_interrupt_entry_and_save
    sFSR0=FSR0;
PERIPHERAL_service:
TMR0_service:
    FSR0=0;
T0CKI_service:
INT_service:
    FSR0=sFSR0;   
    interrupt_exit_and_restore


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ2У для начинающих
СообщениеДобавлено: 2012-май-05 13:08 
Не в сети

Зарегистрирован: 2012-фев-01 08:43
Сообщения: 15
Lew писал(а):
qwe522y писал(а):
как сохранять правильно рег. FSR0 при переходе в этот обработчик. Я пытался сделать это, дописав на месте, где указывают комменты "// save on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1" и "// restore on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1" соответственно sFSR0=FSR0;и FSR0=sFSR0; но компилятор выводит ошибку FSR0 not saved/restored during interrupt 'iServer'. Пробовал такж ассемблерной ставкой сохраниться, то же самое. Где ошибся?
Вот этот код замечательно транслируется
Код:
char sFSR0;
................
    multi_interrupt_entry_and_save
    sFSR0=FSR0;
PERIPHERAL_service:
TMR0_service:
    FSR0=0;
T0CKI_service:
INT_service:
    FSR0=sFSR0;   
    interrupt_exit_and_restore



Да, я понял, что ЭТОТ код "замечательно транслируется". В том экземле на который я указывал выше вариант с "multi_interrupt_entry_and_save..." в обработчике тоже показывается и он работает прекрасно(FSR0 и др. реги сохраняются отлично), но так же там представлен пример с пометкой /* THIS IS AN EXAMPLE OF HOW TO MAKE CUSTOM REGISTER SAVE FOR VERY FAST INTERRUPT HANDLING ON SOME INTERRUPTS.*/ 1.В каких случаях используется данный обработчик? 2.Как сохранить в нём нужный мне FSR0?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ2У для начинающих
СообщениеДобавлено: 2012-май-05 16:21 
Не в сети

Зарегистрирован: 2009-май-25 15:07
Сообщения: 158
Откуда: АО "ПКК Миландр"
qwe522y писал(а):
Да, я понял, что ЭТОТ код "замечательно транслируется". В том экземле на который я указывал выше вариант с "multi_interrupt_entry_and_save..." в обработчике тоже показывается и он работает прекрасно(FSR0 и др. реги сохраняются отлично), но так же там представлен пример с пометкой /* THIS IS AN EXAMPLE OF HOW TO MAKE CUSTOM REGISTER SAVE FOR VERY FAST INTERRUPT HANDLING ON SOME INTERRUPTS.*/ 1.В каких случаях используется данный обработчик? 2.Как сохранить в нём нужный мне FSR0?
Это примеры обработчиков с минимальным временем выполнения прерывания. К тому же с ошибками: например, T0IF не сбрасывается аппаратно.
1. Судя по тому, что в прерывании используется FSR, это не Ваш случай.
2. Обработчики работают в нулевом банке, поэтому используйте для определения sFSR модификаторы shrBank или bank0.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ2У для начинающих
СообщениеДобавлено: 2012-июл-06 11:31 
Не в сети

Зарегистрирован: 2012-май-29 13:53
Сообщения: 1
Здраствуйте. Не могли бы Вы помочь в след. вопросе. Для 1886ВЕ2 на отладочной плате EVAL8 написал програмку преобразования двоичного кода, (который хранится в регистре WORK и увелич. на 1 при нажатии кнопки порта Е), в
->BCD-> в семисегментный и выводит на 7-ми сегм. индикатор. Алгоритм преобразования bin->bcd широко известен и применялся для pic 16, однако программа не работает упорно. Чтоб не быть голословным- ниже приведён текст проги . Помогите разобраться в чём дело.
; *******************************************************************************
; Íàçíà÷åíèå ïîðòîâ ìèêðîêîíòðîëëåðà:
; RE0-RE3(âõ.)ïîäêëþ÷åíû 4 êëàâèøè, SW4 óïðàâëÿþùàÿ
; RF0-RF7(âûõ.)ïîäêëþ÷åíà ëèíåéêà ñâåòîäèîäîâ
; RC0-RC6(âûõ.)ñåãìåíòû èíäèêàòîðà ABCDEFG
; RD1-êàòîä ñîòíè RD2-êàòîä äåñÿòêè RD3-êàòîä åäèíèöû
; *******************************************************************************
Include 1886ve2m.INC
radix dec
WORK EQU 022H; ðåãèñòð äëÿ õðàíåíèÿ ÷èñëà,âûâîäèìîãî íà èíäèêàòîð
EDINICI EQU 023h; ðåãèñòð äëÿ õðàíåíèÿ çí. åäèíèö.
DESYATKI EQU 024h; ðåãèñòð äëÿ õðàíåíèÿ çí. äåñÿòêîâ.
SOTNI EQU 025h; ðåãèñòð äëÿ õðàíåíèÿ çí. ñîòåí.
ORG 0000H
;------íàñòðîéêà ïîðòîâ ââîäà/âûâîäà-----------------------------------

CLRF BSR,1 ; óñòàíîâêà SFR è GPR Bank 0
MOVLB 01H ; * óñòàíîâêà SFR Bank 1- ïîðò Å, ïîðò Ñ, ïîðò D
SETF DDRE,1; PORTE - âõîäû
CLRF DDRC,1; PORTC - âûõîäû
CLRF DDRD,1; PORTD - âûõîäû
CLRF PORTD,1; çàïèñü íóëåé â ðåãèñòðû ïîðòà
CLRF PORTC,1; çàïèñü íóëåé â ðåãèñòðû ïîðòà
MOVLB 05H; * óñòàíîâêà SFR Bank 5- ïîðò F
SETF PORTF,1; ñáðîñ ïîðòà PORTF
CLRF DDRF,1; PORTF - âûõîäû
CLRF WORK,1; î÷èñòêà ðàáî÷åãî ðåãèñòðà
;------------------------------------------------------------------------------
goto start
;-----ïîäïðîãð. ïðåîáð. äâîè÷í.-äåñÿòè÷í. êîäà â ñåìèñåãììåíòíûé êîä-----------
TOSEVEN: ;ìåòêà íà÷. ïîäïðîãðàììû ïðåîáð. bcd to seven..
CLRF PCL,1 ; î÷èñòêà ðåãèñòðà ñ÷¸ò÷. êîìàíä
addwf PCL,1;ñîäåðæ.ðåã.WREG+ñîäåðæ.ðåã.ñ÷¸ò÷.êîìàíäPCL ->ðåç.ñîõð. â PCL
retlw 00111111b ; ..FEDCBA = '0'->WREG è âîçâðàò èç ïîäïðîãð
retlw 00000110b ; .....CB. = '1'->WREG è âîçâðàò èç ïîäïðîãð
retlw 01011011b ; .G.ED.BA = '2'->WREG è âîçâðàò èç ïîäïðîãð
retlw 01001111b ; .G..DCBA = '3'->WREG è âîçâðàò èç ïîäïðîãð
retlw 01100110b ; .GF..CB. = '4'->WREG è âîçâðàò èç ïîäïðîãð
retlw 01101101b ; .GF.DC.A = '5'->WREG è âîçâðàò èç ïîäïðîãð
retlw 01111101b ; .GFEDC.A = '6'->WREG è âîçâðàò èç ïîäïðîãð
retlw 00000111b ; .....CBA = '7'->WREG è âîçâðàò èç ïîäïðîãð
retlw 01111111b ; .GFEDCBA = '8'->WREG è âîçâðàò èç ïîäïðîãð
retlw 01101111b ; .GF.DCBA = '9'->WREG è âîçâðàò èç ïîäïðîãð
;-------------------------------------------------------------------------
;--------------------îñíîâíàÿ ïðîãðàììà-----------------------------------
start:
BSF CPUSTA,GLINTD ; óñò.áèòà ãëîáàëüí.çàïðåòà âñåõ ïðåðûâàí.â ðåã.â1
CLRF EDINICI,1; î÷èñòêà ðåã.õðàí. åäèíèö
CLRF SOTNI,1; î÷èñòêà ðåã.õðàí. ñîòåí
CLRF DESYATKI,1; î÷èñòêà ðåã.õðàí. äåñÿòêîâ
CLRF BSR,1 ; îáíóëåí.ðåã.âûáîðà áàíêà äëÿ îáðàù. ê ïîðòó

MOVLB 01H; çàãð.1â BSRäëÿ âûá.áàíêà1, Å-êëàâèøè
SETF DDRE,1; ïîðò Å- âõîäû
BTFSS PORTE,1;åñëè áèò 1 â ðåã.Porte=1,òî ñëåä.êîìàíä.ïðîï.
INCF WORK,1; óâåëè÷åí. çí.WORK íà 1.
MOVFP WORK,WREG; ïåðåñûëêà çí. WORK->WREG
MOVLB 05H;çàãð.5â BSRäëÿ âûá.áàíêà5, ïîðò-F
MOVWF PORTF; ïåðåñûëêà çí.WORK->PORTFíà ñâåòîäèîäû
CLRWDT
;------------êîíåö îñíîâíîé ïðîãðàììû---------------------------

;---ïîäïðîãð.ïðåîáð.äâîè÷í.êîäà â äâîè÷íî-äåñÿòè÷íûé convert bin to bcd -
;-------------áûëà íàïèñàííà äëÿ PIC16f8 ---------------------------------
loopSOTNI:
incf SOTNI,1 ;óâåëè÷. çí. ðåã. ñîòåí íà 1 è ñîõð â SOTNI
movlw 100 ;çàãðóçêà ÷èñëà 100 â WREG
subwf WORK,1 ;WORK-WREG->WORK
btfsc ALUSTA,DC;åñëè áèòDC-ôëàã ïåðåíñà/çà¸ìà=0,ò.å.íåò ïåðåíîñà,goto ïðîï
;-----??? òàê ìîæíî??? íà PIC16f8 ðàáîòàëî, íî òàì áûë ðåãèñòð status-------
goto loopSOTNI
decf SOTNI,1; óìåíüø. çí. ðåã. ñîòåí íà 1 è ñîõð â SOTNI
movlw 100 ;çàãðóçêà ÷èñëà 100 â WREG
addwf WORK,1 ;WORK+WREG->WORK

loopDESYATKI:
incf DESYATKI,1 ;óâåëè÷. çí. ðåã. äåñÿòêîâ íà 1 è ñîõð â DESYATKI
movlw 10 ;çàãðóçêà ÷èñëà 10 â WREG
subwf WORK,1 ;WORK-WREG->WORK
btfsc ALUSTA,DC;åñëè áèòDC-ôëàã ïåðåíñà/çà¸ìà=0,ò.å.íåò ïåðåíîñà,goto ïðîï
goto loopDESYATKI
decf DESYATKI,1 ;óìåíüø. çí. ðåã. äåñÿòêîâ íà 1 è ñîõð â DESYATKI
movlw 10 ;çàãðóçêà ÷èñëà 10 â WREG
addwf WORK,1;WORK+WREG->WORK

;loopEDINICI-íå òðåá,ò.ê.çàíèìàåò îäíó òåòðàäó
movfp WORK,WREG ;ïåðåñûëêà äàí. èç WORK -> WREG
movwf EDINICI;ïåðåñûëêà äàí. èç WREG -> EDINICI

;-----ïðåîáð. bcd êîäà â ñåìèñåãìåíòíûé convert bcd to seven segments code ----
;-----âûâîä åäèíèö íà èíäèêàòîð--------------------------------------------
movfp EDINICI,WREG ;ïåðåñûëêà äàí. èç EDINICI -> WREG
CALL TOSEVEN; çíà÷åíèå åäèíèö îñò. â WREG,âûçûâ. ïîäïðîãð.TOSEVEN
MOVLB 01H; çàãð.1â BSRäëÿ âûá.áàíê1,ò.ê.â í¸ì ïîðòÑ-ñåãìåíòû è D-êàòîäû
MOVWF PORTC; ïåðåñûëêà åäèíèö èç WREG â ïîðò C-ñåãìåíòû.
MOVLW 00001000b; çàãð.1â WREG-íîìåð êàòîäà èíäèêàòîðà
MOVWF PORTD; ïåðåñûëêà åäèíèö 00001000 èç WREG â ïîðò D- êàòîäà¹1
;-----âûâîä äåñÿòêîâ íà èíäèêàòîð---------------------------

movfp DESYATKI,WREG ;ïåðåñûëêà äàí. èç DESYATKI -> WREG
CALL TOSEVEN; çíà÷åíèå äåñÿòêîâ îñò. â WREG,âûçûâ. ïîäïðîãð.TOSEVEN
MOVWF PORTC; ïåðåñûëêà äåñÿòêîâ èç WREG â ïîðò C-ñåãìåíòû.
MOVLW 00000100b; çàãð.2â WREG-íîìåð êàòîäà èíäèêàòîðà
MOVWF PORTD; ïåðåñûëêà åäèíèö 00000100 èç WREG â ïîðò D- êàòîäà¹2
;-----âûâîä ñîòåí íà èíäèêàòîð---------------------------

movfp SOTNI,WREG ;ïåðåñûëêà äàí. èç SOTNI -> WREG
CALL TOSEVEN; çíà÷åíèå ñîòåí îñò. â WREG,âûçûâ. ïîäïðîãð.TOSEVEN
MOVWF PORTC; ïåðåñûëêà ñîòåí èç WREG â ïîðò C-ñåãìåíòû.
MOVLW 00000010b; çàãð.3â WREG-íîìåð êàòîäà èíäèêàòîðà
MOVWF PORTD; ïåðåñûëêà åäèíèö 00000010 èç WREG â ïîðò D- êàòîäà¹3

goto start
end


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ2У для начинающих
СообщениеДобавлено: 2012-июл-06 17:44 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 2009-янв-20 10:05
Сообщения: 778
Код:
; *******************************************************************************
; Назначение портов микроконтроллера:
; RE0-RE3(вх.)подключены 4 клавиши, SW4 управляющая
; RF0-RF7(вых.)подключена линейка светодиодов
; RC0-RC6(вых.)сегменты индикатора ABCDEFG
; RD1-катод сотни RD2-катод десятки RD3-катод единицы
; *******************************************************************************
Include 1886ve2m.INC
radix dec
WORK EQU 022H; регистр для хранения числа,выводимого на индикатор
EDINICI EQU 023h; регистр для хранения зн. единиц.
DESYATKI EQU 024h; регистр для хранения зн. десятков.
SOTNI EQU 025h; регистр для хранения зн. сотен.
ORG 0000H
;------настройка портов ввода/вывода-----------------------------------

CLRF BSR,1 ; установка SFR и GPR Bank 0
MOVLB 01H ; * установка SFR Bank 1- порт Е, порт С, порт D
SETF DDRE,1; PORTE - входы
CLRF DDRC,1; PORTC - выходы
CLRF DDRD,1; PORTD - выходы
CLRF PORTD,1; запись нулей в регистры порта
CLRF PORTC,1; запись нулей в регистры порта
MOVLB 05H; * установка SFR Bank 5- порт F
SETF PORTF,1; сброс порта PORTF
CLRF DDRF,1; PORTF - выходы
CLRF WORK,1; очистка рабочего регистра
;------------------------------------------------------------------------------
goto start
;-----подпрогр. преобр. двоичн.-десятичн. кода в семисегмментный код-----------
TOSEVEN: ;метка нач. подпрограммы преобр. bcd to seven..
CLRF PCL,1 ; очистка регистра счётч. команд
addwf PCL,1;содерж.рег.WREG+содерж.рег.счётч.командPCL ->рез.сохр. в PCL
retlw 00111111b ; ..FEDCBA = '0'->WREG и возврат из подпрогр
retlw 00000110b ; .....CB. = '1'->WREG и возврат из подпрогр
retlw 01011011b ; .G.ED.BA = '2'->WREG и возврат из подпрогр
retlw 01001111b ; .G..DCBA = '3'->WREG и возврат из подпрогр
retlw 01100110b ; .GF..CB. = '4'->WREG и возврат из подпрогр
retlw 01101101b ; .GF.DC.A = '5'->WREG и возврат из подпрогр
retlw 01111101b ; .GFEDC.A = '6'->WREG и возврат из подпрогр
retlw 00000111b ; .....CBA = '7'->WREG и возврат из подпрогр
retlw 01111111b ; .GFEDCBA = '8'->WREG и возврат из подпрогр
retlw 01101111b ; .GF.DCBA = '9'->WREG и возврат из подпрогр
;-------------------------------------------------------------------------
;--------------------основная программа-----------------------------------
start:
BSF CPUSTA,GLINTD ; уст.бита глобальн.запрета всех прерыван.в рег.в1
CLRF EDINICI,1; очистка рег.хран. единиц
CLRF SOTNI,1; очистка рег.хран. сотен
CLRF DESYATKI,1; очистка рег.хран. десятков
CLRF BSR,1 ; обнулен.рег.выбора банка для обращ. к порту

MOVLB 01H; загр.1в BSRдля выб.банка1, Е-клавиши
SETF DDRE,1; порт Е- входы
BTFSS PORTE,1;если бит 1 в рег.Porte=1,то след.команд.проп.
INCF WORK,1; увеличен. зн.WORK на 1.
MOVFP WORK,WREG; пересылка зн. WORK->WREG
MOVLB 05H;загр.5в BSRдля выб.банка5, порт-F
MOVWF PORTF; пересылка зн.WORK->PORTFна светодиоды
CLRWDT
;------------конец основной программы---------------------------

;---подпрогр.преобр.двоичн.кода в двоично-десятичный convert bin to bcd -
;-------------была написанна для PIC16f8 ---------------------------------
loopSOTNI:
incf SOTNI,1 ;увелич. зн. рег. сотен на 1 и сохр в SOTNI
movlw 100 ;загрузка числа 100 в WREG
subwf WORK,1 ;WORK-WREG->WORK
btfsc ALUSTA,DC;если битDC-флаг перенса/заёма=0,т.е.нет переноса,goto проп
;-----??? так можно??? на PIC16f8 работало, но там был регистр status-------
goto loopSOTNI
decf SOTNI,1; уменьш. зн. рег. сотен на 1 и сохр в SOTNI
movlw 100 ;загрузка числа 100 в WREG
addwf WORK,1 ;WORK+WREG->WORK

loopDESYATKI:
incf DESYATKI,1 ;увелич. зн. рег. десятков на 1 и сохр в DESYATKI
movlw 10 ;загрузка числа 10 в WREG
subwf WORK,1 ;WORK-WREG->WORK
btfsc ALUSTA,DC;если битDC-флаг перенса/заёма=0,т.е.нет переноса,goto проп
goto loopDESYATKI
decf DESYATKI,1 ;уменьш. зн. рег. десятков на 1 и сохр в DESYATKI
movlw 10 ;загрузка числа 10 в WREG
addwf WORK,1;WORK+WREG->WORK

;loopEDINICI-не треб,т.к.занимает одну тетраду
movfp WORK,WREG ;пересылка дан. из WORK -> WREG
movwf EDINICI;пересылка дан. из WREG -> EDINICI

;-----преобр. bcd кода в семисегментный convert bcd to seven segments code ----
;-----вывод единиц на индикатор--------------------------------------------
movfp EDINICI,WREG ;пересылка дан. из EDINICI -> WREG
CALL TOSEVEN; значение единиц ост. в WREG,вызыв. подпрогр.TOSEVEN
MOVLB 01H; загр.1в BSRдля выб.банк1,т.к.в нём портС-сегменты и D-катоды
MOVWF PORTC; пересылка единиц из WREG в порт C-сегменты.
MOVLW 00001000b; загр.1в WREG-номер катода индикатора
MOVWF PORTD; пересылка единиц 00001000 из WREG в порт D- катода№1
;-----вывод десятков на индикатор---------------------------

movfp DESYATKI,WREG ;пересылка дан. из DESYATKI -> WREG
CALL TOSEVEN; значение десятков ост. в WREG,вызыв. подпрогр.TOSEVEN
MOVWF PORTC; пересылка десятков из WREG в порт C-сегменты.
MOVLW 00000100b; загр.2в WREG-номер катода индикатора
MOVWF PORTD; пересылка единиц 00000100 из WREG в порт D- катода№2
;-----вывод сотен на индикатор---------------------------

movfp SOTNI,WREG ;пересылка дан. из SOTNI -> WREG
CALL TOSEVEN; значение сотен ост. в WREG,вызыв. подпрогр.TOSEVEN
MOVWF PORTC; пересылка сотен из WREG в порт C-сегменты.
MOVLW 00000010b; загр.3в WREG-номер катода индикатора
MOVWF PORTD; пересылка единиц 00000010 из WREG в порт D- катода№3

goto start
end

_________________
Правила форума!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ2У для начинающих
СообщениеДобавлено: 2012-июл-09 11:32 
Не в сети

Зарегистрирован: 2012-апр-19 08:47
Сообщения: 8
Пример преобразования. Исходное число - WORK, результат в W100, W10, W1. На VD1-VD8 отображаются сотни, sw3 выводит десятки, sw4 - единицы. Останется вывести на индикатор..

Include 1886ve2m.INC
radix dec
WORK EQU 021H;
W100 EQU 022H;
W10 EQU 023H;
W1 EQU 024H;
ORG 0000H
BSF CPUSTA,GLINTD
CLRF BSR,F
MOVLB 01H
SETF DDRE,F ; PORTE - входы
MOVLB 05H
SETF PORTF,F ; сброс порта PORTF
CLRF DDRF,F ; PORTF - выходы
CLRF W100
CLRF W10
CLRF W1
Start:
CLRWDT
movlw 0D1H ;209 - преобразуемое число
movwf WORK
r100:
movlw 64H ;100
subwf WORK,1; вычитаем 100, сохраняем в регистре
btfss ALUSTA,C; =1 результат>0,продолжаем считать 100
goto m10; переход к началу подсчета 10, если рез < 0
incf W100,F; +1 к счетчику сотен
goto r100
m10:
movlw 64H ;100
addwf WORK,F ;+100 компенсация
r10:
movlw 0AH ;10
subwf WORK,1; вычитаем 10, сохраняем в регистре
btfss ALUSTA,C; =1 результат>0,продолжаем считать 10
goto m1; переход к началу подсчета 1, если рез < 0
incf W10,F; +1 к счетчику сотен
goto r10
m1:
movlw 0AH ;10
addwf WORK,W ;+10 компенсация
movwf W1
Start1:
CLRWDT
MOVLB 01H
BTFSS PORTE,0
goto m22
BTFSS PORTE,1
goto m23
MOVLB 05H
movfp W100,WREG
movwf PORTF
goto Start1
m22:
MOVLB 05H
movfp W10,WREG
movwf PORTF
goto Start1
m23:
MOVLB 05H
movfp W1,WREG
movwf PORTF
goto Start1
END


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ2У для начинающих
СообщениеДобавлено: 2015-апр-24 14:39 
Не в сети

Зарегистрирован: 2015-апр-24 14:25
Сообщения: 9
Вот доработанная демопрограмма для 1886ВЕ2 :) Оригинальные части программы закомментированы :)

Теперь часы идут и устанавливаются в обратную сторону, из данных с АЦП рассчитывается его входное напряжение в вольтах, а бегущий огонь на светодиодах работает с автореверсом :)

Желаю доброго здоровья и всяческих успехов в освоении!

Все файлы находятся в архиве. Чтобы скомпилировать программу в IDE1886 не забываем ассемблерный файл добавить к файлу проекта.


Вложения:
Комментарий к файлу: Архив
Eval8_VE2.zip [859.99 КБ]
Скачиваний: 93
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ2У для начинающих
СообщениеДобавлено: 2015-апр-24 17:29 
Не в сети

Зарегистрирован: 2015-апр-24 14:25
Сообщения: 9
Вопрос по микроконтроллеру 1886ВЕ2 Понадобилось сделать в демо-программе преобразование в двоично-десятичный вид. Файлы программы выложены выше. Вот кусок из программы предварительной коррекции, проверяет тетрады, если тетрада больше 4, то к ней прибавляется тройка.
Дабы не заморачиваться со старшей цифрой я решил проверять байт на превышение 4Fh, дабы исключить влияние младшей тетрады. Однако этот вариант не работает! При увеличении входного числа выше 99, т. е. когда как раз требуется коррекция и должна получиться сотка, то получается цифра 160. Вот этот неработающий пример:
Код:
        MOVFP   DL_DEC,WREG ; достаём младший байт результата
        ANDLW   0FH      ; избавляемся от старшей цифры
        MOVPF   WREG,DEC ; сохраняем младшую цифру
        MOVLW   04H      ; проверяем необходимость коррекции младшей цифры младшего байта
        CPFSGT  DEC
        GOTO    A11      ; если коррекция не требуется, обходим коррекцию
        MOVLW   03H
        ADDWF   DL_DEC,F ; иначе корректируем младшую цифру младшего байта
A11:
        MOVLW   4FH      ; проверяем необходимость коррекции старшей цифры младшего байта
        CPFSGT  DL_DEC
        GOTO    A12      ; если коррекция не требуется, обходим коррекцию
        MOVLW   30H
        ADDWF   DL_DEC,F ; иначе корректируем старшую цифру младшего байта
A12:

Однако, если сделать коррекцию старшей тетрады, аналогичной коррекции младшей тетрады то всё работает по-человечески и после 99 идёт 100:
Код:
        MOVFP   DL_DEC,WREG ; достаём младший байт результата
        ANDLW   0FH      ; избавляемся от старшей цифры
        MOVPF   WREG,DEC ; сохраняем младшую цифру
        MOVLW   04H      ; проверяем необходимость коррекции младшей цифры младшего байта
        CPFSGT  DEC
        GOTO    A11      ; если коррекция не требуется, обходим коррекцию
        MOVLW   03H
        ADDWF   DL_DEC,F ; иначе корректируем младшую цифру младшего байта
A11:
        MOVFP   DL_DEC,WREG ; достаём младший байт результата
        ANDLW   0F0H     ; избавляемся от младшей цифры
        MOVPF   WREG,DEC ; сохраняем старшую цифру
        MOVLW   40H      ; проверяем необходимость коррекции старшей цифры младшего байта
        CPFSGT  DEC
        GOTO    A12      ; если коррекция не требуется, обходим коррекцию
        MOVLW   30H
        ADDWF   DL_DEC,F ; иначе корректируем старшую цифру младшего байта
A12:

Почему не работает первый вариант?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB