Чип PIC16f626 запрограммировали для аппарата точечной сварки, но при нажатии кнопки вкл. происходит скачок, в общем не буду углубляться, суть вопроса в том как сделать так чтобы те полупериоды 50герц из розетки воспринимались чипом, то есть верх синусоиды это 1 а низ это 0, и выводились на другую ногу так же как булево значение то есть либо 1 либо 0 ?
Нужна схема вашего устройства.
Без понимания как реализован контур обратной связи посоветовать что-то сложно, да и нужно ли брать 50 Гц, когда с помощью контроллера можно смодулировать любой сигнал.
alexalexes, Есть исходный код, скину позже , 50Гц попросили добавить , т.к. кто программировал чип сделал без этого, и теперь сварка работает очень топорно, как будто просто втыкают в розетку и вытыкают, а надо чтобы было правильно, но если есть другой вариант про тот который говорите вы можно и его рассмотреть
Чип PIC16f626 запрограммировали для аппарата точечной сварки
Если исходного кода нет то для любых изменений в алгоритме работы потребуется полное перпрограммирование контроллера.
Прошивка так же не подхолдит, нужен именно текст программы в читабельном виде в него и вносим любые изменения.
Borys Latysh, на вход откуда взять синус, что его модулирует ?
Ещё у меня есть код примерный для этого на ассембле
#include p16f626.inc
; Определение констант
#define INPUT_PIN RB0
#define OUTPUT_PIN RA0
; Определение прерывания
#define EXT_INT INTCON, INTF
; Обработчик прерывания
org 0x0004
movf PORTB, W ; Загрузка состояния входного пина в W
xorwf prev_state, W ; Сравнение с предыдущим состоянием
btfss STATUS, Z ; Проверка на равенство
goto skip_handle ; Если состояние не равно предыдущему, переход к обработке
goto end_isr ; Иначе завершение обработки
skip_handle:
btfsc PORTB, INPUT_PIN ; Проверка состояния входного пина
goto handle_high ; Если пин высокий, переход к обработке высокого уровня
goto handle_low ; Иначе переход к обработке низкого уровня
handle_high:
bcf PORTA, OUTPUT_PIN ; Установка выхода в 0
goto end_isr ; Завершение обработки
handle_low:
bsf PORTA, OUTPUT_PIN ; Установка выхода в 1
end_isr:
bcf EXT_INT ; Сброс флага прерывания
retfie ; Завершение обработки прерывания
; Главная программа
org 0x0000
start:
; Инициализация входного пина
bsf TRISB, INPUT_PIN
; Инициализация выходного пина
bcf TRISA, OUTPUT_PIN
; Настройка внешнего прерывания по фронту сигнала
bsf OPTION_REG, INTEDG ; Фронт сигнала (падающий или нарастающий)
; Разрешение внешнего прерывания
bsf INTCON, INTE
main_loop:
; Здесь может находиться основной код, который будет выполняться в бесконечном цикле
; Пример:
; if condition
; ; Выполнить какие-то действия
goto main_loop
end start
-------------------------------------------------------
ИЛИ ЕСТЬ КОД НА С .
------------------------------------------------------------------
#include <pic16f626.h>
// Определение входного пина
#define INPUT_PIN RB0
// Переменная для хранения предыдущего состояния входного сигнала
unsigned char prev_state = 0;
// Функция инициализации внешнего прерывания
void init_external_interrupt() {
// Настройка пина как входа
TRISB |= (1 << INPUT_PIN);
// Настройка внешнего прерывания по фронту сигнала
INTEDG = 1; // Фронт сигнала (падающий или нарастающий)
// Разрешение внешнего прерывания
INTE = 1;
}
// Функция для установки значения на выходе контроллера
void set_output(unsigned char value) {
// Устанавливаем значение на выходе контроллера (например, на пине RA0)
// Пример для установки значения на пине RA0
if(value == 0) {
RA0 = 0; // Устанавливаем 0 на выходе
} else {
RA0 = 1; // Устанавливаем 1 на выходе
}
}
// Функция для обработки экстремума сигнала
void handle_extremum(unsigned char state) {
if(state == 0) {
// Сигнал находится в экстремуме (минимум)
set_output(1); // Устанавливаем 1 на выходе контроллера
} else {
// Сигнал находится в другом состоянии
set_output(0); // Устанавливаем 0 на выходе контроллера
}
}
// Обработчик внешнего прерывания
void interrupt ISR() {
if(INTF) {
// Считываем текущее состояние входного сигнала
unsigned char current_state = INPUT_PIN;
// Проверяем изменение уровня сигнала
if(current_state != prev_state) {
// Если произошло изменение, вызываем функцию для обработки экстремума
handle_extremum(current_state);
// Обновляем предыдущее состояние
prev_state = current_state;
}
INTF = 0; // Сброс флага прерывания
}
}
// Главная функция
void main() {
// Инициализация внешнего прерывания
init_external_interrupt();
// Включение глобальных прерываний
GIE = 1;
while(1) {
// Здесь может находиться ваш основной код, который будет выполняться в бесконечном цикле
// Например, вы можете добавить дополнительные действия или проверки здесь
// для управления другими аспектами вашей системы в зависимости от обработанных данных
// Пример:
// if (condition) {
// // Выполнить какие-то действия
// }
}
}