Не работают мигалки ком

Не работают мигалки ком

Добрый день!
Подобную прогу сперва написал для ПИКа18Ф4550 — там всё работает. Мне скинули проверенный конфиг. Потом решил выродить такое же для ПИКа 12Ф683. И ничего. Прога горящеко светика работает без проблем. Даже без конфига. А мигалка чего-то отказывается(я думаю дело в конфиге). В дебаггере всё проходит нормально, задержки работают.
Вот выкладываю текст своего творчества(текстом и ассемблером для удобства).
Надеюсь, кто-то поможет с рабочим конфигом. Пытался сам написать — но там пару сотен директив и я просто не знаю что от туда брать. Да и желания особого нет разбираться. Нужен просто рабочий конфиг и всё.

list p=12f683
#include «p12f683.inc»
__CONFIG _FCMEN_OFF & _IESO_OFF & _BOD_ON & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_ON & _INTOSCIO
;конфиг скопировал из папки МПлаб. что он значит без понятия.
delcntrl equ 20; присвоить ячейке 20(банк №0)
zhopa equ 21; присвоить ячейке 21
gokovo equ 22; присвоить ячейке 22
;.
org 0x00; начать с 0

movlw b’11111011′;запись в аккумулятор
bsf STATUS,RP0; выбор банка №1 для работы с ТРИСИО
movwf TRISIO; установить разряд 2 порта на выход
movlw 0x00; очистить аккумулятор
bcf STATUS,RP0; выбрать банк №0 для работы с портами(см ниже)

Kavoga
bsf GPIO,GP2; включить GP2
a ;метка
call delay; вызов подпрограммы задержки
movlw D’200′; записать десятичное 200
movwf zhopa; записать 200 в ячейку zhopa
decfsz zhopa,1; вычесть из ячейки zhopa единицу 199 раз.
;потом перепрыгнуть 1 команду
goto a ; переход на метку а(вызов подпрограммы задержки 199 раз)
bcf GPIO,GP2; выключить GP2
boo ;метка
call delay; вызов подпрограммы задержки
movlw 0x00; очистить аккумулятор
movlw D’200′; записать дес. 200
movwf gokovo; записать дес. 200 в ячейку gokovo
nop; пропуск команды
nop
nop
nop
nop
decfsz gokovo,1; ычесть из ячейки gokovo единицу 199 раз.
;потом перепрыгнуть 1 команду
goto boo; переход на меткку boo
goto Kavoga; переход на начало цикла.
;//////////

Читайте также:  Honda dio не работают поворотники

delay; подпрограмма задержки
movlw 0x00; очистить аккумулятор
movlw D’250′ ;записать в аккумулятор дестичное 250
movwf delcntrl ; записать 250 в ячейку delcntrl
del ;цикл задержики
NOP; пропуск команды
NOP
nop
nop
decfsz delcntrl,1 ; счётчик. отнимать 1 от 250. когда результат=0 — перепрыгнуть 1
goto del; переход на метку del(249 раз)
return; возврат из подпрограммы
end; зе енд.

Вложения:
Комментарий к файлу: БЛОКНОТИК
avoga.asm [1.79 KiB]
Скачиваний: 288

_________________
Успех — императив! Вернуться наверх

Реклама
urry
Сверлит текстолит когтями

Карма: 22
Рейтинг сообщений: 78
Зарегистрирован: Пн дек 08, 2008 10:58:48
Сообщений: 1257
Откуда: Винница
Рейтинг сообщения: 0

Реклама

JLCPCB, всего $2 за прототип печатной платы! Цвет — любой!

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/cwc

Roman Venom
Сверлит текстолит когтями

Зарегистрирован: Сб июл 11, 2009 18:42:21
Сообщений: 1116
Откуда: Украина, г.Николаев
Рейтинг сообщения: 0

list p=12f683
#include «p12f683.inc»
__CONFIG _FCMEN_OFF & _IESO_OFF & _BOD_ON & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_ON & _INTOSCIO
;конфиг скопировал из папки МПлаб. что он значит без понятия.
delcntrl equ 20; присвоить ячейке 20(банк №0)
zhopa equ 21; присвоить ячейке 21
gokovo equ 22; присвоить ячейке 22
;.
org 0x00; начать с 0
goto main

