#include "umogi2.h" unsigned int t2,t2s,tgomb; double ido; // use 64bit double nélkül: float BYTE allapot; void __attribute__((__interrupt__, __auto_psv__)) _T1Interrupt (void) { t2++; // egész sec. ic1tmr nullázódik mp-enként LEDB=!LEDB; IFS0bits.T1IF=0; } void __attribute__((__interrupt__, __auto_psv__)) _IC1Interrupt (void) { t2s=IC1BUF; LED1=0; if (allapot==3) allapot=4; IC1CON1bits.ICM=0; // kikapcsol. 1 darab elég volt IFS0bits.IC1IF=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 // sw1: rpi38 -> ic1 in RPINR7bits.IC1R=38; __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; // 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=0x8002; // start, külső // timer2: 50hz, ps 256, pr:1250 gyakorlás TMR2=0; // PR2=1250; // lényegtelen, mert csak a ps-t használja T2CON=0x8030; allapot=0; lcd_init(); lcd_cgram(); while (1) { switch (allapot) // O2-nél 4-es állapotot nem veszi észre! { case 0: // kezdeti kiiratas lcd_cls(); sprintf(lcd,"a double %i bajt nyomj SW4-et",sizeof(double)); lcd_update(); tgomb=0; if (SW4) { lcd_cls(); LEDR=1; sprintf(lcd,"Ne csalj! "); lcd_update(); __delay_ms(1000); LEDR=0; } else allapot=1; break; case 1: // számláló megy sw4-ig tgomb++; if (SW4) { srand(tgomb);// gomb megnyomva. érték srand-ba t2s=rand()%5; // véletlen idö t2=0; TMR1=0; // 1 s idözítö lcd_cls(); sprintf(lcd,"LED1 utan SW1"); sprintf(lcd+lcd_cpl,"tgomb: %u",tgomb); lcd_update(); allapot=2; } break; case 2: if (t2==t2s) // idö letelt, led jöhet { LED1=1; // input capture irq IPC0bits.IC1IP=2; IFS0bits.IC1IF=0; IEC0bits.IC1IE=1; // input capture 1: re1 láb ic1 pin rpinr IC1CON1bits.ICTSEL=1; // timer2 IC1CON1bits.ICI=0; // 1 capture/event IC1CON1bits.ICM=2; // 0b010 lefutó él IC1CON2bits.SYNCSEL=0b01011; // timer 1 sync t2=0; allapot=3; } if (SW1) // itt még korai volt { lcd_cls(); LEDR=1; sprintf(lcd,"Vard meg LED1-et Reset"); lcd_update(); while(1) Nop(); } break; case 3: // várjuk az input capture irq-t. dolgunk nincs break; case 4: ido=t2+(double)t2s/62500; lcd_cls(); sprintf(lcd,"t=%6.3fs ",ido); // %f: double sprintf(lcd+lcd_cpl,"Reset "); lcd_update(); allapot=5; break; } Nop(); } return 0; }