SchemaTheek
 
Home Nieuws Forum Schema's Artikelen Magazine Downloads Links Shops Zoeken
 
Controle Paneel
Gebruikersnaam
Wachtwoord
  Onthoud mij
» Wachtwoord?
» Registreren
Site info
» Het Team
» Contact
» FAQ
» Leden
» Upload Archief
Stats
Totaal online: 4
4 gasten
0 leden:
Forum > Digitaal > 2x interrupt in 1 pic
snuggels
Lid
Berichten: 24
Gepost op dinsdag 13 April 2010 20:02:33 QuoteWijzig

Vervolg op mijn 16F628A teller wil niet probleem het volgende:

Ik gebruik nu een TMR0 die on hardware interrupt activeerd word.

Nu wil ik nog een teller toevoegen, om af te tellen.
Deze had ik in de loop(hoofdprogramma) gezet, maar dit wil niet.Als je de drukknop wil bedienen zit hij nog in de delay.
Dit duurt te lang.

Nu is mijn idee om een TRM1 te gebruiken ook als interrupt,
Kan dit naast TMR0?
Beide door een knop te activeren?
Stynus
Admin
Berichten: 2853
Gepost op dinsdag 13 April 2010 20:13:45 QuoteWijzig

Ik weet niet zeker of TMR1 interrupt kan generen maar als het kan dan moet je in de interrupt routine zoiets doen:
if timer 0 vlag = 1 then
...
endif
if timer 1 vlag = 1 then
...
endif


Met vriendelijke groet, Stynus ||| www.elektronicastynus.be
snuggels
Lid
Berichten: 24
Gepost op dinsdag 13 April 2010 21:05:46 QuoteWijzig

De timers lopen nooit tegelijk, altijd eerst TMR1 en daarna TMR0.
Zeg maar de TMR1 zorgt voor aftellen en de TMR0 zorgt voor optellen.

Stynus
Admin
Berichten: 2853
Gepost op dinsdag 13 April 2010 22:03:01 QuoteWijzig

Kan, maar een 16f pic kent maar 1 interrupt routine. Je zal dus moeten checken waar de interrupt vandaan komt.

Maar als ze nooit tegelijk actief zijn kan het ook met alleen timer0. Met een bit geef je dan bv aan of je aan het op of af tellen bent.


Met vriendelijke groet, Stynus ||| www.elektronicastynus.be
snuggels
Lid
Berichten: 24
Gepost op vrijdag 16 April 2010 15:25:53 QuoteWijzig

Nou ik heb getest maar de 2 timers lopen samen.
Dus als ik timer0 aanroep gaat timer1 meelopen,waarschijnlijk omdat ze in dezelfde interrupt zitten.

Code
Interrupt:
Context SAVE

If T0IF = 0 Then exit_interupt0
If TMR1IF = 0 Then exit_interupt1

TMR0 = 223                        ;1/120sec interrupt
Timer1 = Timer1 + 1
If Timer1 = 120 Then
Inc Optellen
Timer1 = 0
EndIf

T0IF = 0                          ; Clear the TMR0 overflow flag
exit_interupt0:

TMR1 = 223
Timer2 = Timer2 + 1
If Timer2 = 120 Then
Dec Aftellen
Timer2 = 0
EndIf 

TMR1IF = 0                          ; Clear the TMR1 overflow flag
exit_interupt1:

Context Restore                   ;Restore the registers and exit interrupt



Hoe kan ik binnen een interrupt routine voorkomen dat ik beide doorloop?

Stynus
Admin
Berichten: 2853
Gepost op vrijdag 16 April 2010 16:47:51 QuoteWijzig

If T0IF = 0 Then exit_interupt0
If TMR1IF = 0 Then exit_interupt1
Dat moet al weg dan.

En dit in plaats. Op de plaatsen van de commentaar komt de code dat je wil uitvoeren. Het instellen van het TMR0 register enzo moet er ook tussen.
If T0IF = 1 Then
'Interrupt van timer 0
endif
If TMR1IF = 1 Then
'Interrupt van timer 1
endif


Met vriendelijke groet, Stynus ||| www.elektronicastynus.be
dannymyron
Lid
Berichten: 46
Gepost op vrijdag 16 April 2010 18:35:52 QuoteWijzig

De Pic kan om verschillende reden een interrupt veroorzaken (die je zelf insteld) Dus in de interrupt routine moet je
altijd kontroleren (Als je meer dan 1 interrupt hebt zoals in u geval)aan de hand van de vlag (vb. TOIF = Timer0 vlag ) wie de interrupt veroorzaakt. Dan kan je beslissen welke code je moet uit voeren (code van Timer0 of Timer1 ,enz...?). In sommige gevallen mag je niet vergeten de Vlag terug op 0 te zetten(zoals bij de Timers bij andere vlaggen doet de pic het zelf zoals UART interrupt, altijd datasheet checken).

snuggels
Lid
Berichten: 24
Gepost op zaterdag 17 April 2010 19:19:56 QuoteWijzig

Tot in den treuren getest, resultaat 0.
Ik heb de code van de knoppen dusdanig aangepast dat alleen TMR1 loopt,heb de keuze binnen de interrupt laten staan.
Wat blijkt TMR1 loopt en aftellen gaat goed, maar op de zelfde snelheid als de Afteller gaat de Opteller ook optellen.
Dus TMR0 kan niet aangestuurd worden maar het lijkt dat binnen de interrupt TMR0 wel word doorlopen!

