Вт окт 20, 2020 13:31:58
Вт окт 20, 2020 13:56:01
Вт окт 20, 2020 14:10:12
143: PWM1EN = 0; // выкл ШИМ
01F6 1396 BCF PWM1CON, 0x7
144: LED = 0; // отключаем питание
01F7 1105 BCF PORTA, 0x2
01F8 292B GOTO 0x12B
145: }
146: return;
147:
148: }
Вт окт 20, 2020 14:12:26
Вт окт 20, 2020 14:15:38
47: while (1)
48: {
49: PWM1CON = 0b00000000; // отключаем ШИМ1
012B 0196 CLRF PWM1CON
50: FVRCON = 0b00000000; // отключаем ИОН, отключаем температурный индикатор
012C 019D CLRF FVRCON
Вт окт 20, 2020 14:19:19
Да нет, именно на while(1) прыгает.
Вт окт 20, 2020 14:37:12
Вт окт 20, 2020 15:24:40
Вт окт 20, 2020 16:14:15
Вт окт 20, 2020 18:29:58
Ср окт 21, 2020 15:05:46
Ср окт 21, 2020 15:10:06
while(1) {
// тут содержимое цикла
}
Ср окт 21, 2020 15:20:18
while (1)
{
qwe:
PWM1CON = 0b00000000; // отключаем ШИМ1
FVRCON = 0b00000000; // отключаем ИОН, отключаем температурный индикатор
ADCON = 0b00000000; // отключаем модуль АЦП
PORTA = 0; // все выходы порта переводим в низкое состояние
__delay_ms(500);
IOCIE = 1; // разрешаем прерывание по изменению уровня PORTA
IOCAF = 0; // сбрасываем флаг IOCAF (свидетельствующий о прерывании RA3)
SWDTEN = 0; // отключаем сторожевой таймер на период сна
SLEEP(); // здоровый крепкий сон до пробуждения нажатием кнопки)
IOCIE = 0; // запрет прерывания по изменению уровня PORTA
SWDTEN = 1; // включаем сторожевой таймер
__delay_ms(50);
if (TK) // если кнопка отжата - было ложное страбатывание прерывания (из-за помех по цепям питания), отправляемся повторно спать
{
goto qwe;
}
CLRWDT();
LED = 1; // включаем питание
Ср окт 21, 2020 15:29:12
while(1){
// тут какой то код перед началом ожидания кнопки
while(условие не нажатой кнопки){
// тут код пока кнопка не нажата
}
// тут код после нажатой кнопки
}
Ср окт 21, 2020 16:01:05
IOCIE = 0; // запрет прерывания по изменению уровня PORTA
SWDTEN = 1; // включаем сторожевой таймер
__delay_ms(50);
if (!TK) // если кнопка нажата
{
CLRWDT();
LED = 1; // включаем питание
...
}
// qwe:
...
Чт окт 22, 2020 07:52:20
Вт ноя 10, 2020 16:35:08
Вт ноя 10, 2020 16:43:23
Вт ноя 10, 2020 16:57:06
Вт ноя 10, 2020 17:10:16
/****************************************************************/
/* Множитель/делитель частоты */
/* http://radiokot.ru/forum/viewtopic.php?f=20&t=59172 */
/* */
/* МК: PIC12F675 */
/* */
/* Автор: Alex */
/* al.kl@list.ru */
/* http://ChipMk.ru */
/****************************************************************/
// CONFIG
#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 = ON // GP3/MCLR pin function select (GP3/MCLR pin function is MCLR)
#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)
#include <xc.h>
#include <stdbool.h> /* For true/false definition */
#include <pic12f675.h>
#define _XTAL_FREQ 4000000 // 4 MHz INTOSC
//static volatile near unsigned int TMR1 @ 0x00E;
/****************************************************************/
#define MUL 1.5 // Множитель
#define PIN_OUT GPIO0 // Выходной ПИН
#define TRIS_OUT TRISIO0 //
/****************************************************************/
volatile unsigned long Per_In = 0; // Преобразованный период входного сигнала
static bool In_Fl = 0; // Флаг окончания преобразования периода
volatile unsigned long Per_Out = 0; // Период выходного сигнала
/****************************************************************/
/****************************************************************/
/****************************************************************/
void main() {
CMCON = 7; // Настраиваем порты как цифровые
ANS0 = 0; //
ANS1 = 0; //
ANS2 = 0; //
ANS3 = 0; //
TRIS_OUT = 0;
PIN_OUT = 0;
T0CS = 0;
PSA = 1;
PS2 = 0;
PS1 = 0;
PS0 = 0;
TMR0 = 0;
T0IE = 1;
TMR1ON = 1;
TMR1IE = 0;
INTE = 1;
INTEDG = 0;
PEIE = 1;
GIE = 1;
Per_Out = 0;
while (1) {
unsigned long per_tmp;
if (In_Fl) {
In_Fl = 0;
//----------
GIE = 0;
per_tmp = Per_In;
GIE = 1;
per_tmp /= 2;
//----------
if (per_tmp) {
per_tmp = (unsigned long)(per_tmp / MUL);
GIE = 0;
Per_Out = per_tmp;
GIE = 1;
TMR1IE = 1;
} else {
TMR1IE = 0;
PIN_OUT = 0;
}
}
}
}
/****************************************************************/
void interrupt isr() {
static bool p_fl = 0; // Флаг преобразования входного периода
static unsigned int H_Per_In = 0; // Старшие байты вх. периода
static unsigned char H_Per_Out = 0; // Старший байт вых. периода
//----------//
if (INTF) {
INTF = 0;
if (!p_fl) {
p_fl = 1;
TMR0 = 0;
H_Per_In = 0;
} else {
*((char*) &Per_In) = TMR0 + 5;
TMR0 = 0;
if (T0IF) // Если было переполнение
H_Per_In++; // обрабатываем его
*((int*) ((char*) &Per_In + 1)) = H_Per_In;
H_Per_In = 0;
In_Fl = 1; // Ставим флаг окончания преобразования
}
T0IF = 0;
}
//----------//
if (T0IF && T0IE) {
T0IF = 0;
H_Per_In++; // +256
if (*((char*) &H_Per_In + 1) >= 16) { // >=16*65536 ~1000000 МЦ
H_Per_In = 0;
p_fl = 0; // Сброс флага преобразования
Per_In = 0; // Период = 0
In_Fl = 1; // Ставим флаг окончания преобразования
}
}
//----------//
if (TMR1IF && TMR1IE) {
TMR1IF = 0;
if (!H_Per_Out--) {
TMR1 -= *((int*) ((char*) &Per_Out));
H_Per_Out = *((char*) &Per_Out + 2);
PIN_OUT = !PIN_OUT;
}
}
//----------//
}