Sunteți pe pagina 1din 12

Stepper Motor Controller

Back to Top

/////////////////////////////////////////////////////////////////////////
////
EX_STEP.C
////
////
////
//// This program interfaces to a stepper motor. The program will ////
//// use the RS-232 interface to either control the motor with a
////
//// analog input, a switch input or by RS-232 command.
////
////
////
//// Configure the CCS prototype card as follows:
////
////
Connect stepper motor to pins 47-50 (B0-B3)
////
////
Conenct 40 to 54 (pushbutton)
////
////
Connect 9 to 15 (pot)
////
////
See additional connections below.
////
/////////////////////////////////////////////////////////////////////////
////
(C) Copyright 1996,2001 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.
////
/////////////////////////////////////////////////////////////////////////
#include <16c74.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include
#byte port_b = 6
#define FOUR_PHASE TRUE
#ifdef FOUR_PHASE
byte const POSITIONS[4] = {0b0101,
0b1001,

// Jumpers: 8 to 11, 7 to 12

0b1010,
0b0110};
#else
byte const POSITIONS[8] = {0b0101,
0b0001,
0b1001,
0b1000,
0b1010,
0b0010,
0b0110,
0b0100};
#endif

drive_stepper(BYTE speed, char dir, BYTE steps) {


static BYTE stepper_state = 0;
BYTE i;
for(i=0; i<steps; ++i) {
delay_ms(speed);
set_tris_b(0xf0);
port_b = POSITIONS[ stepper_state ];
if(dir!='R')
stepper_state=(stepper_state+1)&(sizeof(POSITIONS)-1);
else
stepper_state=(stepper_state-1)&(sizeof(POSITIONS)-1);
}
}

use_pot() {
BYTE value;
setup_adc(adc_clock_internal);
set_adc_channel( 1 );
printf("rn");
while( TRUE ) {
value=read_adc();

printf("%2Xr",value);
if(value<0x80)
drive_stepper(value,'R',8);
else if(value>0x80)
drive_stepper(128-(value-128),'F',8);
}
}

use_switch(BYTE speed, char dir) {


BYTE steps;
printf("nrSteps per press: ");
steps = gethex();
while(true) {
while(input(PIN_B7)) ;
drive_stepper(speed,dir,steps);
while(!input(PIN_B7)) ;
delay_ms(100);
}
}

main() {
byte speed,steps;
char dir;
setup_port_a(RA0_RA1_ANALOG);
while (TRUE) {
printf("nrSpeed (hex): ");
speed = gethex();
if(speed==0)
use_pot();

printf("nrDirection (F,R): ");


dir=getc()|0x20;
putc(dir);
printf("nrSteps (hex): ");
steps = gethex();
if(steps==0)
use_switch(speed,dir);
drive_stepper(speed,dir,steps);
}
}

Seconds Timer
Back to Top

///////////////////////////////////////////////////////////////////////
////
EX_STWT.C
////
////
////
//// This program uses the RTCC (timer0) and interrupts to keep a ////
//// real time seconds counter. A simple stop watch function is
////
//// then implemented.
////
////
////
//// Configure the CCS prototype card as follows:
////
////
Insert jumpers from: 11 to 17 and 12 to 18.
////
///////////////////////////////////////////////////////////////////////
#include<16f877a.h>
#fuses HS,NOLVP,NOWDT,PUT
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#define high_start 76
byte seconds, high_count;
#INT_RTCC
clock_isr() {
high_count -= 1;

//Interrupt procedure
//called every time RTCC
//flips from 255 to 0

if(high_count==0) {
++seconds;
high_count=high_start;
}

//Inc SECONDS counter every


//76 times to keep time

}
void main() {
byte start, time;

//a simple stopwatch program

high_count = high_start;
setup_timer_0( RTCC_INTERNAL | RTCC_DIV_256 );
set_timer0(0);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
do {
printf("Press any key to begin.nr");
getc();
start = seconds;
printf("Press any key to stop.rn");
getc();
time = seconds - start;
printf("%U seconds.nr", time);
} while (TRUE);
}

Simple A/D
Back to Top

/////////////////////////////////////////////////////////////////////////
////
EX_ADMM.C
////
////
////
//// This program displays the min and max of 30 A/D samples over
////
//// the RS-232 interface. The process is repeated forever.
////
////
////
//// Configure the CCS prototype card as follows:
////
////
Insert jumpers from: 11 to 17, 12 to 18 and 9 to 16
////
////
Use the #9 POT to vary the voltage.
////
/////////////////////////////////////////////////////////////////////////
#include<16f877a.h>

