
Click image for larger version.
DEFINE OSC 4 ;----[USART Settings]------------------------------------------------------- DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH=1 DEFINE HSER_SPBRG 25 ' 9600 Baud @ 4MHz, 0.16% DEFINE HSER_CLROERR 1 ' Clear overflow automatically ;----[LCD Settings]--------------------------------------------------------- DEFINE LCD_DREG PORTA ' LCD data port DEFINE LCD_DBIT 4 ' LCD data starting bit 0 or 4 DEFINE LCD_RSREG PORTA ' LCD register select port DEFINE LCD_RSBIT 2 ' LCD register select bit DEFINE LCD_EREG PORTA ' LCD enable port DEFINE LCD_EBIT 3 ' LCD enable bit DEFINE LCD_BITS 4 ' LCD bus size 4 or 8 DEFINE LCD_LINES 2 ' Number lines on LCD DEFINE LCD_COMMANDUS 2000 ' Command delay time in us DEFINE LCD_DATAUS 50 ' Data delay time in us ;----[A/D Settings]--------------------------------------------------------- DEFINE ADC_BITS 10 ' ADCIN resolution (Bits) DEFINE ADC_CLOCK 1 ' ADC clock source (Fosc/8) DEFINE ADC_SAMPLEUS 11 ' ADC sampling time (uSec) ;----[Variables]------------------------------------------------------------ GraphMAX VAR WORD GraphMIN VAR WORD GraphVal VAR WORD X VAR WORD ADval VAR WORD Xmax VAR WORD Xmin VAR WORD char VAR BYTE OverRange VAR BIT UnderRange VAR BIT ;----[Aliases]-------------------------------------------------------------- RCIF VAR PIR1.5 OverPin VAR PORTC.5 UnderPin VAR PORTC.4 ;----[Default Values]------------------------------------------------------- GraphMAX = 100 GraphMIN = 0 Xmax = 100 Xmin = 0 ;----[Initialize]----------------------------------------------------------- PORTB = 0 TRISB = 0 PORTD = 0 TRISD = 0 ANSEL = %00000001 ANSELH = 0 ADCON1.7 = 1 PAUSE 250 : LCDOUT $FE,1 : PAUSE 250 : LCDOUT $FE,1 GOSUB ShowMenu GOSUB ShowLimits OverRange = 0 UnderRange = 0 ;----[Main Program Loop]---------------------------------------------------- Main: IF RCIF THEN GOSUB Terminal GOSUB GetAD GOSUB ShowGraph GOSUB CheckOverUnder GOTO Main ;----[Get and Scale Analog Reading]----------------------------------------- GetAD: ADCIN 0, ADval X = ADval * (Xmax - Xmin) X = DIV32 1023 + Xmin LCDOUT $FE,$80, "AD=",DEC ADval, " " LCDOUT $FE,$8B, "X=",DEC X, " " RETURN ;----[Show the BarGraph]---------------------------------------------------- ShowGraph: IF X > GraphMAX THEN OverRange = 1 ELSE OverRange = 0 ENDIF IF X < GraphMIN THEN UnderRange = 1 ELSE UnderRange = 0 ENDIF X = (X MIN GraphMAX) MAX GraphMIN ;-- This is the formula being tested --------------------- GraphVal = $FFFF >> (16-(((X - GraphMIN) * 16) / (GraphMAX - GraphMIN))) PORTD = GraphVal & $FF PORTB = GraphVal >> 8 RETURN ;----[Show Menu for Terminal]----------------------------------------------- ShowMenu: HSEROUT ["MENU: 1=GraphMAX, 2=GraphMIN, 3=Xmax, 4=Xmin :"] RETURN ;----[Handle the RS232 Terminal]-------------------------------------------- Terminal: HSERIN [char] SELECT CASE char CASE "1" : HSEROUT [13,10,"Enter the GraphMAX: "] HSERIN [DEC GraphMAX] CASE "2" : HSEROUT [13,10,"Enter the GraphMIN: "] HSERIN [DEC GraphMIN] CASE "3" : HSEROUT [13,10,"Enter the Xmax: "] HSERIN [DEC Xmax] CASE "4" : HSEROUT [13,10,"Enter the Xmin: "] HSERIN [DEC Xmin] CASE ELSE : HSEROUT [7] END SELECT ;----[Show Limits]---------------------------------------------------------- ShowLimits: LCDOUT $FE,$C0," GRAPH X " LCDOUT $FE,$94,"MAX: " LCDOUT $FE,$D4,"MIN: " LCDOUT $FE,$99,DEC GraphMAX LCDOUT $FE,$D9,DEC GraphMIN LCDOUT $FE,$A1,DEC Xmax LCDOUT $FE,$E1,DEC Xmin RETURN ;----[Look for Over and Under Range]---------------------------------------- BlinkSpeed CON 50 BlinkCount VAR WORD CheckOverUnder: BlinkCount = BlinkCount + 1 IF BlinkCount = BlinkSpeed THEN BlinkCount = 0 IF OverRange THEN TOGGLE OverPin ELSE LOW OverPin ENDIF IF UnderRange THEN TOGGLE UnderPin ELSE LOW UnderPin ENDIF ENDIF RETURN
Re: K42 and Timer Interrupts
Thanks for the explanation.
Ioannis - 28th April 2025, 19:28I misinterpreted these paragraphs. My understanding was to have ASYNC cleared and use Fosc/4.
Ioannis