pic interrupt vraag

Alleen berichten met de trefwoorden “interrupt picbasic” worden getoond. Alle berichten tonen

Hallo mensen

Ik heb even een vraagje ik ben een nixie-klok aan het maken en wil voor de tijd clock de netspanning gebruiken. Hiervoor gebruikt ik een interrupt in picbasic. Nu heb ik het wel werkend maar een ding snap ik nog niet. als de uitgang de eerste keer hoog wordt gaat hij de code in de interrupt uitvoeren, maar het probleem is dat hij dan er niet meer uitkomt. Dit gebeurd wel als ik in het begin van de interrupt de interrupt in het register uitzet en als hij verder gaat met de code weer aanzet. De interrupt pin reageert in de loop dus nergens op omdat de interrupt functie uitgezet wordt. Dit moet toch niet horen of wel.

voor alle duidelijkheid mijn code zonder dat ik de interrupt in het register uitzet, deze werkt dus niet.

code:


DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
Clear		  				             ;Wis alle ram geheugen
         			      
Dim loop as byte
loop = 0
dim inter as byte 
inter = 0 


ON_INTERRUPT GoTo Interrupt_Handler 
'Assign some Interrupt associated aliases  
Symbol RBIF = INTCON.0 ' RB Port Interrupt Flag
Symbol INTF = INTCON.1 ' RB0 External Interrupt Flag
Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
Symbol RBIE = INTCON.3 ' RB Port Change Interrupt Enable
Symbol INTE = INTCON.4 ' RB0 External Interrupt Enable
Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
Symbol PEIE = INTCON.6 ' Peripheral Interrupt Enable
Symbol GIE = INTCON.7  ' Global Interrupt Enable

RBIF = 0
INTF = 0
T0IF = 0
RBIE = 0
INTE = 1
T0IE = 0
PEIE = 0
GIE = 1
 
GoTo Init        ' Jump over the interrupt subroutine 

'Interrupt routine starts here 
Interrupt_Handler:
   
    inter = inter + 1 
    
    if inter = 50 then   
      loop = loop + 1 
      inter = inter - 50
    endif  
    
    intf = 0
   


Init:

SYMBOL dta     = PORTA.2 
SYMBOL strobe   = PORTA.3 
SYMBOL clk    = PORTA.1

 while 1=1 
    while  loop  < 10 
      low strobe
      shout dta, clk, msbfirst, [loop ]
      high strobe  
    wend 
 loop = loop - 10  
 wend
 
end  

Aan het einde van je interrupt routine moet staan:
context restore

marcob

Golden Member

Zoals UFO al zegt aan het eind van de interrupt routine CONTEXT RESTORE. Maar ik heb geleerd de interrupt routine boven aan in je programma te zetten.
Dus eerst je routines en dan pas je main programma.

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years

Op 20 april 2007 09:07:00 schreef marcob:
...
Maar ik heb geleerd de interrupt routine boven aan in je programma te zetten.
Dus eerst je routines en dan pas je main programma.

Dat heeft 'ie al... Of bedoel je die paar variabelen die ingesteld worden? Moet kunnen toch....
Overigens heb ik het zelf nooit gedaan, en nooit problemen mee gehad, maargoed, ik wil daarover nu geen discussie starten.

code:


    inter = inter + 1 
    
    if inter = 50 then   
      loop = loop + 1 
      inter = inter - 50
    endif  
    
    intf = 0

Defensief programmeren: Je bent er bijna!

het moet zijn:

code:


    if inter >= 50 then   

Mocht op de een of andere manier de teller het voor mekaar krijgen om 2x opgehoogd te worden voordat ie bij de test komt, dan gaat het nu goed.

Nu heb je ALS het fout gaat nog de "race" dat ie dan 2x met 50 verlaagd kan worden, maar als ie gewoon een signed int is, dan heb je daar 1s later geen last meer van.

Hoe kan ie in g..snaam 2x verhoogd worden? Tja, Als er iets mis is, kan het zijn dat 1 interrupt te laat afgehandeld wordt, en dat de interrupt routine geinterrupt wordt. Het gata met jou code fout als de teller op 49 stond, en dat de eerste interrupt hem NET verhoogd heeft naar de 50. De tweede tikt hem dan door naar de 51: ongelijk aan 50....

Als je altijd zo defensief programmeert levert het uiteindelijk een keertje een situatie op waar je niks van merkt dat het anders niet goed gewerkt had...

P.S.:
(het stukje defensief programmeren dat al WEL goed is is het

code:


      inter = inter - 50

De meeste mensen zetten daar "inter = 0", hetgeen vrijwel altijd hetzelfde effect heeft.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Alle kleinere PICs zetten volgens mij heel de interrupt vlag tijdelijk uit als ze in een interrupt functie zitten... of deed PicBasic dat nou voor je.... Anyway, volgens mij kan zo'n kleine PIC geen interrupt in een interrupt hebben.
Maargoed, voor de zekerheid kun je het vaak beter doen dan laten :) Het enige nadeel is dat het soms dus wat meer ruimte en rekenkracht nodig heeft.