interrupts en hun problemen

Lambiek

Special Member

Op deze manier kun je afzonderlijke timers maken die je kunt koppelen aan een uitgang.

En kijk naar de reactie van SparkyGSX.

Ga hier maar eens een beetje mee spelen.

Op 22 november 2019 20:16:52 schreef stortbak:
Ook ik zal het tzt eens gaan proberen.

Moet toch te doorgronden zijn met de voorbeelden lijkt mij.

Nu tenminste ook de settings van ntedg.

Ik denk toch dat je, je zelf eens meer moet gaan verdiepen in de datasheet van je desbetreffende controller, daar staan alle settingen voor je registers in en nog veel meer. Als je dat niet doet kom je er nooit achter hoe je iets moet instellen of hoe iets werkt of werkend kan krijgen.

pic basic code:


; TMR0 Prescaler Ratio Configurations                                               

; PS2 PS1 PS0 PSA=0 (External crystal OSC) PSA=1 (Internal WDT OSC)

; 7 6 5 4 3 2 1 0   OPTION_REG: OPTION REGISTER
; 0 0 0 0 0 0 0 0   1 : 2    1 : 1
; 0 0 0 0 0 0 0 1   1 : 4    1 : 2
; 0 0 0 0 0 0 1 0   1 : 8    1 : 4
; 0 0 0 0 0 0 1 1   1 : 16   1 : 8
; 0 0 0 0 0 1 0 0   1 : 32   1 : 16
; 0 0 0 0 0 1 0 1   1 : 64   1 : 32
; 0 0 0 0 0 1 1 0   1 : 128  1 : 64
; 0 0 0 0 0 1 1 1   1 : 256  1 : 128

; bit 7 RBPU: PORTB Pull-up Enable bit
; 1 = PORTB pull-ups are disabled
; 0 = PORTB pull-ups are enabled by individual PORT latch values

; bit 6 INTEDG: Interrupt Edge Select bit
; 1 = Interrupt on rising edge of INT pin
; 0 = Interrupt on falling edge of INT pin

; bit 5 T0CS: TMR0 Clock Source Select bit
; 1 = Transition on T0CKI pin
; 0 = Internal instruction cycle clock (FOSC/4)

; bit 4 T0SE: TMR0 Source Edge Select bit
; 1 = Increment on high-to-low transition on T0CKI pin
; 0 = Increment on low-to-high transition on T0CKI pin

; bit 3 PSA: Prescaler Assignment bit
; 1 = Prescaler is assigned to the WDT
; 0 = Prescaler is assigned to the Timer0 module

; bit 2-0 PS<2:0>: Prescaler Rate Select bits


Device 16F887                          ; Processor type

On_Hardware_Interrupt GoTo INTERRUPT_VLAG

Xtal 10                                ; Cristal 10Mhz

Asm                                    ; Config settings
CONFIG_REQ            
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON 
__CONFIG _CONFIG2, WRT_OFF & BOR40V 
EndAsm
    
All_Digital true                       ; Alle poorten digitaal

Symbol GIE = INTCON.7                  ; Enable interrupt
        
Symbol T0IF = INTCON.2                 ; TIMER0 interrupt vlag
Symbol T0IE = INTCON.5                 ; TIMER0 interrupt enabel
        
Symbol PS0   = OPTION_REG.0            ; Instelling prescaler
Symbol PS1   = OPTION_REG.1            ; Instelling prescaler
Symbol PS2   = OPTION_REG.2            ; Instelling prescaler
Symbol PSA   = OPTION_REG.3            ; Instelling oscillator
Symbol T0SE  = OPTION_REG.4            ; Instelling puls H/L - L/H
Symbol T0CS  = OPTION_REG.5            ; Instelling clock intern of extern
Symbol NTEDG = OPTION_REG.6            ; Instelling interrupt selec bit
Symbol RBPU  = OPTION_REG.7            ; Instelling poort-b pull-up

