Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > микроконтроллер pic12f629


Автор: БОЕК1 29.6.2019, 22:40
помогите кто-нибудь переписать код ассемблера на си, микроконтроллер pic12f629

user posted image 
user posted image

list p = 12f629 
__config 01FC4h 
;*** Переменные ****************************************** 
CBLOCK 0x20 ; Начальный адрес блока пользовательской памяти 
T1 
T2 
ENDC 
;**** Константы / Адреса регистров ************************ 
Status equ 03h ; выбор банка 
Cmcon equ 19h ; компаратор (банк 0) 
OSCCAL equ 10h ; хранение калибровочной константы (банк 1) 
INTCON equ 0Bh ; разрешение(1)/запрет(0) прерываний (любой банк) 
IOCB equ 16h ; регистр разрешения прерываний по GP0...GP5 
INDF equ 0h ; регистр косвенной адресации 
FSR equ 04h ; регистр адреса при косвенной адресации 
GPIO equ 05h ; управление защелками порта (банк 0) 
TrisIO equ 05h ; выбор направления работы выводов порта (банк 1) 
;********************************************************* 

org 0 
goto start 
org 4 
;********************************************************* 
;-— Смотрим, откуда прерывание —- 
btfss GPIO,3 ; если кнопка нажата - проп.следующ.команду 
goto priem 
;-— Инвертировать светодиод —- 
knopka movlw .16 ; 00010000 - маска для инверсии сост-я светодиода 
xorwf GPIO,1 ; инвертируем состояние светодиода 
goto exit 
;-— Если сигнал с приёмника —- 
priem btfsc GPIO,2 ; если на входе ILMS ноль - пришёл сигнал 
goto exit 
;-— Проверяем, не помеха ли это —- 
movlw .4 
movwf T1 ; кол-во циклов проверки 
timer movlw .25 
movwf T2 ; таймер на каждую проверку 
time_cikl 
nop 
decfsz T2,1 
goto time_cikl 
btfsc GPIO,2 ; если на входе 0 - подтвержд-ся сигнал и проп.выход 
goto exit 
decfsz T1,1 
goto timer 
;-— Если разрешено, то инвертировать состояние оптрона —- 
btfsc GPIO,4 ; если светодиод вкл. - пропустить следующ.команду 
goto exit 
movlw .1 ; 00000001 
xorwf GPIO,1 ; после этого выход оптрона инвертируется 
exit call pause ; пауза 
bcf INTCON,0 ; сбросить флаг прерываний 
retfie 
;********************************************************* 
;*** КОНФИГУРИРОВАНИЕ КОНТРОЛЛЕРА ************************ 
;****** Калибровка Генератора **************************** 
start bsf Status,5 
Call 3FFh ; Загрузить калибровочную константу в w 
movwf OSCCAL 
;*** Установка направления работы ног ******************** 
bcf Status,5 ; перейти в банк 0 
clrf GPIO ; инициализация защелок (все выходы равны нулю) 
movlw .7 ; биты 0..2 поднять 
movwf Cmcon ; компарат.выключен, GP0,GP1,GP2 - цифров.вх/вых 
bsf Status,5 ; Перейти в 1-й банк 
movlw b'00101100' ; настройка входов/выходов 
movwf TrisIO 
bcf Status,5 ; перейти в нулевой банк 
;*** Включить оптрон и погасить светодиод **************** 
bsf GPIO,0 ; поднять нулевой бит (включить свет) 
nop 
bsf GPIO,4 ; поднять 4-й бит (выключить светодиод) 
;*** Разрешить прерывания на входах GP2, GP3 ************* 
bsf Status,5 ; перейти в первый банк 
movlw .12 ; .12 = 00001100 
movwf IOCB ; разрешить прерыв.на GP2, GP3, на остальных - нет 
bcf Status,5 ; Перейти в 0-й банк 
movlw .8 ; .8 = 00001000 
movwf INTCON ; разрешить прерывание от GPIO 
bsf INTCON,7 ; разрешить немаскированные прерывания 
;------------------— 
work nop ; ждём прерывание 
goto work 
;------------------— 
pause movlw .100 
movwf T1 
cikl1 movlw .255 
movwf T2 
cikl2 nop 
nop 
decfsz T2,1 
goto cikl2 
decfsz T1,1 
goto cikl1 
return 
end 
;---------------------------------------------------------
Цитата



Автор: vol4ek 3.7.2019, 00:11
Код

#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

#define _XTAL_FREQ 4000000

void __interrupt (high_priority)isr(void)
{
    if(GPIO)
    {
        if(GPIObits.GPIO0 == 1)
        {
            __delay_ms(50);
            if(GPIObits.GPIO0 == 1)
            {
                if(GPIObits.GPIO2 == 0)
                {
                    GPIObits.GPIO2 = 1;
                }
                else
                {
                    GPIObits.GPIO2 = 0;
                }
            }
        }
        if(GPIObits.GPIO1 == 1)
        {
            __delay_us(400);
            if(GPIObits.GPIO1 == 1)
            {
                if(GPIObits.GPIO4 == 0)
                {
                    GPIObits.GPIO4 = 1;
                }
                else
                {
                    GPIObits.GPIO4 = 0;
                }
            }
            
        }
        GPIF = 0;
    }
    return;
}

void main(void)
{
    OSCCAL = 0xFC;
    OPTION_REG = 0xC0;
    INTCON = 0xD8;
    CMCON = 0x07;
    WPU = 0x0;
    TRISIO = 0x3;
    GPIO = 0x0;
    IOCB = 0xFF;
    
    GPIObits.GPIO4 = 1;
    while(1)
    {
        __delay_us(1);
    }
}

коряво конечно но тебе пойдет.
Код

#pragma config FOSC = INTRCIO // не помню на счет этого значения там 2 внутренних генератора, низкочастотный и тот, что на 4MГц
// чуть что поправь на INTRCCLK

компилятор xc8 v2.05


Автор: vol4ek 3.7.2019, 11:46
было поздно я забыл одну проверку. функция прерываний должна быть такая
Код

void __interrupt (high_priority)isr(void)
{
    if(GPIO)
    {
        if(GPIObits.GPIO0 == 1)
        {
            __delay_ms(50);
            if(GPIObits.GPIO0 == 1)
            {
                if(GPIObits.GPIO2 == 0)
                {
                    GPIObits.GPIO2 = 1;
                }
                else
                {
                    GPIObits.GPIO2 = 0;
                }
            }
        }
        if(GPIObits.GPIO1 == 1)
        {
            __delay_us(400);
            if(GPIObits.GPIO1 == 1)
            {
                if(GPIObits.GPIO2 == 1)
                {
                    if(GPIObits.GPIO4 == 0)
                        {
                            GPIObits.GPIO4 = 1;
                        }
                    else
                        {
                            GPIObits.GPIO4 = 0;
                        }
                }
                
            }
            
        }
        GPIF = 0;
    }
    return;
}




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)