Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> микроконтроллер pic12f629, переписать код ассемблера на си 
:(
    Опции темы
БОЕК1
  Дата 29.6.2019, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 29.6.2019

Репутация: нет
Всего: нет



помогите кто-нибудь переписать код ассемблера на си, микроконтроллер 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 
;---------------------------------------------------------
Цитата




Это сообщение отредактировал(а) БОЕК1 - 29.6.2019, 22:41
PM MAIL   Вверх
vol4ek
Дата 3.7.2019, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



Код

#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, 20:34
PM MAIL ICQ   Вверх
vol4ek
Дата 3.7.2019, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



было поздно я забыл одну проверку. функция прерываний должна быть такая
Код

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;
}





Это сообщение отредактировал(а) vol4ek - 3.7.2019, 20:35

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  12F629.rar 43,47 Kb
PM MAIL ICQ   Вверх
Google
  Дата 7.12.2019, 22:14 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0833 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.