12f675_fuse_about_to_blow!


Closed Thread
Results 1 to 40 of 929

Hybrid View

  1. #1
    Join Date
    Feb 2010
    Location
    I live in the UK
    Posts
    562


    Did you find this post helpful? Yes | No

    Default

    I remember asking that same question to a couple of folks. And I imagine you will also hear that same question.


    You know I really wish I was clever enough to help folk out, one day perhaps, one day.

    Well here's some good news. That's the TX program covered and believe it or not I've got a pretty good idea of how it all works

    Thing is, have you seen the RX program

    So where to next mackrackit? Should I start modifying the TX - RX programs to send a 'TEST' BYTE out and receive it to simulate the Bird_Daily_Count_Total?

    Or start working through the RX program?

    Dave

  2. #2
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    Or start working through the RX program?
    Might be a good idea to run through it. ASM is not my strong point, but Bruce has plenty of comments there.

    Just to be sure we are looking at the same code, here is what I have.
    Code:
    '****************************************************************
    '*  Name    : rfPIC_RX.BAS                                      *
    '*  Author  : B. Reynolds                                       *
    '*  Notice  : Copyright (c) 2007 Reynolds Electronics           *
    '*          : All Rights Reserved                               *
    '*  Date    : 10/09/2007                                        *
    '*  Version : 1.0 (Momentary decoder version)                   *
    '*  Notes   : 2-Bit decoder for Microchip RF dev system         *
    '*          : with rfRXD0420 module installed in PICkit 1 board *
    '****************************************************************
    @ DEVICE PIC16F676,MCLR_OFF,INTRC_OSC_NOCLKOUT,WDT_OFF,BOD_OFF
    @ DEVICE PWRT_ON,PROTECT_OFF
    
        DEFINE OSC 4
        DEFINE NO_CLRWDT 1      ' Watchdog timer is disabled, so we don't need to reset it
        DEFINE OSCCAL_1K 1      ' load factory calibration value
        DEFINE INTHAND RESET_VT ' Interrupt on Timer1 overflow to reset outputs in 65.5mS
                                ' if no serial data received in this time period
        SYMBOL  D_IN = PORTC.1  ' data input pin
        SYMBOL  TMR1IF = PIR1.0 ' Timer1 overflow interrupt flag (reset in int handler)
        SYMBOL  TMR1IE = PIE1.0 ' Timer1 interrupt enable bit
    
        'Variables for saving state in interrupt handler
        wsave   VAR BYTE $5F system    ' Saves W
        ssave   VAR BYTE bank0 system  ' Saves STATUS
        psave   VAR BYTE bank0 system  ' Saves PCLATH
        fsave   VAR BYTE bank0 system  ' Saves FSR
    
        ' Working variables
        MATCH     VAR BYTE bank0 system ' Match variable
        DAT_OUTB  VAR BYTE  ' Holds decoded data for output
        DAT_IN1   VAR BYTE  ' 1st Data byte
        DAT_IN2   VAR BYTE  ' 2nd Data byte for verify
        CHK_SUM   VAR BYTE  ' Holds checksum received
        CheckSum  VAR BYTE  ' Computed checksum of all bytes received
        LOOPS     VAR BYTE  ' Loop var
    
        ' Constants
        Synch    CON "~"    ' 01111110 synch byte
        N2400    CON 16780  ' 2400 bps inverted
        N4800    CON 188    ' 4800 bps inverted
    
         ' hardware init
        PORTA = 0
        TRISA = %00111001   ' RA1 and RA2 are LED outputs
        PORTC = 0           ' Clear outputs on power-up
        TRISC = %00111110   ' RC1 = RF input
        IOC = 0             ' Interrupt on change disabled
        VRCON = 0           ' Comparator Vref disabled
        CMCON = 7           ' Disable comparators
        ANSEL = 0           ' disable A/D
        OPTION_REG = 128    ' Pull-ups off
    
        ' Setup Timer1 for resets after ~65.5mS
        T1CON = %00000000   ' Internal clock, 1:1 prescale, Timer1 off for now
        TMR1L = 0
        TMR1H = 0           ' Timer1 low & high bytes cleared
        TMR1IF = 0          ' Clear Timer1 overflow flag before enabling interrupt
        TMR1IE = 1          ' Enable Timer1 overflow interrupt
        INTCON = %11000000  ' Global & peripheral ints enabled
        MATCH = 0           ' Clear match count
        GOTO    MAIN        ' Jump over int handler
    
    ASM  ; Timer1 overflow interrupt resets outputs when no valid key press
         ; is detected within ~65mS
    RESET_VT
        movwf  wsave         ; Save W
        swapf  STATUS, W     ; Swap STATUS to W (swap avoids changing STATUS)
        clrf   STATUS        ; Clear STATUS
        movwf  ssave         ; Save swapped STATUS
        movf   PCLATH, W     ; Move PCLATH to W
        movwf  psave         ; Save PCLATH
        movf   FSR, W        ; Move FSR to W
        movwf  fsave         ; Save FSR
    
        ; Do interrupt stuff here
        bcf    T1CON,TMR1ON  ; Stop Timer1
        clrf   TMR1L         ; Clear low byte
        clrf   TMR1H         ; Clear high byte
        bcf    PIR1,TMR1IF   ; Clear Timer1 interrupt flag bit
        clrf   PORTA         ; Clear outputs on button release
        clrf   MATCH         ; Clear match variable
    
        ; Restore FSR, PCLATH, STATUS and W registers
        movf    fsave, W     ; retrieve FSR value
        movwf   FSR          ; Restore it to FSR
        movf    psave, W     ; Retrieve PCLATH value
        movwf   PCLATH       ; Restore it to PCLATH
        swapf   ssave, W     ; Get swapped STATUS value (swap to avoid changing STATUS)
        movwf   STATUS       ; Restore it to STATUS
        swapf   wsave, F     ; Swap the stored W value
        swapf   wsave, W     ; Restore it to W (swap to avoid changing STATUS)
        bsf     T1CON,TMR1ON ; Re-enable Timer1 before exiting interrupt handler
        retfie               ; Return from the interrupt
    ENDASM
    
    MAIN:
        ' Fire up Timer1 before entry to serial input routine
        T1CON.0 = 1
    
        ' at 4MHz Timer1 overflows in 65536 * 1uS (~65.5mS) if no Synch byte
        ' and serial data arrive on time. SERIN2 timeout & label options
        ' are useless with a noisy RF receiver output - as noise continually
        ' resets the timeout period causing it to hang forever.
    
        ' Wait for Synch byte, then get new inbound data & checksum
        SERIN2 D_IN,N2400,[WAIT(Synch),DAT_IN1,DAT_IN2,CHK_SUM]
    
        T1CON.0 = 0    ' Stop Timer1 once we've received data
        TMR1L = 0      ' Clear low byte
        TMR1H = 0      ' Clear high byte
    
        ' / **** Begin data validation **** /
    
        ' Calculate checksum by adding 2 data bytes together
        CheckSum = DAT_IN1 + DAT_IN2
    
        ' Test new checksum against one received in CHK_SUM
        IF CheckSum != CHK_SUM THEN MAIN ' Failed checksum, return
    
        ' Test data bytes for match
        IF (DAT_IN1) != (DAT_IN2) THEN MAIN ' Failed data comparison, return
    
        MATCH = MATCH + 1        ' We have a match so increment match count
        IF MATCH = 2 THEN DECODE ' Everything matched twice, we're good
        GOTO Main                ' Else do it all over
    
        ' Everything looking good - so place new data on outputs
    DECODE:
        ' Place decoded values on port pins..
        PORTA = DAT_IN1 & %00000110
        DAT_IN1 = !DAT_IN2  ' Destroy the match
        MATCH = 0
        GOTO MAIN
    
        END
    Dave
    Always wear safety glasses while programming.

  3. #3
    Join Date
    Feb 2010
    Location
    I live in the UK
    Posts
    562


    Did you find this post helpful? Yes | No

    Default

    That's the one.

    An awful lot of new stuff there. Now I'm thinking should I really jump in and start to learn a little Assembly as well?

    That's where I was in February trying to light my first LED.... The rest is history as they say. I remember reading the Microchip stuff saying there was only 35 instruction words to learn (I'm sure I read that somewhere) and thinking to myself "How difficult can that be"......lol.

    Well you're getting to know me now mackrackit, slow, not very bright but determined!

    I'm game if you are.

    Dave

  4. #4
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    I think for now being able to read the ASM code enough to understand what is going on will be enough. Then learn how to write some of it later.

    Have you done anything with interrupts yet? That is what the ASM is doing in this code.
    Dave
    Always wear safety glasses while programming.

  5. #5
    Join Date
    Feb 2010
    Location
    I live in the UK
    Posts
    562


    Did you find this post helpful? Yes | No

    Default

    Have you done anything with interrupts yet? That is what the ASM is doing in this code.
    We have touched on it, we did a timing loop interrupt program (it might have been before I bought the full PBP program) so quite a while back .

    So where to start then?

  6. #6
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    So where to start then?
    At the top...

    The PBP manual has a section in the back about interrupts in ASM, Read it along with the code.
    Basically, when an interrupt is called things have to be saved so the program can pickup where it left off while dealing with the interruption. Have you ever received a phone call and when the call was over forgot what you were doing when the call came in? We do not want the PIC to have that problem.
    Dave
    Always wear safety glasses while programming.

  7. #7
    Join Date
    Feb 2010
    Location
    I live in the UK
    Posts
    562


    Did you find this post helpful? Yes | No

    Default

    Have you ever received a phone call and when the call was over forgot what you were doing when the call came in? We do not want the PIC to have that problem.
    I've had conversations lately where I've gone off track for a moment and completely forgot the main thread of what I was saying, I think the Interrupt handler in my brain need dubugin

    The PBP manual has a section in the back about interrupts in ASM, Read it along with the code.
    Page 200 in the manual, I'm reading it and trying to work through the code. Bruce's code is exactly the same well very similar, with the Interrupt block in the middle added.

    Thanks for the pointer mackrackit.

    Dave

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts