Codigo:
/////////////////////////////////////////////////////////////////////////
//// EX_PATG_2.C ////
//// ////
//// This program will output multiple square waves from the pins ////
//// of port b. The waves can be differnt frequencies, and can be ////
//// seen by hooking up a scope to any of the pins. ////
//// ////
//// Configure the CCS prototype card as follows: ////
//// Connect any of pins 47 through 53 to a scope. ////
//// See additional connections below. ////
//// ////
//// This example will work with the PCM and PCH compilers. The ////
//// following conditional compilation lines are used to include a ////
//// valid device for each compiler. Change the device and clock ////
//// for your hardware if needed. ////
/////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS ////
//// C compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, ////
//// reproduction or distribution is permitted without written ////
//// permission. Derivative programs created using this software ////
//// in object code form are not restricted in any way. ////
/////////////////////////////////////////////////////////////////////////
#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#endif
#define NUM_OUTPUTS 8
//NOTE: periods MUST be multiples of 400
//Periods are in microseconds
/*
#define PERIOD_0 400 //2,5KHz ¡OK, PROTEUS!
#define PERIOD_1 800 //1,25KHz
#define PERIOD_2 1600 //625Hz
#define PERIOD_3 2000 //500Hz
#define PERIOD_4 20000 //50Hz
#define PERIOD_5 64000 //15,625Hz
#define PERIOD_6 2000000 //0,5KHz
*/
#define PERIOD_0 400 //2,5KHz ¡OK, PROTEUS!
#define PERIOD_1 400 //2,5KHz
#define PERIOD_2 800 //1,25KHz
#define PERIOD_3 1600 //625Hz
#define PERIOD_4 8000 //125Hz
#define PERIOD_5 40000 //25Hz
#define PERIOD_6 1000000 //1Hz
#define PERIOD_7 1600 //2,5KHz
const long wave_period[NUM_OUTPUTS] = {
PERIOD_0/400, PERIOD_1/400, PERIOD_2/400, PERIOD_3/400,
PERIOD_4/400, PERIOD_5/400, PERIOD_6/400, PERIOD_7/400};
long counter[NUM_OUTPUTS] = {0,0,0,0,0,0,0,0};
int port_b_image;
// This interrupt is used to output the waveforms. The interrupt
// is automatically called ever 200us.
#INT_TIMER1
void wave_timer() {
int i;
//set_timer1(0xFC4F); // 0xFC4F=64591 sets timer to interrupt in 200us
set_timer1(64570); //Así salen 200us justos (sacados con el MPLAB)
output_b(port_b_image); // outputs the waveform
for(i=0; i<NUM_OUTPUTS; i++) // sets up next output for each pin
{
if((++counter) == wave_period) // if counter is expired
{
counter = 0; // reset counter
if(bit_test(port_b_image,i)) // and set pin as needed
bit_clear(port_b_image,i);
else
bit_set(port_b_image,i);
}
}
}
void main() {
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // setup interrupts
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
port_b_image=0; // initialize variable
output_b(port_b_image);
set_timer1(65535);
while(TRUE); // loop forever
}