Symbol LED_0 = PORTA.0                 ; Uitgang voor led-0
Symbol LED_1 = PORTA.1                 ; Uitgang voor led-1
Symbol LED_2 = PORTA.2                 ; Uitgang voor led-2

Dim TMR_1 As Dword                     ; Variabele timer-1
Dim TMR_2 As Dword                     ; Variabele timer-2

Dim PULS As Bit                        ; Variabele puls voor timer-1 en timer-2

GoTo INSTELLING                        ; Spring over nterrupt

INTERRUPT_VLAG:                        ; Interrupt vlag

Context Save 
    If INTCONBITS_T0IF = 1 Then        ; Timer-0 interrupt vlag = 1
       Toggle PORTB.0                  ; Zo nodig zet een PULS op poort b
       INTCONBITS_T0IF = 0             ; Timer-0 interrupt vlag = 0
       
       PULS = PORTB.0                  ; Maak een puls voor TMR-1 en TMR-2
       
       If PULS = 1 Then                
       Inc TMR_1                       
           If TMR_1 > = 10 Then        ; Waarde TMR-1
              LED_0 = 1                
              If TMR_1 > = 20 Then     ; Waarde TMR-1
                 LED_0 = 0             
                 TMR_1 = 0             
              EndIf                    
           EndIf                       
       EndIf                           
    
       If PULS = 1 Then                
       Inc TMR_2                       
           If TMR_2 > = 20 Then        ; Waarde TMR-2
              LED_1 = 1                
              If TMR_2 > = 40 Then     ; Waarde TMR-2
                 LED_1 = 0             
                 TMR_2 = 0             
              EndIf                    
           EndIf                       
       EndIf                           
    EndIf                              
Context Restore                        

INSTELLING:                            ; Instelling register
    PS0   = 1                          ; Prescaler bit_0
    PS1   = 1                          ; Prescaler bit_1
    PS2   = 1                          ; Prescaler bit_2
    PSA   = 0                          ; Prescaler toegewezen aan TIMER0
    T0SE  = 0                          ; Trigger van laag naar hoog
    T0CS  = 0                          ; Trigger door interne clock
    NTEDG = 0                          ; Interrupt select bit
    RBPU  = 0                          ; Poort-B pull-up 
                                                   
    TMR0 = 0                           ; Reset TIMER0
    T0IE = 1                           ; TIMER0 Interrupt enabel aan
    GIE  = 1                           ; Zet Interrupt aan
    
         ;543210                       ; Hulpregel poort A
PORTA  = %000000                       ; Maak poort A laag
TRISA  = %000000                       ; Poort_A I/O

         ;543210                       ; Hulpregel poort B
PORTB  = %000000                       ; Maak poort B laag
TRISB  = %000000                       ; Poort_B I/O

         ;76543210                     ; Hulpregel poort C
PORTC  = %00000000                     ; Maak poort C laag
TRISC  = %00000000                     ; Poort_C I/O

         ;76543210                     ; Hulpregel poort D
PORTD  = %00000000                     ; Maak poort D laag
TRISD  = %00000000                     ; Poort_D I/O

         ;210                          ; Hulpregel poort E 
PORTE  = %000                          ; Maak poort E laag
TRISE  = %111                          ; Poort_E I/O

         ;76543210                     ; Hulpregel analoog
ADCON0 = %00000001                     ; ADCON0 register analoog 8 bit

         ;76543210                     ; Hupregel analoog
;ADCON1 = %10000000                    ; ADCON1 register analoog 10 bit

         ;76543210                     ; Hulpregel analoog poort_B
;ANSELH = %00000000                    ; ANSEL register analoog poort_B


RUN:


    LED_2 = 1
    DelayMS 50
    LED_2 = 0
    DelayMS 50
      
GoTo RUN

End
Als je haar maar goed zit, GROETEN LAMBIEK.