#include <16F684.h> #device adc=10 #FUSES HS, NOWDT, NOPUT, NOMCLR, NOPROTECT, NOCPD, BROWNOUT, #use delay(clock=20000000) #use fast_io(A) #use fast_io(C) #bit Arechtslauf = 0x07.0 //C0 #bit Alinkslauf = 0x07.1 //C1 #bit PWMout = 0x07.5 //C5 #bit ABetrieb = 0x07.2 //C2 #bit EBetrieb = 0x05.3 //A3 #bit Erechtslauf = 0x07.4 //C4 #bit Elinkslauf = 0x07.3 //C3 int16 tastgrad; // 0-255 = 0% - 100% void main() { //***** Initialisierung der I/O Pins ***** set_tris_a (0x0C); //A3 & A2 IN rest OUT set_tris_c (0x18); //C4 & C3 IN rest OUT Arechtslauf = 0; Alinkslauf = 0; PWMout = 0; //***** Initialisierung des AD Wandlers ***** // setup_adc_ports(ALL_ANALOG); // Referenzspannung ist U+ setup_adc_ports( sAN2 ); setup_adc(ADC_CLOCK_INTERNAL ); set_adc_channel(2); delay_us(10); //***** Initialisierung des PWM ***** setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM setup_timer_2(T2_DIV_BY_1, 250 , 1); // 20000 Hz //2_DIV_BY_1 = keine Prescaler (also gilt 20MHz / 4) // ,250 = der Timer soll bis 250 zählen // ,1 = anzahl Timerüberläufe bis der Inrerrupt ausgelöst wird // Resultierende rechnung: (1 /20000000 MHz) *4 * 250 = t // PWM Freqzenz = 1 / t = 20kHz while(true) { if(EBetrieb == 1) { ABetrieb = 1; tastgrad = read_adc(); tastgrad = (tastgrad/1023.0)*250; if((Erechtslauf == 1) & (Elinkslauf == 0) & (Alinkslauf == 0)) { Arechtslauf = 1; } else { Arechtslauf = 0; } if((Elinkslauf == 1) & (Erechtslauf == 0) & (Arechtslauf == 0)) { Alinkslauf = 1; } else { Alinkslauf = 0; } } else { ABetrieb = 0; tastgrad = 0; Arechtslauf = 0; Alinkslauf = 0; } set_pwm1_duty(tastgrad); // duty cycle on pin C2 } }