Чтобы не создавать отдельную тему, напишу тут:
МК: pic12f683; Программа: MPLAB X IDE; Компилятор: xc8 v2.10(2.05 тоже пробовал)
Проблема: ножка порта сбрасывается на 0 через пару мкс после установления 1.
Код:
Спойлер
// PIC12F683 Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/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 // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = ON // Code Protection bit (Program memory code protection is enabled)
#pragma config CPD = ON // Data Code Protection bit (Data memory code protection is enabled)
#pragma config BOREN = OFF // Brown Out Detect (BOR disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF
#include <xc.h>
#define TX GP2
#define RX GP0
#define CODE GP1
unsigned char i=0;
unsigned char RXv;
const char data[255] = { массив из 0,1};
void __interrupt() isr(void) {
if(TMR2IE&&TMR2IF) {
if(!RXv) {
CODE=!data[i];
i++;
}
RX=!RXv;
RXv=!RXv;
TMR2IF=0;
return;
}
if(INTE&&INTF) {
TMR2ON=1;
TMR2IF=0;
TMR2IE=1;
RX=1;
RXv=1;
CODE=1;
}
INTF=0;
return;
}
void main(void) {
// MC CONFIG
OSCCON=0b01110100;
OSCTUNE=0b00001111;
GIE=1; // Global INTERRUPT on
PEIE=1;
INTE=1; // internal INTERRUPT on
INTEDG=1; // Interrupt on rising edge
T2CON=0; //Config TIMER2 PreScealer 1:1 PostScealer 1:1
PR2=90; // TMR2 interrupt, RX frequency
TRISIO=0b00111100; // Set GP2 input GP1 GP0 output
ANSEL=0; //Set ports as digital
WPU=0b111000; //Disabble weak pull ups
while(1) {
if(i==255) {
TMR2IE=0;
i=0;
CODE=0;
RX=0;
RXv=0;
}
}
}сбрасывается ножка code (gp1) на ножке RX была подобная проблема когда запись была RX=!RX. с вводом переменной RXv все нормализовалось. я решил, что при чтении значения с порта, чтобы сделать инверсию он сбрасывался. но с ножкой CODE такой проблемы нет... она не читается в программе.
Логика программы: по запросу с ТХ (прямоугольный импульс длиной около 50мс) по завершению идёт генерация импульсов синхронизации на RX а на ножке Code идёт пробитовая посылка на каждом пике RX перед спадом.
Осцилограмма работы

видно что логика работает 255 бит отправляются, но при передаче 0( т.е. 1 потому что через транзистор) на gp1 он появляется кратковременно и не остаётся в нем, а возвращается в 1( т.е в 0). оранжевым дорисовал как должно быть в начале идут 0 т.е. должна быть прямая. осцилограмма снята на выходе, т.е. после транзисторов. на прямую с мк то же самое только наоборот.
Схема устройства:

в чем может быть причина такого поведения? компилятор чудит? осцилятор используется внутренний на 8Mhz, но кроме как что gp4,5 всегда на вход будут ничего не нашёл в этом режиме. или переферия какая сбрасывает на 0??
P.S. пока писал пришла в голову мысль, что может быть это из-за инверсии "!" ?? попробую завтра массив вручную инвертировать, хотя не очень логично т.к. RX=!RXv; проходит нормально...