#fuses HS,NOLVP,NOWDT,PUT
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
void main() {
int i, value, min, max;
printf("Sampling:");
setup_adc_ports( RA0_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
do {
//Takes 30 samples from pin A0
min = 255;
//and displays the min and max
max = 0;
//values for that 100ms period
for(i = 0; i <= 30; ++i) {
delay_ms(100);
value = read_adc();
if(value < min)
min = value;
if(value > max)
max = value;
}
printf("nrMin:%x MAX: %x", min, max);
} while (TRUE);
}

Output Listing
Back to Top

....................
008D: MOVLW FF
008E: MOVWF 28
....................
008F: CLRF
29
....................
0090: BSF
2B,0
....................
0091: CLRF
26

min=255;

max=0;
incc=TRUE;
for(i=0;i<=30;++i) {

0092: MOVLW 1F
0093: SUBWF 26,W
0094: BTFSC 03,0
0095: GOTO
0AC
....................
0096: MOVLW 64
0097: MOVWF 2C
0098: GOTO
02D
....................
0099: BSF
1F,2
009A: BTFSC 1F,2
009B: GOTO
09A
009C: MOVF
1E,W
009D: MOVWF 27
....................
009E: MOVF
28,W
009F: SUBWF 27,W
00A0: BTFSC 03,0
00A1: GOTO
0A4
....................
00A2: MOVF
27,W
00A3: MOVWF 28
....................
00A4: MOVF
27,W
00A5: SUBWF 29,W
00A6: BTFSC 03,0
00A7: GOTO
0AA
....................
00A8: MOVF
27,W
00A9: MOVWF 29
....................
00AA: INCF
26,F
00AB: GOTO
092
....................
00AC: BTFSC 2B,0
....................
00AD: INCF
2A,F

delay_ms(100);

value = Read_ADC();

if(value < min)

min=value;

if(value > max)

max=value;

if (incc)
counter++;

Simple Square Wave Generator

Back to Top

/////////////////////////////////////////////////////////////////////////
////
EX_SQW.C
////
////
////
//// This program displays a message over the RS-232 and waits for ////
//// any keypress to continue. The program will then begin a 1khz ////
//// square wave over I/O pin B4.
////
////
////
//// Comment out the printf's and getc to eliminate the RS232 and
////
//// just output a square wave.
////
////
////
//// Change both delay_us to delay_ms to make the frequency 1 hz.
////
//// This will be more visable on a LED.
////
////
////
////
////
//// Change the device, clock and RS232 pins for your hardware if
////
//// needed.
////
/////////////////////////////////////////////////////////////////////////
#include <30F2010.h>
//#device ICD=TRUE

// For using the debugger, un-comment

#use delay(crystal=20mhz)

// UART1A specifies the alternate UART pins Pin_C13, Pin_C14


// use UART1 to sprcify UART for pins Pin_F3, Pin_F2
#use rs232(baud=9600, UART1A)

void main() {
printf("Press any key to beginnr");
getc();
printf("1 khz signal activatednr");

while (TRUE) {
output_high(PIN_B4);
delay_us(500);
output_low(PIN_B4);
delay_us(500);
}
}

Watchdog Timer
Back to Top

/////////////////////////////////////////////////////////////////////////
////
EX_WDT.C
////
////
////
//// This program demonstartes the watchdog timer. If the user
////
//// does not hit a key in the set amount of time, the processor
////
//// restarts, and tells the user why it restarted.
////
////
////
//// Jumpers:
////
////
PCH
pin C7 to RS232 RX, pin C6 to RS232 TX
////
////
PCD
none
////
////
////
//// This example will work with the PCD compiler.
////
//// The following conditional compilation lines are used to
////
//// include a valid device for each compiler. Change the device, ////
//// clock and RS232 pins 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.
////
/////////////////////////////////////////////////////////////////////////
#ifndef __PCD__

#error This example is only for dsPIC/PIC24 devices


#endif
#include <30F5011.h>
#fuses HS,NOPROTECT,WDT,WPSB1,WPSA512
#use delay(clock=20000000)
#use rs232(baud=9200, UART1)
main()

switch ( restart_cause() )
{
case RESTART_WATCHDOG:
{
printf("rnRestarted processor because of watchdog timeout!rn");
break;
}
case RESTART_POWER_UP:
{
printf("rnNormal power up!rn");
break;
}
}
setup_wdt(WDT_ON);
while(TRUE)
{
restart_wdt();
printf("Hit any key to avoid a watchdog timeout.rn");
getc();
}
}

A/D Conversion
Back to Top

/////////////////////////////////////////////////////////////////////////
////
EX_ADMM10.C
////
////
////
//// This program displays the min and max of 30 A/D samples over
////
//// the RS-232 interface. The process is repeated forever.
////
////
////
//// If required configure the CCS prototype card as follows:
////
////
Insert jumper from output of POT to pin A5
////
////
Use a 10K POT to vary the voltage.
////
////
////
//// Jumpers:
////
////
PCM,PCH
pin C7 to RS232 RX, pin C6 to RS232 TX
////
////
PCD
none
////
////
////
//// This example will work with the PCM, PCH, and PCD compilers.
////
//// The following conditional compilation lines are used to
////
//// include a valid device for each compiler. Change the device, ////
//// clock and RS232 pins for your hardware if needed.
////
/////////////////////////////////////////////////////////////////////////
////
(C) Copyright 1996,2007 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.
////
/////////////////////////////////////////////////////////////////////////

#include <30F5011.h>
#fuses HS,NOWDT
#use delay(clock=20000000)
#use rs232(baud=9600, UART1)

void main() {
int i, value, min, max;

printf("Sampling:");
setup_adc_ports( sAN0 );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
do {
min=255;
max=0;
for(i=0; i<=30; ++i) {
delay_ms(100);
value = read_adc();
if(valuemax)
max=value;
}
printf("nrMin: %2X Max: %2Xnr",min,max);
} while (TRUE);
}

S-ar putea să vă placă și