delay; подпрограмма задержки
movlw D’250′ ;записать в аккумулятор дестичное 250
movwf delcntrl ; записать 250 в ячейку delcntrl
del ;цикл задержики
NOP; пропуск команды
NOP
nop
nop
decfsz delcntrl,1 ; счётчик. отнимать 1 от 250. когда результат=0 — перепрыгнуть 1
goto del; переход на метку del(249 раз)
return; возврат из подпрограммы

;***********MAIN*************
main
movlw b’11111011′;записть в аккумулятор
bsf STATUS,RP0; выбор банка №1 для работы с ТРИСИО
movwf TRISIO; установить разряд 2 порта на выход
movlw 0x00; очистить аккумулятор
bcf STATUS,RP0; выбрать банк №0 для работы с портами(см ниже)

Kavoga
bsf GPIO,GP2; включить GP2
movlw D’200′; записать десятичное 200
movwf zhopa; записать 200 в ячейку zhopa
a ;метка
call delay; вызов подпрограммы задержки
decfsz zhopa,1; вычесть из ячейки zhopa единицу 199 раз.
;потом перепрыгнуть 1 команду
goto a ; переход на метку а(вызов подпрограммы задержки 199 раз)

bcf GPIO,GP2; включить GP2
movlw D’200′; записать дес. 200
movwf gokovo; записать дес. 200 в ячейку gokovo
boo ;метка
call delay; вызов подпрограммы задержки
nop; пропуск команды
nop
nop
nop
nop
decfsz gokovo,1; ычесть из ячейки gokovo единицу 199 раз.
;потом перепрыгнуть 1 команду
goto boo; переход на меткку boo
goto Kavoga; переход на начало цикла.
;//////////

Теперь другой прикол. Светик мигает ровно пару секунд, пото оч. быстро несколько раз. потом опять. Да, прога работает, но как-то странно.
При отладки с пом. программатора ПИКИТ2 выдаёт вот такое:

Источник

Не работают мигалки ком

Доброго всем времени суток!

В общем в программировании микроконтроллеров я ноль. нет конечно почитал кучу «литературы», даташит и прочее, написал самую простейщую программу. Вроде бы даже прошил мк с помощью пик кит 2.

И так по порядку:

Написал в mplabX (компилятор xc8) вот такую простую программу:

// PIC16F628A Configuration Bit Settings

// ‘C’ source line config statements

#pragma config FOSC = INTOSCCLK // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

void podgot (void);
void main (void)
<
podgot();
while (1)
if (RA1 = 1)
RB1 = 1;
else
RB1 = 0;

>
void podgot (void)//podgotovka MK
< TRISA = 0b11111111;
PORTA = 0;
TRISB = 0b00000000;
PORTB = 0;
>

Всё просто смотрим что в порте RA1 если ноль то на RB1 ноль если на RA1 единица то и на RB1 единица и всё это крутится в бесконечном цикле.
То есть простая мигалка светодиодом. Кнопку нажал диод загорелся.

2. Нарисовал схемку в протеусе и запустил симуляцию. В протеусе всё работает!

3. Подключил контроллер к програматору пиккит 2 прошил мк

На сколько я могу судить прошивка прошла успешно.

4. Подключил всё согласно схеме.
Проверил питание — везде всё есть.

