#include "umogi2.h" // #define INTERRUPT int an4,an5; BOOL update; void __attribute__((__interrupt__, __auto_psv__)) _T1Interrupt (void) { // timer1: 1 hz. LEDB=!LEDB; IFS0bits.T1IF=0; } #ifdef INTERRUPT void __attribute__((__interrupt__, __auto_psv__)) _ADC1Interrupt (void) { if (AD1CHS0bits.CH0SA==4) // poti volt { an4=ADC1BUF0; AD1CHS0bits.CH0SA=5; // szenzor jöjjön } else // szenzor volt { an5=ADC1BUF0; AD1CHS0bits.CH0SA=4; // poti jöjjön update=TRUE; // O2 optimalizálással nem müködik, kihagyja } LED3=!LED3;// mérés jelzése IFS0bits.AD1IF=0; } #endif int main(void) { // PLL start CLKDIVbits.CPDIV=0; // 32 mhz while (!OSCCONbits.LOCK) Nop(); // megvárjuk az oszcillátort __builtin_write_OSCCONL(OSCCON | (1<<1)); // soscen =1 // pps: RG9 RP27 legyen c1out (1) RPOR13bits.RP27R=1; __builtin_write_OSCCONL(OSCCON | (1<<6)); // TRIS: minden láb bemenet indításkor TRISGbits.TRISG6=0; // nem 3 állapotú, hanem KIMENET TRISGbits.TRISG7=0; TRISGbits.TRISG8=0; TRISGbits.TRISG9=0; TRISDbits.TRISD15=0; TRISFbits.TRISF4=0; TRISFbits.TRISF5=0; // 1 sec: timer1 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 (ezt is írd meg) T1CON=0x8002; lcd_init(); lcd_cgram(); sprintf(lcd,"uMogi2 ready "); sprintf(lcd+lcd_cpl,"RCON=0x%04x ",RCON); lcd_update(); //#pragma config WDTPS = PS4096 // Watchdog Timer Postscaler (1:32,768) //#pragma config FWPSA = PR32 // WDT Prescaler (Prescaler ratio of 1:128) RCONbits.WDTO=0; // watchdog bitje RCONbits.SWDTEN=0; // watchdog letiltva LED4=1; __delay_ms(500); // comparator ref CVRCONbits.CVRSS=0; // táp és föld CVRCONbits.CVR=8; // közepes érték CVRCONbits.CVREN=1; // bekapcsol // comparator CM1CONbits.CREF=1; // + bemenet vref CM1CONbits.CCH=0; // - bemenet poti CM1CONbits.COE=1; // kimenet a pps-re CM1CONbits.CPOL=1; // megfordit CM1CONbits.CON=1; // bekapcsol // a/d. poti: ch4, szenzor: ch5 AD1PCFGH=0b11; // 16,17: digital AD1PCFGL=0xffce; // 0, 4,5:analog AD1CON2bits.VCFG=0; // ref+ VDD, ref- VSS AD1CON3bits.ADRC=0; // cpu órajel AD1CON3bits.ADCS=1; // 2*tcy = 130 ns>76 ns AD1CON3bits.SAMC=31; // mintavétel #ifdef INTERRUPT AD1CON1bits.SSRC=0b010; // 010: timer3 AD1CON1bits.ASAM=1; // auto sample T3CON=0x8030; PR3=6250; // 100 msec IPC3bits.AD1IP=2; // fontosabb IFS0bits.AD1IF=0; IEC0bits.AD1IE=1; // engedd be update=FALSE; #else AD1CON1bits.SSRC=0b111; // 111:automata konverzió AD1CON1bits.ASAM=0; // manual sample #endif AD1CHS0bits.CH0SA=4; // poti AD1CON1bits.ADON=1; while (1) // végtelen ciklus! { #ifndef INTERRUPT AD1CHS0bits.CH0SA=4; // poti AD1CON1bits.SAMP=1; // indulj! while (!AD1CON1bits.DONE) Nop(); // kész van? O1 optimalizálással nem várja meg' an4=ADC1BUF0; AD1CHS0bits.CH0SA=5; // szenzor AD1CON1bits.SAMP=1; // indulj! while (!AD1CON1bits.DONE) Nop(); // Itt sem. mindkettö an-ben 5-ös szenzor lesz. an5=ADC1BUF0; #else if (update) // O2 optimalizálás kihagyja. "update nem kap itt értéket, false maradt" #endif { lcd_cls(); sprintf(lcd,"poti=%4i ",an4); sprintf(lcd+lcd_cpl,"szenzor=%4i ",an5); lcd_update(); #ifndef INTERRUPT __delay_ms(50); // lcd miatt #endif update=FALSE; } // ClrWdt(); // watchdog ne gyere Nop(); } return 0; // ide nem szabad eljutni! }