Hi Henrik,
All good so far - Step 2 complete.
I have the leds blinking and have modified the code to display Frequency (averaged over a ten cycle loop) on the LCD as follows:
OK, I appreciate that the Frequency readout isn't really the true frequency but I just wanted to prove the averaging routine.Code:' Define LCD registers and bits Define LCD_DREG PORTC Define LCD_DBIT 0 Define LCD_RSREG PORTA Define LCD_RSBIT 5 Define LCD_EREG PORTC Define LCD_EBIT 4 Define LCD_BITS 4 Define LCD_LINES 2 CMCON0 = %00000111 ' Disable comparators ANSEL = %00000000 ' Set PORTA as digital I/O TRISC = 0 ' Set PORTC as output TRISA.1 = 0 ' Make TOCKI input OPTION_REG.0 = 0 ' Prescaler 1:1 OPTION_REG.1 = 0 ' OPTION_REG.2 = 0 ' OPTION_REG.3 = 1 ' Prescaler assigned to WDT OPTION_REG.4 = 0 ' Increment on low-to-high transition OPTION_REG.5 = 1 ' Clock on T0CKI-pin OPTION_REG.6 = 0 ' OPTION_REG.7 = 1 ' OSCCON = %01110101 ' Set clock frequency to 8MHz define OSC 8 ' Included the interrupt system INCLUDE "DT_INTS-14.bas" INCLUDE "ReEnterPBP.bas" ' When compiling for the 16F684 DT-Ints tells us to add these variables so we do that wsave VAR BYTE $20 SYSTEM wsave1 VAR BYTE $A0 SYSTEM TMR1_Reload CON 45536 ' Reload value for ~100Hz interrupt frequency at 8MHz, prescaler 1:1 TMR1_Temp VAR WORD ' Temporary variable use for reloading the timer IntCount VAR BYTE ' Keep track of number of interrupts oldCount VAR BYTE newCount VAR BYTE Frequency VAR WORD UpdateDisplay VAR BIT LED1 VAR PortA.0 LED2 VAR PortA.1 ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler TMR1_INT, _ISR, PBP, yes endm INT_CREATE ; Creates the interrupt processor ENDASM T1CON.0 = 1 ' Start TMR1 @ INT_ENABLE TMR1_INT ; Enable Timer 1 Interrupts Main: ' Toggle LED1 ' Pause 1000 ' Goto Main if intCount = 0 then LCDOUT $FE, $02, "NewCount: ", #newCount, " " LCDOUT $FE, $C0 LCDOUT "Frequency: ", #Frequency, " " Frequency = 0 endif Goto Main ' This is the interrupt routine for the TMR1 interrupt. ISR: T1CON.0 = 0 ' Stop timer TMR1_Temp.HighByte = TMR1H ' Get current "time" TMR1_Temp.LOWBYTE = TMR1L TMR1_Temp = TMR1_Temp + TMR1_Reload ' Add reload value to get correct interval TMR1H = TMR1_Temp.HIGHBYTE ' Move result back to timer TMR1L = TMR1_Temp.LOWBYTE newCount = TMR0 - oldCount oldCount = TMR0 T1CON.0 = 1 ' Start timer IntCount = INtCount + 1 ' Increment interrupt counter Frequency = Frequency + newCount If IntCount = 9 THEN Frequency = Frequency/10 IntCount = 0 ENDIF @ INT_RETURN
Onwards and upwards... What's next?
Cheers
Barry
VK2XBP




Bookmarks