'18F2431 AZEL 8MHz INT HVP_Test2431_v12 COMBINED 081215 1000 'Define SIMULATION_WAITMS_VALUE = 1 'else 0 for PIC Define CLOCK_FREQUENCY = 8 Define CONFIG1L = 0x00 Define CONFIG1H = 0x08 'INT OSC Define CONFIG2L = 0x0c Define CONFIG2H = 0x20 Define CONFIG3L = 0x04 Define CONFIG3H = 0x80 Define CONFIG4L = 0x80 'LVP= 0 = Set for HVP Define CONFIG4H = 0x00 Define CONFIG5L = 0x0f Define CONFIG5H = 0xc0 Define CONFIG6L = 0x0f Define CONFIG6H = 0xe0 Define CONFIG7L = 0x0f Define CONFIG7H = 0x40 AllDigital Dim ascbfr4 As Byte @ 0x070 'For ascii conversion Dim ascbfr3 As Byte @ 0x071 'Ax--.0 Dim ascbfr2 As Byte @ 0x072 'A-x-.0 Dim ascbfr1 As Byte @ 0x073 'A--x.0 Dim ascbfr0 As Byte @ 0x074 'A---.x 'Dim b2avall As Byte @ 0x075 'Not used??? 'Dim b2avalm As Byte @ 0x076 'Not used??? 'Dim no_bits As Byte @ 0x077 'Not used??? 'Dim digit_cnt As Byte @ 0x078 'Not used??? Dim b2aval As Word 'PSCNT/AZIMVAL TEMP (b2aval=poscnt and b2aval=azimval POSS FOR ASCII Dim temp3 As Word 'PSCNT TEMP Dim poscnt As Word 'CAP2BUFL/H Position counter register Dim oldpos As Word 'Dim hdr1 As String 'NOT USED Remote Azimuth from 18F4520 Dim uartrxd As String'remote Azimuth from 18F4520 PIC, it expects AxxxExxx in ascii format Dim gpsazim As String 'String shows as Dim gpselev As String '++++EL 'Dim gpsrxd As String NOT USED ??? Dim str1(8) As Byte Dim char As Byte Dim rxi As Byte Dim char1 As String Dim azimval As Word 'required Head Azimuth Dim elevval As Word '++++EL Dim uartrxd As String Dim match1 As Byte Dim rxdta As Byte Dim rx As Byte Dim x As Byte Dim azimcnt As Byte Dim cwccw As Bit '1=CW OR 0=CCW '>>>>>>>>>>>>>>>>> Dim azimdif As Word 'azimval-poscnt poscnt-azimval Dim band1 As Byte Dim duty1 As Byte Dim flag1 As Byte '<<<<<<<<<<<<<<, ADCON0 = %00000011 'A/D Control Register 0 ADCON1 = %00000000 ADCON2 = %10100001 ADCON3 = %00000000 ADCHS = %00000000 'A/D Channels select ANSEL0 = %00000001 'Analogue select Register 0 OSCCON = %01110010 'internal 8Mhz clock TRISA = %00011100 'IN 2,IND 3,QEA 4,QEA TRISB = %00000000 'OUT 4,LED TRISC = %11001000 'OUT 1,PWM REV 2,PWM FOR 4, TO 18F4520 6, TX 7,RX '#'PORTA.0 => AFN Forward Nfet '#'PORTA.1 => ARN Reverse Nfet '#'PORTA.2 =< INDX BUTTON '#'PORTA.3 =< QEA '#'PORTA.4 =< QEB '#'PORTA.5 n/u '#'PORTA.6 => AR Reverse button '#'PORTA.7 => AF Forward button '#'PORTB.4 => LED '#'PORTC.0 n/u '#'PORTC.1 => PWM CCP2 Pfet Reverse '#'PORTC.2 => PWM CCP1 Pfet Forward '#'PORTC.3 n/u '#'PORTC.4 => High = enable Quad Sim [could be used for PWM Off] '#'PORTC.5 n/u [Low= Forward CW , High =Reverse CCW, This used later on PWM control dev] '#'PORTC.6 => TX '#PORTC.7 =< RX '#PORTE.3 =< rst button Symbol led = PORTB.4 '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> led = 1 WaitMs 1000 led = 0 WaitMs 1000 ''While OSCCON.IOFS = 0 ''Wend Symbol forn = PORTA.0 'Forward Nfet enable>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. Symbol revn = PORTA.1 'Reverse Nfet enable>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. 'assign pwm pins PWMon 1, 8 'RC1 CCP1, Mode at 8MHz , to change this look at the Manual tables PWMon 2, 8 'RC2 CCP2 '#'QEICON.VELM = 1 'REG file bit7 '#'QEICON.6 = 0 'REG file error bit6 '#'QEICON.UP = 0 'REG file bit5 '#'QEI enb *4 Reset [CAP2BUF/POSCNT] when INDX detected '#'QEICON.QEIM2 = 1 'REG file bit4 '#'QEICON.QEIM1 = 0 'Reg file bit3 '#'QEICON.QEIM0 = 1 'REG file bit2 '#'QEI enb *4 Reset [CAP2BUF/POSCNT] when Match detected at 360deg '#'QEICON.QEIM2 = 1 '#'QEICON.QEIM1 = 1 '#'QEICON.QEIM0 = 0 '#'QEICON.PDEC1 = 1 'REG file bit1 '#'QEICON.PDEC0 = 1 'REG file bit0 QEICON = %00011011 'QEI enabled in 4x Update mode; position counter is reset on period match (POSCNT = MAXCNT IPR3.IC2QEIP = 1 'high pri intr QEI Interrupt priority bit PIE3.IC2QEIE = 1 'qei intr enb QEI Interrupt flag eneble bit PIR3.IC2QEIF = 0 'Has reached the MAXCNT value, INT QEI MODULE Interrupt flag bit PIR3.IC3DRIF = 0 'clr in s/w REG file motion feedback filter(NOT USED)??????????? Disable High CAP2BUFL = 0x00 'POSCNT from quad signals, preload L0000 CAP2BUFH = 0x00 'POSCNT from quad signals, preload H0000 CAP3BUFL = 0x0f 'MAXCNT, preload with 3599 degrees [actual 359deg] CAP3BUFH = 0x0e 'MAXCNT, preload with ???? degrees [actual ???deg] WaitUs 100 Hseropen 9600 WaitMs 100 poscnt = 0 'change Start Poscount to suit your testing 'PWM and NFETS Off forn = 0 'FORWARD NFET OFF revn = 0 'REVERSE NFET OFF ASM: bcf CCP2CON,DC2B0 ASM: bcf CCP2CON,DC2B1 ASM: movlw 0x00 ASM: movwf CCPR2L ''PWMduty 1, 0 forn = 0 'FORWARD NFET = 0 revn = 0 'REVERSE NFET = 0 ASM: bcf CCP1CON,DC1B0 ASM: bcf CCP1CON,DC1B1 ASM: movlw 0x00 ASM: movwf CCPR1L verify_uart: 'START<><><><><><><><><><><>< 'b2aval = poscnt 'Gosub bin2asc>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?> Hserout "poscnt maxcnt= ", poscnt, ".", ascbfr0, "test", CrLf Hserout "Uart Ready for AxxxExxx input", CrLf clr_azim: 'clear all buffers For rxi = 0 To 7 str1(rxi) = 0 Next rxi char = 0 uartrxd = "" gpsazim = "" gpselev = "" 'gpsrxd = ""'NOT USED ??? azimval = 0 elevval = 0 Enable High 'poscnt/match intr RCSTA.CREN = 1 WaitUs 100 read_azim: If RCSTA.OERR = 1 Then RCSTA.CREN = 0 RCSTA.CREN = 1 char = RCREG char = RCREG PIR1.RCIF = 0 Endif sync1: 'wait for a 'A' start of string If PIR1.RCIF = 0 Then Goto sync1 char = RCREG If char <> 0x41 Then Goto sync1 'A str1(0) = char rxi = 1 get_msg: If PIR1.RCIF = 0 Then Goto get_msg char = RCREG str1(rxi) = char rxi = rxi + 1 If rxi > 7 Then Goto eom Goto get_msg eom: For rxi = 1 To 7 'drop the 'A' char = str1(rxi) char1 = Chr(char) uartrxd = uartrxd + char1 Next rxi Hserout "uartrxd Inp= ", uartrxd, CrLf If MidStr(uartrxd, 4, 1) <> "E" Then Goto clr_azim gpsazim = LeftStr(uartrxd, 3) gpselev = RightStr(uartrxd, 3) '++++ for Elev azimval = StrValW(gpsazim) 'convert ascii to numeric and elevval = StrValW(gpselev) '++++ If azimval > 359 Then Goto clr_azim 'invalid so await next azim input Endif RCSTA.CREN = 0 azimval = azimval * 10 'times *10 = 0000,0010,0020 thru 3580,3590 'b2aval = azimval 'Gosub bin2asc>>?>?>?>?>?>?>?>?>?>?>?>?> Hserout "Valid Azim Inp= ", ascbfr3, ascbfr2, ascbfr1, ".", ascbfr0, "deg", CrLf get_cnt: If poscnt = azimval Then 'TRACKER is pointing at DEGREES INPUT (AZIMVAL) PIR3.IC2QEIF = 1 'raise Intr, Has reached the MAXCNT value, MAXCNT INT QEI MODULE Interrupt flag bit Goto clr_azim Endif get_count: poscnt.LB = CAP2BUFL 'Read QUAD cntr, range 0000 through 3599 'update 18F2431 poscnt.HB = CAP2BUFH ''compare routine for Azimuth required and the Head angle 'the Head always takes the shortest path towards the required Azimuth. If poscnt = azimval Then PORTC.4 = 0 'stop quad gen If match1 = 0 Then ''Hserout #poscnt, CrLf 'just txd azim once match1 = 1 Endif duty1 = 0 Gosub pwm_cont 'on target stop PWM Goto clr_azim 'get ready for next uart rxd azim inp Endif If QEICON.5 = 1 Then 'fwd If poscnt = azimval - band1 Then PORTC.4 = 0 'stop quad gen [CONNECTED to PORTA.4 18F4520 ???????????????????????????????] If match1 = 0 Then '''Hserout #poscnt, CrLf 'just txd azim once match1 = 1 Endif duty1 = 0 Gosub pwm_cont 'on target stop PWM Goto clr_azim 'get ready for next uart rxd azim inp Endif Endif If QEICON.5 = 0 Then 'rev If poscnt = azimval + band1 Then PORTC.4 = 0 'stop quad gen If match1 = 0 Then '''Hserout #poscnt, CrLf 'just txd azim once match1 = 1 Endif duty1 = 0 Gosub pwm_cont 'on target stop PWM Goto clr_azim 'get ready for next uart rxd azim inp Endif Endif If match1 = 1 Then duty1 = 0 Else duty1 = 100 'FORN and REVN added PWM works down to 30 >>>>>>>>>>>>>>> Endif If poscnt < azimval Then If azimval - poscnt >= 1800 Then PORTC.5 = 1 'rev passes thru 000 > 3599 index Else PORTC.5 = 0 Endif Gosub pwm_cont Goto get_count 'keep reading cap2buf [poscnt] Endif If poscnt > azimval Then '270 > 90 If poscnt - azimval >= 1800 Then PORTC.5 = 0 'fwd passes thru 3599 > 000 index Else PORTC.5 = 1 Endif Gosub pwm_cont Goto get_count 'keep reading cap2buf [poscnt] Endif End On High Interrupt Save System 'interrupt on INDEX pulse PORTC.4 input. PIR3.IC2QEIF = 0 'clr in s/w, poscnt=maxcnt or indx PORTA.4 = 0 ''Hserout "Ix=", #azimval, " ", #poscnt, CrLf PORTA.4 = 1 PIE3.IC2QEIE = 1 'qei intr enb Resume pwm_cont: If duty1 = 0 Then PORTC.4 = 0 Else PORTC.4 = 1 'enable quad sim Endif If PORTC.5 = 0 Then 'FWD PWM revn = 0 '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. ASM: bcf CCP2CON,DC2B0 ASM: bcf CCP2CON,DC2B1 ASM: movlw 0x00 ASM: movwf CCPR2L PWMduty 1, duty1 forn = 1 '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. Endif If PORTC.5 = 1 Then 'REV PWM forn = 0 '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ASM: bcf CCP1CON,DC1B0 ASM: bcf CCP1CON,DC1B1 ASM: movlw 0x00 ASM: movwf CCPR1L PWMduty 2, duty1 revn = 1 '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. Endif Return