Добрый день.
Нужна помощь новичку разобраться с поведением контроллера.
Написал простую программу с 4 режимами мигания светодиодами.
Каждый режим крутится 5 циклов, а потом следующий.
Компиляция в MPLAB + XC8.
В Proteus все работает.
Собрал на макетке и картина следующая:
Сначала все работало нормально.
Потом в какой-то момент после первого цикла программы 2 (prog2) начал возвращается в программу 1.
Позднее снова заработало и через 2 часа экспериментов снова перестало.
Питал макетку от PICkit2. Им же и прошивал.
Менял источник питания, но и это не помогло.
Буду благодарен если подскажете, где искать причины такого поведения.
Код:
|
// PIC16F1823 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable (PWRT enabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = ON // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include ‹xc.h›
#define _XTAL_FREQ 500000
#define ti 100 // Длительность delay
void de(int ms){ // Функция delay
for(;ms;ms--)
__delay_ms(1);
}
void prog1 () {
unsigned char temp;
temp = 0x01;
PORTC = temp;
de(ti);
temp = 0x03;
while (temp != 0) {
PORTC=temp;
temp = temp ‹‹ 1;
de(ti);
}
PORTC =0;
}
void prog2 () {
PORTC = 0;
PORTC = 0x01;
de(ti); de(ti);
PORTC = 0x03;
de(ti); de(ti);
PORTC = 0x07;
de(ti); de(ti);
de(ti); de(ti);
de(ti); de(ti);
de(ti); de(ti);
de(ti); de(ti);
de(ti); de(ti);
de(ti); de(ti);
PORTC = 0x0f;
de(ti); de(ti);
PORTC = 0x1f;
de(ti); de(ti);
PORTC = 0x3f;
de(ti); de(ti);
PORTC =0;
}
void prog3 () {
PORTC = 0x3f;
de(ti); de(ti);
PORTC = 0;
de(ti); de(ti);
PORTC =0;
}
void prog4 () {
PORTC = 0x21;
de(ti); de(ti);
PORTC = 0x33;
de(ti); de(ti);
PORTC = 0x3f;
de(ti); de(ti);
PORTC =0;
}
void main(void) {
TRISC = 0x00;
PORTC = 0x00;
int pr = 1;
int cikl = 1;
while (1) {
switch (pr) {
case 1:
prog1();
cikl=cikl+1;
break;
case 2: // После первого цикла этого кейса
prog2(); // идет сброс и программа переходит
cikl=cikl+1; // снова в case 1.
break;
case 3:
prog3();
cikl=cikl+1;
break;
case 4:
prog4();
cikl=cikl+1;
break;
}
if ( cikl›5 ) {
cikl = 1;
if ( pr == 4 ) { pr = 1; }
else { pr=pr+1; }
}
de(100);
}
return;
} |