#include "umogi2.h" int an4, i; void __attribute__((__interrupt__, __auto_psv__)) _T1Interrupt (void) { // LEDB=!LEDB; // ne villogjon zavarja a pwm-et IFS0bits.T1IF=0; } int main(void) { // PLL start, osccon CLKDIVbits.CPDIV=0; // 32 mhz while (!OSCCONbits.LOCK) Nop(); // megvártuk az indulást __builtin_write_OSCCONL(OSCCON | (1<<1)); // soscen =1 // pps: oc1->ledg. rf4-rp10-oc1(18). rp10r rpor5-ben van RPOR5bits.RP10R=18; __builtin_write_OSCCONL(OSCCON | (1<<6)); // iolock =1 // led tris. gombnál default az input TRISGbits.TRISG6=0; TRISGbits.TRISG7=0; TRISGbits.TRISG8=0; TRISGbits.TRISG9=0; TRISDbits.TRISD15=0; TRISFbits.TRISF4=0; TRISFbits.TRISF5=0; lcd_init(); lcd_cgram(); // 1 sec: timer1 TMR1=0; PR1=0x8000; // 32768, 1 sec: 32.768 khz IPC0bits.T1IP=1; // 1-es prioritás IFS0bits.T1IF=0; // töröld IEC0bits.T1IE=1; // engedélyezd az it-t T1CON=0x8003; // start, külső // timer2 pwm-hez PR2=1024; // 10 bites felbontás lesz T2CON=0x8010; // ps=1:8, 16 mhz->2 MHz-> 1.93khz OC1R=0; OC1CON1=0x0006; // timer2, edge aligned pwm mode. ocm=110 OC1CON2bits.SYNCSEL=0b01100; // sync to timer2 OC1CON2bits.OCTRIG=0; // nem trigger, csak sync if (!SW3) // sw3 bekapcsol: átugorjuk ezt a részt { sprintf(lcd+lcd_cpl,"gyorsits"); lcd_update(); for (i=0; i<1024; i+=8) { OC1R=i; __delay_ms(50); } sprintf(lcd+lcd_cpl,"lassits"); lcd_update(); for (i=1023; i>=7; i-=8) { OC1R=i; __delay_ms(50); } OC1R=0; sprintf(lcd+lcd_cpl,"allj "); lcd_update(); } // feladat: pwm=poti. lcd-re érték kiír! oc1r-t változás esetén frissít AD1PCFGH=0b11; // 16,17: disabled AD1PCFGL=0xffcf; // 4,5: analog. AD1CON2bits.VCFG = 0;// ref+=VDD, ref-=VSS AD1CON3bits.ADRC= 0;// CPU orajel AD1CON3bits.ADCS = 1; //Tad= 2 x Tcy= 130ns >76ns AD1CON3bits.SAMC = 31; //31Tad AD1CON1bits.SSRC=7; // 0b111; //Automata konverzió AD1CON1bits.ADON = 1; //ADC bekapcs AD1CHS0bits.CH0SA = 4; //AN4: poti i=-3; // legalább 1x fusson le az a/d while (1) { AD1CON1bits.SAMP = 1; // konverzio inditasa while(!AD1CON1bits.DONE) Nop(); an4=ADC1BUF0; if (abs(an4-i)>2) { OC1R=an4; sprintf(lcd+lcd_cpl,"pwm=%4i ",an4); lcd_update(); i=an4; __delay_ms(200); } Nop(); } return 0; }