НЕ РАБОТАЕТ! (((((
Пожалуйста ткните носом что и где я не правильно делаю. Я уже и с битом конфигурации поигрался а толку ноль.
Буду благодарен за любую помощь задолбался уже ((
Заранее спасибо всем откликнувшимся!

Реклама
Albert_V
Друг Кота

Карма: 90
Рейтинг сообщений: 1856
Зарегистрирован: Чт сен 12, 2013 00:54:12
Сообщений: 4120
Откуда: ЗаМКАДье. Там, где ЦУП
Рейтинг сообщения: 0
Медали: 5

Реклама

JLCPCB, всего $2 за прототип печатной платы! Цвет — любой!

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/cwc

Oleg99
Первый раз сказал Мяу!

Зарегистрирован: Пт июн 10, 2016 21:45:31
Сообщений: 20
Рейтинг сообщения: 0

Курил вот тут http://www.microchip.ru/lit/?mid=1×0
Видимо не той стороной )
Пожалуйста ткните пальцем какой раздел покурить ещё раз.
И что подразумеваться под периферией ? Для меня это всё что прицеплено к МК но судя по всему я не прав. Поправьте меня пожалуйста.

Реклама

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Albert_V
Друг Кота

Карма: 90
Рейтинг сообщений: 1856
Зарегистрирован: Чт сен 12, 2013 00:54:12
Сообщений: 4120
Откуда: ЗаМКАДье. Там, где ЦУП
Рейтинг сообщения: 0
Медали: 5

Реклама

Компэл 28 октября приглашает всех желающих принять участие в вебинаре, где будет рассмотрена новая и перспективная продукция компании Traco. Мы подробно рассмотрим сильные стороны и преимущества продукции Traco, а также коснемся практических вопросов, связанных с измерением уровня шумов, промывкой изделий после пайки и отдельно разберем, как отличить поддельный ИП Traco от оригинала.

Stewart
Открыл глаза

Карма: 7
Рейтинг сообщений: 40
Зарегистрирован: Вт апр 05, 2016 19:00:29
Сообщений: 76
Откуда: Ростовская обл. Новочеркасск
Рейтинг сообщения: 1

_________________
Ох уж эти сказки.
Ох уж эти сказочники.

Реклама
Реклама

Замена традиционных реле и предохранителей в автомобильных системах распределения питания и управления нагрузками, а также в промышленных системах электропитания постоянного тока на интеллектуальные силовые ключи – массово идущий процесс. Ведущую роль в нем играют силовые ключи PROFET производства Infineon. Специалисты компании отвечают на основные вопросы, возникающие при этом у разработчиков.

Oleg99
Первый раз сказал Мяу!

Зарегистрирован: Пт июн 10, 2016 21:45:31
Сообщений: 20
Рейтинг сообщения: 0

Прежде спасибо за то что вы мне помогаете!
Так. Попробую разобраться!
Исходя из таблицы на которую вы ссылаете вывод RA1 может работать как на вход так и на выход. Так же к нему подключен компаратор.
В моём случае я его использую как вход. (ST) Тогда нужно как-то сказать мк что именно как вход и отключит компаратор.
Для этого я использовал сроку TRISA = 0b11111111; то есть весь порт А как вход. Но не сказал что компаратор выключить. Не знаю как это сделать.

RB1 имеет возможность работать как двунаправленый порт ввода-вывода. В режиме вывода он может быть только CMOS (в таблице)
Строчкой TRISB = 0b00000000 я ему сказал что весь порт В это выходы. Но не сказал какую функцию исполнять RA1 или \ INT Не знаю как это сделать.

Ползу дальше. «. до старта основной программы. » до метки main? И тогда получается что я не правильно написал сначала main потом podgot и т.д. ? Должно быть как-то так?

TRISA = 0b11111111;
PORTA = 0;
TRISB = 0b00000000;
PORTB = 0;
void main (void)
<
podgot();
while (1)
if (RA1 = 1)
RB1 = 1;
else
RB1 = 0;

Теперь о INIT. к сожалению вте самоучителе что я читал об этом не как не упоминали. Куда, как, и где он должен быть?

Реклама

Oleg99
Первый раз сказал Мяу!

Зарегистрирован: Пт июн 10, 2016 21:45:31
Сообщений: 20
Рейтинг сообщения: 0

То есть должно быть так?

Реклама

net82
Родился

Зарегистрирован: Ср фев 11, 2015 14:11:43
Сообщений: 14
Рейтинг сообщения: 0

Реклама

Oleg99
Первый раз сказал Мяу!

Зарегистрирован: Пт июн 10, 2016 21:45:31
Сообщений: 20
Рейтинг сообщения: 0

Спасибо )
Я конечно понимаю что краткость сестра таланта и всё таки откуда это выросло и в какое место кода это вставить?

Если я не ошибаюсь это ассемблер.

mov копировать/записать значение в регистр «lw» какое-то значение «b’00000111»

mov копировать/записать значение в регистр «wf» тут тёмный лес. если в предыдущем всё относительно понятно (есть регистр настройки чего-то и в него нужно поместить какое-то значение. Где это в даташите написано? Что это за регистр и как вы подобрали значение?) то как поместить в регистр «wf» значение «CMCON» я не понимаю. Разжуйте этот момент пожалуйста!

Ну и третья строка «Comporators is OFF» как бы понятно что выключает компараторы но откуда взята эта команда? Даташит? Если да то в каком месте написано что вот так выключаются компараторы?

Enman
Друг Кота

Карма: 73
Рейтинг сообщений: 1401
Зарегистрирован: Сб янв 29, 2011 00:28:48
Сообщений: 7733
Рейтинг сообщения: 0

Stewart
Открыл глаза

Карма: 7
Рейтинг сообщений: 40
Зарегистрирован: Вт апр 05, 2016 19:00:29
Сообщений: 76
Откуда: Ростовская обл. Новочеркасск
Рейтинг сообщения: 0

Спасибо )
Я конечно понимаю что краткость сестра таланта и всё таки откуда это выросло и в какое место кода это вставить?

Если я не ошибаюсь это ассемблер.

Ну и третья строка «Comporators is OFF» как бы понятно что выключает компараторы но откуда взята эта команда? Даташит? Если да то в каком месте написано что вот так выключаются компараторы?

CMCON = 0b00000111; аналог двух ассемблерных строк на Си.

В даташите, раздел «Регистр CMCON».
По умолчанию компаратор включен (ф628, 629 и ещё у кучки) и его надо отключить, что-бы не мешел работе пина на вход-выход.

_________________
Ох уж эти сказки.
Ох уж эти сказочники.

Oleg99
Первый раз сказал Мяу!

Зарегистрирован: Пт июн 10, 2016 21:45:31
Сообщений: 20
Рейтинг сообщения: 0

#pragma config FOSC = INTOSCCLK // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

void main (void)
<
TRISA = 0b11111111;
PORTA = 0;
TRISB = 0b00000000;
PORTB = 0;
CMCON = 0b00000111;
while (1)
if (RA1 = 1)
RB1 = 1;
else
RB1 = 0;
>

Вот в таком варианте мигалка заработала. Пожалуйста проверьте на возможные ошибки и ткните носом в них! Может с точки зрения «мк этики» я что-то ну совсем не верно написал

uldemir
Друг Кота

Карма: 47
Рейтинг сообщений: 1246
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 6903
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1

странно, что работает.
оператор сравнения. .
скобки для тела цикла while. Хотя, пока у вас там один оператор — будет работать.

а по поводу CMCON — Albert_V уже с самого начала пытался вас побудить это найти в даташите.

_________________
А люди посмотрят и скажут: «Собаки летят. Вот и осень.»

Oleg99
Первый раз сказал Мяу!

Зарегистрирован: Пт июн 10, 2016 21:45:31
Сообщений: 20
Рейтинг сообщения: 0

Да я нашёл откуда CMCON взялся

Дабы не плодить темы. Пожалуйста посмотрите ещё такую мигалку. Ситуация та же. В протеусе работает. В железе нет.

#include
#include
#include

#pragma config FOSC = INTOSCCLK // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disable)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF
#define _XTAL_FREQ 4000000

void podgot (void);
void cikl (void);
void main (void)
<
podgot();
while(1)
<
if (RA0 == 1)
<

void podgot (void)//podgotovka MK
< TRISA = 0b11111111;
PORTA = 0;
TRISB = 0b00000000;
PORTB = 0;
CMCON = 0b00000111;
>

void cikl (void) // cikl otkr-zakr
<
__delay_ms(250); //zader proverka sostoynii
if (RA0 == 1)
<
while (RA1 == 0)
<
RB0 = 1;
>
RB0 = 0;
__delay_ms(50); //zader ot skvoznih tokov
while (RA2 == 0)
<
RB1 = 1;
>
RB1 = 0;
>
>

Тут я даже не знаю куда копать (

Stewart
Открыл глаза

Карма: 7
Рейтинг сообщений: 40
Зарегистрирован: Вт апр 05, 2016 19:00:29
Сообщений: 76
Откуда: Ростовская обл. Новочеркасск
Рейтинг сообщения: 0

_________________
Ох уж эти сказки.
Ох уж эти сказочники.

uldemir
Друг Кота

Карма: 47
Рейтинг сообщений: 1246
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 6903
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1

_________________
А люди посмотрят и скажут: «Собаки летят. Вот и осень.»

Oleg99
Первый раз сказал Мяу!

Зарегистрирован: Пт июн 10, 2016 21:45:31
Сообщений: 20
Рейтинг сообщения: 0

Само устройство. И для чего это нужно.
Это своеобразный доводчик двери. То есть электро двигатель установлен на двери и он должен её дотягивать до щелчка когда это по каким либо причинам не произошло при закрытии. Например хлопнули слабо и дверь прикрыта но замок не закрыт. В атомобилях такое часто бывает. Дверь закрыта только на половину и чтобы её дозакрыть нужно снова открыть дверь и хлопнуть по сильнее чтобы двери закрылись доконца.
Сам исполнительный механиз я слизал с одного готового устройства. Если очень грубо то когда дверь не закрылась датчик это видит, включает двигатель тот в свою очередь «крючком» подцепляет дверь и тянет её до полного закрытия. Когда происходит полное закрытие нужно убрать «крючок» для этого дигатель вращается в обратную сторону.

Теперь как связана моя схема и то что я описал.
К выводу RA0 ( настроен на вход) подключен тот самый датчик который фиксирует неполное закрытие двери (геркон) Он фиксирует именно положение двери когда она закрыта не до конца. Когда дверь полностью открыта или закрыта до конца он разомкнут . Когда на нём появляется + (единица) МК должен перейти в цикл закрывания двери.
Сам цикл закрывания двери в моём представлении выглядит следующим образом:
-Повторно проверить состояние датчика положения двери если единица от начать закрывать дверь, если ноль то ничего не делать и вернутся в основную программу ожидания срабатывания датчика.
Перед повторной проверкой состояния датчика должна идти пауза. Это нужно чтобы когда дверь просто открывают из закрытого положения она неизбежно будет проходить через датчик положения двери и будет вызывать его срабатывание. То есть если без паузы будет происходит следующее: дверь начинают открывать, срабатывает датчик неплотно закрытой двери и МК даёт команду двигателю закрыть её. И вот я начинаю бороться собственным устройством что-бы открыть дверь )
Что-бы этого не было перед повторной проверкой состояния датчика положения двери должна быть пауза. То есть в моём понимании это должно работать так: начинаешь открывать дверь срабатывает датчик не плотно закрытой двери, МК ждёт секунду и повторно спрашивает датчик. Если он говорит что дверь неплотно закрыта то закрыть её. Если датчик не сработал (это случается в двух случаях -дверь открыта совсем и дверь закрыта полностью) то ни чего не делать. Если датчик сработал — дверь закрыта не полностью — закрыть её.

Немного о механизме и двигателе:
Пусть двигатель это обычный соленоид который стоит в автомобильной двери и закрывает её когда вы ставите свой автомобиль на сигнализацию.
Добавим на него крючок который зацепляет дверь для того чтобы её закрыть полностью. И ещё добавим на него два концевых выключателя. С помощью этих выключателей мы будем контролировать положение крючка. Это нужно для того чтобы он гарантированно доходил до нужных положений. И совершенно случайно не завис где нибудь по середине. Если это случится то дверь попросту будет невозможно открыть.

Теперь по схеме:
К выводу RA0 подключен датчик положения двери (геркон).
К выводам RA1 и RA2 подключены концевые выключатель двигателя
К выводам RB0 и RB1 подключены реле. Сейчас на схем их место занимают два светодиода. Так проще контролировать в каком состоянии находится программа МК.

Программа МК с комментариями

#include
#include
#include

#pragma config FOSC = INTOSCCLK // включаем внутренний генеротар
#pragma config WDTE = OFF // выключаем собачий (сторожевой) таймер, пока что он не нужен
#pragma config PWRTE = ON // включаем задержку при включении мк, нужна для его стабилизации
#pragma config MCLRE = OFF // выключаем сигнал сброса МК
#pragma config BOREN = OFF // выключаем функцию сброса при пониженном напряжении
#pragma config LVP = OFF // запрещаем низковольтное программирование
#pragma config CPD = OFF // выключаем защиту программы
#pragma config CP = OFF // выключаем защиту EEPROM тут могу напутать.
#define _XTAL_FREQ 4000000 // говорим кварцевому генератору на какой частоте работать — эту строчку я просто скопировал из примера где-то и предполагаю что она работает так как я её описал

void podgot (void);// объявляем функции
void cikl (void); // объявляем функции
void main (void) // старт основной программы
<
podgot(); // переход к настройке МК — в какомто примере это сделано отдельном блоке и я по аналогии сделал также
while(1) // организация бесконечного цикла так как условие в скобочках рядом с while ни когда не выполнится
<
if (RA0 == 1) // проверка датчика положения двери: -замкнут (единица на вводе RA) отработать блок под название «cikl» -разомкнут ни чего не делать дальше крутится в цикле и ожидать срабатывания датчика
<
cikl(); // переход в блок под название «cikl»
>
>
>

void podgot (void)//podgotovka MK // блок подготовки МК
< TRISA = 0b11111111; // весь порт RA на вход
PORTA = 0; // очистка порта RA
TRISB = 0b00000000; // весь порт RB на выход
PORTB = 0; // очистка порта RB
CMCON = 0b00000111; // отключение компараторов
>

void cikl (void) // цикл отработки сигнала от датчика положения двери
<
__delay_ms(250); // пауза перед повторным опросом датчика положения двери
if (RA0 == 1) // если на вводе RA0 единица (датчик сработал) начать закрывать дверь, если ноль ничего не делать вернутся в основную программу
<
while (RA1 == 0) // пока на вводе RA1 ноль (концевой датчик не сработал) тянуть дверь на себя
<
RB0 = 1; // первое реле. Тянуть на себя, включит двигатель
>
RB0 = 0; // выключить двигатель
__delay_ms(50); //так как двигатель подключен через реле на всякий случай дать реле время для отключения чтобы небыло сквозных токов и замыкания
while (RA2 == 0) // пока на вводе RA2 ноль (концевой датчик не сработал) отпускать дверь
<
RB1 = 1; // реверс, двигатель через второе реле — отпуска
>
RB1 = 0; // выключит двигатель
> // конец цикла отрывания/закрывания возврат в основную программу и ожидание срабатывания датчика положения двери
>

Уф. вроде всё подробно описал.

uldemir
Друг Кота

Карма: 47
Рейтинг сообщений: 1246
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 6903
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1

А что именно в железе не работает? Концевики подключены правильно? А то геркон замыкает на «+», а концевики на «-«. А сравниваете с «0». И потом. Логичнее было бы писать

_________________
А люди посмотрят и скажут: «Собаки летят. Вот и осень.»

Oleg99
Первый раз сказал Мяу!

Зарегистрирован: Пт июн 10, 2016 21:45:31
Сообщений: 20
Рейтинг сообщения: 0

Да Вы верно заметили на RA1 и RA2 должно быть пока единица то есть «+» ведь он подтянут резистором к «+» .
Изменил код.
Проверил подключение всего.
Всё равно не работает.
А в протеусе работает. а в железе нет.

А почему стало;
.
RB1=0;
__delay_ms(50);
while (RA2 ==1)
<
RB1=0;
>
.
Почему строка RB1=0; подпрыгнула над while.

Я правильно понимаю что while работает следующим образом:
while (условие, у нас это RA2==1) <тело цикла, у нас это включит двигатель то есть RB1=1>когда условие становиться истиной выполнение программы выходит из тела цикла заключённое в квадратные скобки и переходит к следующему оператору. У нас это выключить двигатель RB1 = 0?

И да Вы совершенно правы нужно добавить «таймер» причём несколько:
1. Это на закрытие
2. Это на открытие
3. Это сторожевой таймер.
Действительно вдруг двигатель заклинил и мы всё это дело сожжём.
И пришла мысль что по мимо таймеров нужно ещё сделать «инициальзацию» при включении. т.к. когда он первый раз включается (не важно после какого события, сброс от сторожевого, пропало питание во время выполнения цикла или ещё какая беда) он не знает в каком положении находится «крючок»
Но это всё потом. Сейчас в простом варианте (без защит) запустить бы.

Oleg99
Первый раз сказал Мяу!

Зарегистрирован: Пт июн 10, 2016 21:45:31
Сообщений: 20
Рейтинг сообщения: 0

В общем заработало. Удалил из MPlab лишние проекты и заработало!
Всем огромное спасибо за помощь!

Сейчас буду колдовать с защитами

Добавил инициализацию первого включения.
А вот с таймерами пока что не понимаю как луче сделать. С одной стороны есть встроенные три таймера с другой стороны можно программный написать.
Программный будет занимать процессор мк и тот в свою очередь не сможет заниматься другими «делами». с другой стороны его проще встроить в цикл открывания закрывания.

Таймер нам нужен для отслеживания аварийной ситуации. Например двигатель заклинил и конечник не сработал.

Что-то я пока что не представляю как это реализовать .

Страница 1 из 2 [ Сообщений: 24 ] На страницу 1 , 2 След.

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

Кто сейчас на форуме

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

Источник

Оцените статью