#include <xc.h> // Osilatör frekansı tanımı (4 MHz kristal varsayımı) #define _XTAL_FREQ 4000000 // 4 MHz // Konfigürasyon bitleri #pragma config FOSC = HS // Yüksek hızlı osilatör #pragma config WDTE = OFF // Watchdog Timer kapalı #pragma config PWRTE = OFF // Power-up Timer kapalı #pragma config BOREN = ON // Brown-out Reset açık #pragma config LVP = OFF // Düşük voltaj programlama kapalı #pragma config CPD = OFF // Veri belleği kodu koruma kapalı #pragma config CP = OFF // Program belleği kodu koruma kapalı // Giriş/Çıkış Tanımlamaları #define B1 RA0 #define B2 RA1 #define B3 RA2 #define B4 RA3 #define S1 RB0 #define S2 RB1 #define S3 RB2 #define R1 RB3 #define R2 RB4 #define SYSTEM_SWITCH RE0 #define RESET_ERROR RE1 #define M1 RD0 #define M2 RD1 #define M3 RD2 #define M4 RD3 #define Z1 RD4 #define Z2 RD5 #define Z3 RD6 #define S1_ERROR RC0 #define S2_ERROR RC1 #define S3_ERROR RC2 #define R1_ERROR RC3 #define R2_ERROR RC4 #define SYSTEM_ON RC5 #define SYSTEM_OFF RC6 // Gecikme fonksiyonu (XC8 için optimize) void delay_ms(unsigned int ms) { while (ms--) { __delay_ms(1); // XC8 dahili gecikme fonksiyonu } } // Buton sırası için kuyruk unsigned char queue[4] = {0}; unsigned char queue_head = 0; unsigned char queue_tail = 0; unsigned char processing = 0; void enqueue(unsigned char button) { if (queue_tail < 4 && !processing) { queue[queue_tail++] = button; } } unsigned char dequeue() { if (queue_head < queue_tail) { return queue[queue_head++]; } return 0xFF; } void init_system() { M4 = 1; M3 = 0; unsigned int reed_timeout = 0; while (R1 == 0 && reed_timeout < 5) { delay_ms(100); reed_timeout++; } M4 = 0; if (reed_timeout >= 5) R1_ERROR = 1; } void reset_error_leds() { S1_ERROR = 0; S2_ERROR = 0; S3_ERROR = 0; R1_ERROR = 0; R2_ERROR = 0; } void main() { // Port yapılandırması TRISA = 0xFF; // RA giriş TRISB = 0xFF; // RB giriş TRISC = 0x00; // RC çıkış TRISD = 0x00; // RD çıkış TRISE = 0xFF; // RE giriş ADCON1 = 0x06; // Analog girişleri kapat // Başlangıç durumu S1_ERROR = 0; S2_ERROR = 0; S3_ERROR = 0; R1_ERROR = 0; R2_ERROR = 0; SYSTEM_ON = 0; SYSTEM_OFF = 1; while (1) { // Hata LED'lerini sıfırlama if (RESET_ERROR == 1) { reset_error_leds(); delay_ms(50); while (RESET_ERROR == 1); } if (SYSTEM_SWITCH == 1) { SYSTEM_ON = 1; SYSTEM_OFF = 0; if (queue_head == 0 && queue_tail == 0) init_system(); // Buton girişleri if (B1 == 1 && !processing) { enqueue(0); delay_ms(50); while (B1 == 1); } if (B2 == 1 && !processing && queue_tail == 0) { enqueue(1); delay_ms(50); while (B2 == 1); } if (B3 == 1 && !processing && queue_tail < 2) { enqueue(2); delay_ms(50); while (B3 == 1); } if (B4 == 1 && !processing && queue_tail < 3) { enqueue(3); delay_ms(50); while (B4 == 1); } // Kuyruk işleme if (!processing && queue_head < queue_tail) { processing = 1; unsigned char current_button = dequeue(); if (current_button == 0) { // B1 (Kol 2 gönderim) M4 = 1; M3 = 0; unsigned int reed_timeout = 0; while (R1 == 0 && reed_timeout < 5) { delay_ms(100); reed_timeout++; } M4 = 0; if (reed_timeout >= 5) R1_ERROR = 1; M2 = 1; M1 = 0; unsigned int sensor_timeout = 0; while (S3 == 0 && sensor_timeout < 60) { delay_ms(100); sensor_timeout++; } M2 = 0; if (sensor_timeout >= 60) S3_ERROR = 1; Z3 = 1; delay_ms(500); Z3 = 0; } else if (current_button == 1) { // B2 (Kol 3 gönderim) M3 = 1; M4 = 0; unsigned int reed_timeout = 0; while (R2 == 0 && reed_timeout < 5) { delay_ms(100); reed_timeout++; } M3 = 0; if (reed_timeout >= 5) R2_ERROR = 1; M2 = 1; M1 = 0; unsigned int sensor_timeout = 0; while (S2 == 0 && sensor_timeout < 60) { delay_ms(100); sensor_timeout++; } M2 = 0; if (sensor_timeout >= 60) S2_ERROR = 1; Z2 = 1; delay_ms(500); Z2 = 0; } else if (current_button == 2) { // B3 (Kol 2 geri alma) M3 = 1; M4 = 0; unsigned int reed_timeout = 0; while (R2 == 0 && reed_timeout < 5) { delay_ms(100); reed_timeout++; } M3 = 0; if (reed_timeout >= 5) R2_ERROR = 1; M1 = 1; M2 = 0; unsigned int sensor_timeout = 0; while (S1 == 0 && sensor_timeout < 60) { delay_ms(100); sensor_timeout++; } M1 = 0; if (sensor_timeout >= 60) S1_ERROR = 1; Z1 = 1; delay_ms(500); Z1 = 0; } else if (current_button == 3) { // B4 (Kol 3 geri alma) M4 = 1; M3 = 0; unsigned int reed_timeout = 0; while (R1 == 0 && reed_timeout < 5) { delay_ms(100); reed_timeout++; } M4 = 0; if (reed_timeout >= 5) R1_ERROR = 1; M1 = 1; M2 = 0; unsigned int sensor_timeout = 0; while (S1 == 0 && sensor_timeout < 60) { delay_ms(100); sensor_timeout++; } M1 = 0; if (sensor_timeout >= 60) S1_ERROR = 1; Z1 = 1; delay_ms(500); Z1 = 0; } processing = 0; } } else { SYSTEM_ON = 0; SYSTEM_OFF = 1; queue_head = 0; queue_tail = 0; M1 = 0; M2 = 0; M3 = 0; M4 = 0; Z1 = 0; Z2 = 0; Z3 = 0; } } }
Standard input is empty
#include <xc.h>
// Osilatör frekansı tanımı (4 MHz kristal varsayımı)
#define _XTAL_FREQ 4000000 // 4 MHz
// Konfigürasyon bitleri
#pragma config FOSC = HS // Yüksek hızlı osilatör
#pragma config WDTE = OFF // Watchdog Timer kapalı
#pragma config PWRTE = OFF // Power-up Timer kapalı
#pragma config BOREN = ON // Brown-out Reset açık
#pragma config LVP = OFF // Düşük voltaj programlama kapalı
#pragma config CPD = OFF // Veri belleği kodu koruma kapalı
#pragma config CP = OFF // Program belleği kodu koruma kapalı
// Giriş/Çıkış Tanımlamaları
#define B1 RA0
#define B2 RA1
#define B3 RA2
#define B4 RA3
#define S1 RB0
#define S2 RB1
#define S3 RB2
#define R1 RB3
#define R2 RB4
#define SYSTEM_SWITCH RE0
#define RESET_ERROR RE1
#define M1 RD0
#define M2 RD1
#define M3 RD2
#define M4 RD3
#define Z1 RD4
#define Z2 RD5
#define Z3 RD6
#define S1_ERROR RC0
#define S2_ERROR RC1
#define S3_ERROR RC2
#define R1_ERROR RC3
#define R2_ERROR RC4
#define SYSTEM_ON RC5
#define SYSTEM_OFF RC6
// Gecikme fonksiyonu (XC8 için optimize)
void delay_ms(unsigned int ms) {
while (ms--) {
__delay_ms(1); // XC8 dahili gecikme fonksiyonu
}
}
// Buton sırası için kuyruk
unsigned char queue[4] = {0};
unsigned char queue_head = 0;
unsigned char queue_tail = 0;
unsigned char processing = 0;
void enqueue(unsigned char button) {
if (queue_tail < 4 && !processing) {
queue[queue_tail++] = button;
}
}
unsigned char dequeue() {
if (queue_head < queue_tail) {
return queue[queue_head++];
}
return 0xFF;
}
void init_system() {
M4 = 1; M3 = 0;
unsigned int reed_timeout = 0;
while (R1 == 0 && reed_timeout < 5) {
delay_ms(100);
reed_timeout++;
}
M4 = 0;
if (reed_timeout >= 5)
R1_ERROR = 1;
}
void reset_error_leds() {
S1_ERROR = 0; S2_ERROR = 0;
S3_ERROR = 0;
R1_ERROR = 0; R2_ERROR = 0;
}
void main() {
// Port yapılandırması
TRISA = 0xFF; // RA giriş
TRISB = 0xFF; // RB giriş
TRISC = 0x00; // RC çıkış
TRISD = 0x00; // RD çıkış
TRISE = 0xFF; // RE giriş
ADCON1 = 0x06; // Analog girişleri kapat
// Başlangıç durumu
S1_ERROR = 0; S2_ERROR = 0;
S3_ERROR = 0;
R1_ERROR = 0; R2_ERROR = 0;
SYSTEM_ON = 0; SYSTEM_OFF = 1;
while (1) {
// Hata LED'lerini sıfırlama
if (RESET_ERROR == 1) {
reset_error_leds();
delay_ms(50);
while (RESET_ERROR == 1);
}
if (SYSTEM_SWITCH == 1) {
SYSTEM_ON = 1;
SYSTEM_OFF = 0;
if (queue_head == 0 && queue_tail == 0) init_system();
// Buton girişleri
if (B1 == 1 && !processing) {
enqueue(0); delay_ms(50); while (B1 == 1);
}
if (B2 == 1 && !processing && queue_tail == 0) {
enqueue(1); delay_ms(50); while (B2 == 1);
}
if (B3 == 1 && !processing && queue_tail < 2) {
enqueue(2); delay_ms(50); while (B3 == 1);
}
if (B4 == 1 && !processing && queue_tail < 3) {
enqueue(3); delay_ms(50); while (B4 == 1);
}
// Kuyruk işleme
if (!processing && queue_head < queue_tail) {
processing = 1;
unsigned char current_button = dequeue();
if (current_button == 0) {
// B1 (Kol 2 gönderim)
M4 = 1; M3 = 0;
unsigned int reed_timeout = 0;
while (R1 == 0 && reed_timeout < 5) {
delay_ms(100);
reed_timeout++;
}
M4 = 0;
if (reed_timeout >= 5) R1_ERROR = 1;
M2 = 1; M1 = 0;
unsigned int sensor_timeout = 0;
while (S3 == 0 && sensor_timeout < 60) {
delay_ms(100);
sensor_timeout++;
}
M2 = 0;
if (sensor_timeout >= 60) S3_ERROR = 1;
Z3 = 1; delay_ms(500); Z3 = 0;
}
else if (current_button == 1) {
// B2 (Kol 3 gönderim)
M3 = 1; M4 = 0;
unsigned int reed_timeout = 0;
while (R2 == 0 && reed_timeout < 5) {
delay_ms(100);
reed_timeout++;
}
M3 = 0;
if (reed_timeout >= 5) R2_ERROR = 1;
M2 = 1; M1 = 0;
unsigned int sensor_timeout = 0;
while (S2 == 0 && sensor_timeout < 60) {
delay_ms(100);
sensor_timeout++;
}
M2 = 0;
if (sensor_timeout >= 60) S2_ERROR = 1;
Z2 = 1; delay_ms(500); Z2 = 0;
}
else if (current_button == 2) {
// B3 (Kol 2 geri alma)
M3 = 1; M4 = 0;
unsigned int reed_timeout = 0;
while (R2 == 0 && reed_timeout < 5) {
delay_ms(100);
reed_timeout++;
}
M3 = 0;
if (reed_timeout >= 5) R2_ERROR = 1;
M1 = 1; M2 = 0;
unsigned int sensor_timeout = 0;
while (S1 == 0 && sensor_timeout < 60) {
delay_ms(100);
sensor_timeout++;
}
M1 = 0;
if (sensor_timeout >= 60) S1_ERROR = 1;
Z1 = 1; delay_ms(500); Z1 = 0;
}
else if (current_button == 3) {
// B4 (Kol 3 geri alma)
M4 = 1; M3 = 0;
unsigned int reed_timeout = 0;
while (R1 == 0 && reed_timeout < 5) {
delay_ms(100);
reed_timeout++;
}
M4 = 0;
if (reed_timeout >= 5) R1_ERROR = 1;
M1 = 1; M2 = 0;
unsigned int sensor_timeout = 0;
while (S1 == 0 && sensor_timeout < 60) {
delay_ms(100);
sensor_timeout++;
}
M1 = 0;
if (sensor_timeout >= 60) S1_ERROR = 1;
Z1 = 1; delay_ms(500); Z1 = 0;
}
processing = 0;
}
} else {
SYSTEM_ON = 0;
SYSTEM_OFF = 1;
queue_head = 0; queue_tail = 0;
M1 = 0; M2 = 0; M3 = 0; M4 = 0;
Z1 = 0; Z2 = 0; Z3 = 0;
}
}
}