Code
Interrupt:
Context SAVE

If T0IF = 1 Then interupt0

If TMR1IF = 1 Then interupt1

interupt0:

TMR0 = 223                        ;1/120sec interrupt
Timer1 = Timer1 + 1
If Timer1 = 120 Then
Inc Optellen
Timer1 = 0
EndIf

T0IF = 0                          ; Clear the TMR0 overflow flag

interupt1:

TMR1 = 223
Timer2 = Timer2 + 1
If Timer2 = 120 Then
Dec Aftellen
Timer2 = 0
EndIf 

TMR1IF = 0                          ; Clear the TMR1 overflow flag


Context Restore                   ;Restore the registers and exit interrupt

Stynus
Admin
Berichten: 2853
Gepost op zaterdag 17 April 2010 19:40:13 QuoteWijzig

Waarom heb je het niet gedaan zoals ik eerst zei?

Als je nu TMR0 interrupt hebt dan doorloopt hij die en daarna ook nog eens de andere met jouw code.


Met vriendelijke groet, Stynus ||| www.elektronicastynus.be
snuggels
Lid
Berichten: 24
Gepost op zaterdag 17 April 2010 19:43:47 QuoteWijzig

Dit heb ik toch gedaan?

Code
If T0IF = 1 Then
'Interrupt van timer 0
endif
If TMR1IF = 1 Then
'Interrupt van timer 1
endif




Code
If T0IF = 1 Then interupt0

If TMR1IF = 1 Then interupt1



Of zie ik het verkeerd?

dannymyron
Lid
Berichten: 46
Gepost op zaterdag 17 April 2010 19:57:45 QuoteWijzig


Code
Interrupt: 
Context SAVE 

If T0IF = 0 Then next_interupt 
TMR0 = 223                        ;1/120sec interrupt 
Timer1 = Timer1 + 1 
If Timer1 = 120 Then 
Inc Optellen 
Timer1 = 0 
EndIf 

T0IF = 0                          ; Clear the TMR0 overflow flag 
next_interupt:
If TMR1IF = 0 Then exit_interupt
TMR1 = 223 
Timer2 = Timer2 + 1 
If Timer2 = 120 Then 
Dec Aftellen 
Timer2 = 0 
EndIf  

TMR1IF = 0                          ; Clear the TMR1 overflow flag 

exit_interupt:
Context Restore                   ;Restore the registers and exit interrupt 
 





 
[Bericht gewijzigd door dannymyron op Zondag 18 April 2010 07:22:03]

Stynus
Admin
Berichten: 2853
Gepost op zaterdag 17 April 2010 20:04:12 QuoteWijzig

Je gaat niet op tijd terug uit de interrupt. Als je het toch zo wil doen dan moet het zoals dannymyron hierboven poste.

Maar heel netjes is het nog niet. Moest je toevallig van nog iets anders interrupt krijgen doorloopt die alles.


Met vriendelijke groet, Stynus ||| www.elektronicastynus.be
snuggels
Lid
Berichten: 24
Gepost op zaterdag 17 April 2010 20:14:24 QuoteWijzig

Met de code van dannymyron lopen ze nog steeds tegelijk!
De 1 telt af en de ander telt op.

Dus TMR0 word nog steeds doorlopen.

dannymyron
Lid
Berichten: 46
Gepost op zaterdag 17 April 2010 20:23:10 QuoteWijzig

als
TOIE = 0 '= INTCON.5 bit : enable timer0 interrupt
dan kan timer0 geen interupt opwekken

andere optie vlag zetten om op of af te tellen daar beide toch niet gelijk lopen
direction = 0 optellen
direction = 1 aftellen

Code



Interrupt:  
Context SAVE  

If T0IF = 0 Then exit_interupt  
TMR0 = 223                        ;1/120sec interrupt  
Timer1 = Timer1 + 1  
If Timer1 = 120 Then  
Select Direction
      case 0
           Inc Optellen
      case 1
           dec aftellen
endselect
Timer1 = 0  
EndIf  

T0IF = 0                          ; Clear the TMR0 overflow flag  


exit_interupt: 
Context Restore 
   


 
[Bericht gewijzigd door dannymyron op Zaterdag 17 April 2010 20:25:23]

snuggels
Lid
Berichten: 24
Gepost op zaterdag 17 April 2010 20:39:23 QuoteWijzig

Okey, maar eigenlijk heeft mijn TMR0 een andere snelheid dan TMR1.

snuggels
Lid
Berichten: 24
Gepost op dinsdag 20 April 2010 21:44:23 QuoteWijzig

Het is gelukt.

Maar denk erom: Als je 2 timers(TMR0 en TMR1) in 1 interrupt gebruikt, waarvan 1 de TMR0 is moet niet alleen met de vlag TOIF in de interrupt maar ook de voorwaarde T0IE anders telt TMR0 mee!

Na veel kijken en lezen toch achter gekomen.
Iedereen die mij geholpen heeft hartelijk dank.


Active Topics

» ATSAMD21J18A-AU backupen
» De gevolgen van een kl...
» De tuin.
» Afstandsbediening plaf...
» Virtual Chemist probleem
» Probleem met Toyota Av...
» Whirlpool kookplaat
» 24 volt motor vertrage...
» Show je mini projecten
» Purer 8.3se

» Meer actieve topics

Advertenties

ElektronicaStynus

© 2004-2022 SchemaTheek
Laadtijd: 0.23565 sec.