MassaM
Joined: 08 Jun 2019 Posts: 31
|
Relay controller - 8 ports with led status |
Posted: Fri Jun 21, 2019 9:28 am |
|
|
Code: |
*/
// ************************************************ Array version ************************************************ //
Project: Demo Controller Board - 8 Channels Relay with status LEDs and push buttons for an ON/OFF toggle
Compiler: CCS-C-PIC - PCWHD Version 5.076
Author: MassaM, June 2019
Chip: PIC16F877A@20Mhz
Copyright: No copy-rights nor copy-wrongs! :)
Request: Make it better and post it back on this thread, so we all learn please! And always give credits where due, as what goes around, comes around! ;)
Forum Link: http://www.ccsinfo.com/forum/viewtopic.php?t=58066
Credits: Ttelmah -> http://www.ccsinfo.com/forum/profile.php?mode=viewprofile&u=14537&sid=42ae004153892ee2adcd40879d100ea4
temtronic -> http://www.ccsinfo.com/forum/profile.php?mode=viewprofile&u=15187
dluu13 -> http://www.ccsinfo.com/forum/profile.php?mode=viewprofile&u=24556&sid=42ae004153892ee2adcd40879d100ea4
PCM programmer -> http://www.ccsinfo.com/forum/profile.php?mode=viewprofile&u=4
*/
#include <16F877A.h>
//Note: Edited 1 & 2 on 17th July 2019
#fuses HS, BROWNOUT, PUT, NOWDT // Edited 1: HS instead of XT
#use delay(crystal=16M) // Edited 2: was (clock=20M)
#use rs232(stream=SERIAL, baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=N, bits=8) // settings for Serial/Terminal outputs
#define FOSC getenv("CLOCK") // Get PIC oscillator frequency
#define TIMER0_PRELOAD (256 - (FOSC/4/256/100))
/* ****************************************************************************************************************** */
// Array version variables
int16 switches[] = {PIN_B0,PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7};
int16 leds[] = {PIN_D0,PIN_D1,PIN_D2,PIN_D3,PIN_D4,PIN_D5,PIN_D6,PIN_D7};
int8 switch_is_down[] = {FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE};
int8 active_state[] = {0,0,0,0,0,0,0,0};
int8 previous_state[] = {0,0,0,0,0,0,0,0};
int8 portb_states;
/* ****************************************************************************************************************** */
/* ****************************************************************************************************************** */
// Array version functions
/* ****************************************************************************************************************** */
void display_binary(char c) // Used for printing binary out to terminal as debugging (Credit to: PCM Programmer)
{
char i;
putc('0');
putc('b');
for(i = 0; i < 8; i++)
{
if(c & 0x80)
putc('1');
else
putc('0');
c <<= 1;
}
}
void clearSwitches_Array()
{
int8 i;
for(i=0; i < 8; i++)
{
switch_is_down[i] = FALSE; // Clear the switch is pushed flag
}
}
void pollSwitches_Array()
{
int8 i;
for(i=0; i < 8; i++)
{
if(switch_is_down[i] == TRUE)
{
switch_is_down[i] = FALSE; // Clear the switch is pushed flag
output_toggle(leds[i]);
}
}
}
void checkStates_Array()
{
int8 i;
for(i=0; i < 8; i++)
{
active_state[i] = input(switches[i]); // Read the button
if((previous_state[i] == 1) && (active_state[i] == 0))
{
switch_is_down[i] = TRUE;
}
previous_state[i] = active_state[i]; // Save current value for next time
pollSwitches_Array(); // <- Moved this function call from the main's while(TRUE) to here and THE Compiler is HAPPY NOW! :)
// Credit: dluu13 -> For the awesome clue! Thanks! :)
}
}
void timer0_init(void)
{
setup_timer_0(T0_INTERNAL | T0_DIV_256 | T0_8_BIT);
set_timer0(TIMER0_PRELOAD);
clear_interrupt(INT_TIMER0);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
}
#int_timer0
void timer0_isr(void)
{
set_rtcc(TIMER0_PRELOAD); // Reload Timer0 for 10ms rate
checkStates_Array(); // All working now! :)
}
void initAll(){
timer0_init();
clearSwitches_Array();
portb_states = input_b(); // read the state of all switches as full port
// Uncomment the block below for port B states debug to terminal output
/*
printf("Initial PORT B States\r\n"); // print the initial port state
display_binary(portb_states); // print the port state to terminal in binary
printf("\r\n---------------------\r\n"); // print separation lines
*/
}
void main()
{
initAll();
while(TRUE)
{
portb_states = input_b(); // read the state of all switches as full port
// Uncomment the block below for port B states debug to terminal output
/*
printf("Updated PORT B States\r\n"); // print the updated port state
display_binary(portb_states); // print the port state to terminal in binary
printf("\r\n---------------------\r\n"); // print separation lines
*/
} // while true
} // main
|
Youtube links for:
Simulation:
https://www.youtube.com/watch?v=gqhuIhm1n2k
Demonstration on breadboard:
https://www.youtube.com/watch?v=R96LOQxJpZk
Hope this helps.
Cheers! _________________ while(!dead)
{
keepLearning();
} |
|