Interrupts in Pic Basic

Omdat ik een rotary encoder wil gaan gebruiken i.c.m. picbasic kwam ik uit op een nieuw onderwerp voor mij: interrupts in pic basic. Ik kwam hier op de site een voorbeeld tegen welke ook gebruik maakt van een rotary encoder:

pic basic code:

DEVICE 16F628A
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF,MCLRE_OFF
 
On_interrupt rotary
SYMBOL INTF = INTCON.1        ' RB0 External Interrupt Flag
SYMBOL INTE = INTCON.4        ' RB0 External Interrupt Enable
SYMBOL GIE = INTCON.7         ' Global Interrupt Enable

SYMBOL led = PORTA.0
DIM teller AS BYTE
ALL_DIGITAL true
teller=0
DELAYMS 500
CLS
LOW led
GOTO over_irq

rotary:

IF PORTB.0 = 1 THEN
  IF PORTB.1 = 1 THEN
    DEC teller
  ELSE
    INC teller
  ENDIF
  TOGGLE led
ENDIF
INTF=0
CONTEXT RESTORE


over_irq:

GIE=0
INTE=1
GIE=1

loop:

DELAYMS 100
PRINT AT 1,1, DEC teller,"  "
GOTO loop
END

Op internet kan ik nog niet echt een samenhangend verhaal vinden over interrupts in picbasic wat het hele verhaal verteld. Daarom is bovenstaande code me niet helemaal duidelijk. Ik lees het zo:

Programma draait continue in de print teller loop tenzij een interrupt via RB0 plaats vindt. Door RB0 = 1 zal INTF 1 worden.

Bij een interrupt wordt de teller opgehoogd of verlaagd, afhankelijk van draairichting, en de led zal aangezet worden.
INTF=0 zet de flag weer laag.
Context Restore: Restore the register and exit the interrupt. Dit begrijp ik niet goed, wat gebeurd er met welke register? En hoe gaat het programma verder, verder bij "over_irq" of terug naar het begin?

over_irq
GIE=0 zet interrupt hardware uit
INTE=1 zet interrupt voor RB0 aan
GIE=1 zet interrupt hardware uit

Programma gaat vervolgens weer verder in print teller loop? Als dit zo is dan blijft de led aan wat mij niet de bedoeling lijkt. Wellicht gaat het programma toch verder bij het begin waardoor de led weer uitgaat maar dan is de teller ook weer 0, dit lijkt me ook niet de bedoeling. Het hele stuk onder over_irq begrijp ik eigenlijk niet.

Waar gaat het fout met mijn interpretatie?

Arco

Special Member

Je weet duidelijk nog niets over interrupts, lees de datasheet eens... ;)
Daarin wordt uitgelegd wat een interrupt doet, en welke registers bij een interrupt moeten worden opgeslagen.
Aan het begin van een interrupt hoort een context save, aan het eind een context restore. (zodat alles weer wordt hersteld zoals het voor de interrupt was)

En hoe gaat het programma verder, verder bij "over_irq" of terug naar het begin?

Geen van beiden. Het programma gaat weer verder waar het was toen de interrupt optrad.
De interrupt routine is een losse routine die niets met de main() code te maken heeft.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

GIE = 0 zet alle interrupts UIT.
INTE = 1 zet de externe interrupts op poort B aan.
GIE = 1 zet alle interrupts weer aan, en je programma reageert daar dus op.

In de loop wordt dus constant de waarde van de teller weergegeven, welke dus door de interrupt wordt onderbroken als je aan de encoder draait, en dus de teller ophoogt en verlaagt als je een bepaalde richting opdraait.

de interrupt kan in elk gedeelte van de loop voorkomen.....

De interrupt-handler "rotary" kan nog beter worden als je eerst checkt of INTF 1 is, want een interrupt kan door meerdere oorzaken veroorzaakt worden, te weten de uart of een timer of wat dan ook.

Door te checken of INTF 1 is weet je dus ook of de interrupt is veroorzaakt door de rotary-encoder.

Maar wat Arco ook al zei, chheck de datasheet en kijk wat er allemaal aan interrupts voorbij kan komen.

Domoticz en ESP8266, goede combo!!!

Op 26 oktober 2013 01:13:34 schreef Arco:
Je weet duidelijk nog niets over interrupts, lees de datasheet eens... ;)

Dat was me ook al wel duidelijk maar het is wel makkelijk gezegd om naar de datasheet te verwijzen, geloof me of niet maar dit heb ik zeker gedaan.
Als beginner die enkel een beetje ervaring heeft in picbasic valt het niet mee om weg wijs te worden met alleen de datasheets. Als je datasheets wil begrijpen heb je nog wel een stukje basis kennis nodig, en een goed duidelijk verhaal heb ik hierover nog niet kunnen vinden.

Arco

Special Member

Er is veel leerstof over PIC's en microcontrollers in het algemeen te vinden. Voorbeeld: http://www.mikroe.com/products/view/11/book-pic-microcontrollers/
Het is toch echt eigenlijk nodig om die basiskennis te hebben als je zinvol wilt programmeren.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

In ieder geval mist de "Context save" instructie.(zoals Arco ook al zei)
Deze moet direct onder "rotary:"

Verder zou het volgens mij kunnen werken.
Heb geen 16F628 om het te testen.

Je programma gaat na de interrupt weer verder op het punt waar het onderbroken werd.
In dit geval dus meestal ergens in de 100ms delay.

De LED wordt van stand verandert in de interrupt routine.(TOGGLE)

Houd wel rekening met kontakt dender van de rotary encoder.
Een klein delay in het begin van de interrupt routine kan hiervoor helpen.(Ja, ik weet dat je interrupt routines zo kort mogelijk hoort te houden)

Zie ook http://www.knutselaar.eu/WP/rotary-encoder/

Ik ben begonnen met de picbasic cursus van Frits. Met deze cursus kun je heel snel resultaten bereiken maar goed begrijpen wat er "in" de pic gebeurt leer je m.i. niet. Als je dan een beetje rond googled en nog eens wat andere specifieke basic voorbeelden zoekt kun je heel wat voor elkaar krijgen maar goed begrijpen wat de pic exact doet leer je dan niet.

@Arco, bedankt voor de link, lijkt me een goed boek. Via internet vindt ik niet prettig om langdurig te lezen dus ik zal eens kijken of ik een boek kan kopen.

Wat ik momenteel niet begrijp is waarom onder over_irq eerst GIE uitgezet wordt en nadat INTE geactiveerd is wordt GIE weer aangezet. Kan INTE alleen geactiveerd worden indien GIE 0 is? GIE wordt dan voor de zekerheid 0 gemaakt?

@Knutselaar
Waarom zou je de interrupt routine zo kort mogelijk houden? Dat je geen lange delays inbouwd in het programma kan ik begrijpen omdat de hardware interrupt het commando afmaakt als ik het goed begrijp. Dus i.p.v. delayms 200 kun je beter een for..next loop gebruiken met 200x 1ms.

Arco

Special Member

Een interrupt moet altijd zo kort mogelijk, inderdaad zeker geen delays gebruiken. (geen delay van 200mS en ook geen 200 delays van 1mS)
Alles wat tijd kost doe je in de main routine.
Zeker als de interrupts vaak komen is dat belangrijk, je moet de interrupt afgehandeld hebben voor de volgende komt.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 26 oktober 2013 22:48:14 schreef Arco:
Zeker als de interrupts vaak komen is dat belangrijk, je moet de interrupt afgehandeld hebben voor de volgende komt.

Ok, dat is duidelijk.
Ik bedoelde dat je in de main routine lange delays moet zien te voorkomen, dus beter een heleboel korte indien ze echt nodig zijn.

Maar waarom wordt GIE eerst gedisabled, is dit nodig?

Arco

Special Member

Disablen is inderdaad nutteloos, interrupts zijn default al gedisabled.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Beschouw een interrupt als volgt:
Je bent aan het werk...de telefoon gaat...je voert een gesprek...hangt op...en gaat weer verder waar je was gebleven.

Just find out what you like and let it kill you

Ik heb de interrupt aan een bestaande schakeling toegevoegd. Een switch verbonden aan de pic moet de interrupt activeren. Omdat het een bestaande schakeling betreft was de switch niet met de INT poort verbonden.

Ik heb nu de bestaande ingang doorverbonden aan de INT poort. Twee ingangen zijn dus gezamenlijk verbonden en met 1K naar ground getrokken. Waar ik nu last van heb is dat de PIC ongewenst gaat schakelen. Aan het schakel gedrag kan ik afleiden dat blijkbaar de INT ingang ongewenst hoog wordt, terwijl deze met 1K aan de ground ligt.

Hoe komt dit? Mag ik de INT ingang (RB0) niet verbinden met RC1 en de gezamenlijk aan ground leggen.
De rest van de schakeling, aantal switches ook met 1k aan ground, zorgt niet voor problemen.
Ongewenst schakelen gebeurt vooral wanneer op de printplaat een relais bediend wordt maar soms ook wanneer in de buurt andere apparaten worden in/uitgeschakeld.

Arco

Special Member

Het verhaal begint wat onduidelijk te worden. Je gebruikt een 16F628A en daarop port RC1? (die zit er helemaal niet op!)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ja sorry, ik zie wat je bedoelt.
Het verhaal begon met een 16F628A, inmiddels maak ik gebruik van een 16LF73 welke dus wel een C-poort heeft.

Zou, na je laatste opmerkingen handig zijn om even te tekenen hoe alles is aangesloten, samen met je ontkoppel condensatoren.
Je hebt het over ongewenst schakel gedrag kan hardware of/en software zijn.
Gooi hier ook even neer wat je huidige software ontwerp is.

Ok, hierbij een aantal foto's.

12V ingang en vervolgens een 7805, voor de 7805 een tantaal van 10uF en er achter een 100nF condensator:
http://farm4.staticflickr.com/3818/10902117265_992e5953f6.jpg

Alle draden rondom de PIC gaan naar het frontpanneel, voor het LCD scherm, schakelaars een aansluiting voor programmer. Onder de PIC zit een 100nF ontkoppel condensator. Het relais schakelt een 220V pomp.
http://farm4.staticflickr.com/3792/10902119235_73bf5d117e.jpg

Aan de drie oranje kabels die naar buiten geleid worden zitten PT1000's aangesloten.
http://farm6.staticflickr.com/5550/10902249304_0696a7143d.jpg

Frontpaneel met aan zijkant aansluiting voor PicKit 2.
http://farm4.staticflickr.com/3726/10902253874_e2705e402e.jpg

Zoals gezegd zijn RB0 (INT) en RC1 met elkaar verbonden en liggen met 1K aan ground. De rotary encoder is op 5V aangesloten en als deze bediend wordt komt er op RBO en RC1 5V te staan.
Het ongewenst gedrag wordt m.i. veroorzaakt doordat INT ongewenst hoog wordt, ik kom dan in het menu om de gewenste temperatuur in te stellen:

pic basic code:

Rotary:                                       

On_interrupt Rotary
SYMBOL INTF = INTCON.1                        ;RB0 External Interrupt Flag
SYMBOL INTE = INTCON.4                        ;RB0 External Interrupt Enable
SYMBOL GIE = INTCON.7                         ;Global Interrupt Enable
;============================
CLEAR                                         ;wissen geheugeb
therm = 10                                    ;stelt minimum thermostaat temp in
DELAYMS 500                                   ;stabilisatie
CLS                                           ;wis scherm
GOTO over_Rotary:
;=============================                
Rotary:                                       

CONTEXT SAVE                                  
INC displaymode                               ;Displaymode 0 = temp weergave
IF displaymode >=2 THEN displaymode = 2       ;Displaymode 1-2 = thermostaat instellen
IF displaymode >1 THEN INC therm              ;Displaymode 3 = alarm weergave
IF therm >= 26 THEN therm = 10                ;stelt maximum thermostaat temp in, max=-1 dus 25
INTF = 0
CONTEXT RESTORE
;---------------------------------------------
over_Rotary:

GIE=0
INTE=1
GIE=1
;---------------------------------------------

HOOFDPROGRAMMA

Het ongewenste gedrag gebeurd soms als het relais bediend wordt maar ook weleens door andere apparaten die in de buurt staan. Altijd komt het programma dan in het menu dat alleen door INT geactiveerd wordt. Op alle andere ingangen gebeuren geen rare dingen.

Arco

Special Member

Waarom RB0/RC1 met een pull-down naar Gnd? Wat voor output heeft die rotary encoder dan?
En waarom 2 inputs aan elkaar? Je kunt RC1 toch gewoon weglaten en alleen RB0 gebruiken?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

RB0/RC1 liggen met een pull-down aan ground om de ingangen niet zwevend te krijgen. Als de rotary bediend wordt komt er 5V uit.

RC1 zou ik weg kunnen halen maar dit is een "erfenis" uit het bestaande ontwerp, dan moet ik het print lijntje weg krabben. Maar kan hierdoor het gedrag verklaart worden?

Arco

Special Member

Als RC1 als input staat en verder niet wordt gebruikt, zou dat geen invloed mogen hebben.
Is 1K pull-down niet te zwaar voor de encoder? Als die een push-pull output heeft, is de weerstand overbodig. (er kan dan nooit wat gaan zweven)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 17 november 2013 13:17:43 schreef Arco:
Waarom RB0/RC1 met een pull-down naar Gnd? Wat voor output heeft die rotary encoder dan?
En waarom 2 inputs aan elkaar? Je kunt RC1 toch gewoon weglaten en alleen RB0 gebruiken?

@Bukkum;
wat Arco opviel zal meerdere mensen zijn opgevallen en geeft vraag tekens. Je weet wel deze >?< ;-)
Dit is misschien het moment om het schema te laten zien.
En de complete code. Ik zie n.l. dat je twee keer Rotary: als label hebt.

Print ziet er netjes opgebouwd uit.

Op 17 november 2013 16:06:19 schreef Lord Anubis:
@Bukkum;
wat Arco opviel zal meerdere mensen zijn opgevallen en geeft vraag tekens. Je weet wel deze >?< ;-)

Wat bedoel je, wat viel Arco op?

Hier het schema:
http://farm3.staticflickr.com/2870/10908852545_e82ee5c4a9.jpg
Rotary encoder zit aan "S+", B0/C0 en C1

Dingen die gewijzigd zijn t.o.v. schema:
MCLR is aangesloten op 4k7 welke aan 5V zit
B0 is verbonden aan C0,dus niet aan C1 zoals ik eerder vermelde.

Code zal ik later plaatsten, deze staat op een andere pc.

Arco

Special Member

Sommige dingen, zoals de pull-down zijn nogal eigenaardig. Een rotary encoder is push-pull of open drain, maar met een pull-down heb ik ze nog niet gezien.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 17 november 2013 20:19:43 schreef Arco:
Een rotary encoder is push-pull of open drain, maar met een pull-down heb ik ze nog niet gezien.

De Rotary encoder die ik gebruik is afkomstig van Voti en heeft een quadrature output. Daarom begrijp ik niet waarom je naar een push-pull of open drain verwijst. Of bedoel je met de open drain dat ik gebruik had moeten maken van pull-up?

Ik zie nu dat het gebruikelijk is om de ingang van de PIC hoog te houden met een pull-up weerstand van 10K en alles naar ground te trekken op het moment je de rotary bediend. Dus eigenlijk precies omgekeerd wat ik gedaan heb. Maar maakt dit uit? De fase verschuiving van de pulsjes blijft gelijk dus dat zou dan toch moeten werken?

Hier nog de volledige code:

pic basic code:

DEVICE = 16F73
CONFIG HS_OSC, WDT_OFF, PWRTE_ON, BODEN_OFF, CP_OFF

DECLARE XTAL 20
;===========================
        ;76543210
PORTA = %00000000                             ;Alle uitgangen laag
PORTB = %00000000                             ;Alle uitgangen laag
PORTC = %00000000                             ;Alle uitgangen laag
TRISA = %00000111                             ;A0-A3 zijn ingangen (analoog, zie ADCON1)
TRISB = %00000001                             ;B wordt alleen gebruikt voor LCD & Interrupt B0
TRISC = %00001111                             ;C0-3 switch ingang, C6 LED, C5 Buzzer, C4 Relais
ADCON1= %00000000                             ;adc instellen op de goede poorten, RTFM
ADIN_RES = 8                                  ;ADC resolutie
ADIN_TAD = FRC                                ;Clock voor de adc extern / intern
ADIN_STIME = 50                               ;Conversie tijd
;============================
DIM raw0 AS DWORD 
DIM temp0 AS DWORD
DIM raw1 AS DWORD 
DIM temp1 AS DWORD
DIM raw2 AS WORD
DIM temp2 AS WORD
DIM therm AS BYTE
DIM displaymode AS BYTE
DIM pompmode AS BYTE
DIM delay AS BYTE
DIM delayteller AS WORD
DIM plotteller AS WORD
DIM alarm AS BIT
;============================
SYMBOL links = PORTC.1                        ;input  draai encoder linker contact
SYMBOL rechts = PORTB.0                       ;input  draai encoder rechter contact
SYMBOL ok = PORTC.2                           ;input  draai encoder indruk switch
SYMBOL rood = PORTC.3                         ;input  switch rood
SYMBOL led = PORTC.6                          ;output led
SYMBOL relais = PORTC.4                       ;output relais
;============================
On_interrupt Rotary
SYMBOL INTF = INTCON.1                        ;RB0 External Interrupt Flag
SYMBOL INTE = INTCON.4                        ;RB0 External Interrupt Enable
SYMBOL GIE = INTCON.7                         ;Global Interrupt Enable
;============================
CLEAR                                         ;wissen geheugen
therm = 10                                    ;stelt minimum thermostaat temp in
DELAYMS 500                                   ;stabilisatie
CLS                                           ;wis scherm
GOTO over_Rotary:
;=============================               
Rotary:                                       

CONTEXT SAVE                                  
INC displaymode                               ;Displaymode 0 = temp weergave
IF displaymode >=2 THEN displaymode = 2       ;Displaymode 1-2 = thermostaat instellen
IF displaymode >1 THEN INC therm              ;Displaymode 3 = alarm weergave
IF therm >= 26 THEN therm = 10                ;stelt maximum thermostaat temp in, max=-1 dus 25
INTF = 0
CONTEXT RESTORE
;---------------------------------------------
over_Rotary:

GIE=0
INTE=1
GIE=1
;---------------------------------------------
WHILE 1=1

Measure:

raw0 = ADIN 0
temp0 = (raw0*1000)/6375

raw1 = ADIN 1
temp1 = (raw1*10000)/31875
temp1 = temp1+10                              ;+10 i.v.m. range vanaf 10

raw2 = ADIN 2
temp2 = (raw2*100)/425 
temp2 = temp2+10                              ;+10 i.v.m. range vanaf 10
;---------------------------------------------
Schakel:

;;;;;;;;;;;;;;Alarm regeling;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IF temp2 >= 55 THEN  alarm = 1                ;Alarm setpoint
IF alarm = 1 THEN relais = 0                  ;Bij alarm altijd relais uit!
;;;;;;;;;;;;;;Pompmode selector;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IF rood = 1 THEN                              ;Pompmode selector met rode knop
  DELAYMS 4                                   ;Wacht op dender is afgelopen, minstens 4ms!
  WHILE rood = 1 : WEND                       ;Wacht zolang rode knop bediend wordt
  DELAYMS 4                                   ;Wacht op dender is afgelopen, minstens 4ms!
  INC pompmode
ENDIF
IF pompmode >2 THEN pompmode = 0              ;Maakt een loop van pompmode 2 naar pompmode 0
;;;;;;;Schakelcode voor pompmode MANUAL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IF pompmode = 0 THEN                          ;Pompmode 0 = Manual pomp uit
  relais = 0
  led = 0
ENDIF
IF pompmode = 2 AND alarm = 0 THEN            ;Pompmode 2 = Manual pomp aan
  relais = 1
  led = 1
ENDIF
;;;;;;;;Schakelcode voor pompmode AUTO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IF pompmode = 1 AND alarm = 0 THEN
  IF temp0 < therm AND temp1 >= temp0 +10 THEN
    relais = 1
    led = 1
  ENDIF
ENDIF

IF pompmode = 1 AND temp2 <55 AND delay = 2 THEN  ;alleen uitschakelen indien delay 2 is.
  IF temp0 >= therm OR temp1 - 10 < temp0 THEN
    relais = 0
    led = 0
    delayteller = 0
    delay = 0
  ENDIF
ENDIF

;;;;;;;;Hystereseloop instelling, alleen voor automode;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IF relais = 1  AND pompmode = 1 AND delay = 0 THEN delay = 1
IF delay = 1 THEN INC delayteller
IF delay = 1 THEN DELAYMS 1                   ;stelt delaytijd in
IF delayteller >= 50 THEN delay = 2  
IF delayteller >= 50 THEN delayteller = 0    
;---------------------------------------------
Display:

CLS

WHILE alarm = 1
  PRINT AT 1,1, "ALARM VLOERTEMP HOOG"
  PRINT AT 2,1, "Reset: druk de rode "
  PRINT AT 3,1, "       en draaiknop "
  PRINT AT 4,1, "       tegelijk in. "
  DELAYMS 250                                 ;Eigen plotdelay voor alarmmelding omdat de normale delay beeindig wordt door alarm
  TOGGLE led
      WHILE ok = 1 AND rood = 1 AND alarm = 1
      DELAYMS 3000
      CLS
      alarm = 0
      WEND
WEND

IF displaymode = 0 THEN
  PRINT AT 1,1, "Bijkeuken", AT 1,17, DEC2 temp0, %11011111, "C" ;zie picbasic deel 4 voor plotten komma getallen
  PRINT AT 2,1, "CV aanvoer", AT 2,17, DEC2 temp1, %11011111, "C" ;zie picbasic deel 4 voor plotten komma getallen
  PRINT AT 3,1, "Vloer aanvoer", AT 3,17, DEC2 temp2, %11011111, "C" ;zie picbasic deel 4 voor plotten komma getallen
ENDIF  

IF displaymode = 1 OR displaymode = 2 THEN
  PRINT AT 2,1, "Gewenste temperatuur"
  PRINT AT 3,1, "voor bijkeuken: ", DEC therm, %11011111, "C"
ENDIF

IF pompmode = 0 AND displaymode = 0 THEN PRINT AT 4,1,                              "Manual:     POMP UIT"
IF pompmode = 1 AND displaymode = 0 AND delay = 1 AND relais = 1 THEN PRINT AT 4,1, "Auto:  HYSTERESE LUS"
IF pompmode = 1 AND displaymode = 0 AND delay = 2 AND relais = 1 THEN PRINT AT 4,1, "Auto:       POMP AAN"
IF pompmode = 1 AND displaymode = 0 AND relais = 0 THEN PRINT AT 4,1,               "Auto:       POMP UIT"
IF pompmode = 2 AND displaymode = 0 THEN PRINT AT 4,1,                              "Manual:     POMP AAN"
;;;;;;;;;;;;;;Plotdelay met onderbreking indien nodig;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WHILE  plotteller <= 3000                     ;Plottijd wordt hier ingesteld door een delay loop, 3000 x 1ms = 3 sec
  IF alarm = 1 THEN BREAK                     ;Om knipperen van scherm tegen te gaan een delay van 3 sec
  IF rood = 1 THEN BREAK                      ;Bij inschakelen van Switch of Alarm (hoge temp2)ga je uit de plotloop
  IF ok = 1 AND displaymode >= 1 THEN         ;Bij Switch ok bediening direct terug naar displaymode 0 zonder plotloop af te wachten
    displaymode = 0              
    GOTO Display
  ENDIF
  IF rechts = 1 THEN BREAK
  DELAYMS 1                                   
  INC plotteller
WEND
IF plotteller >= 3000 THEN plotteller = 0     ;Plotteler resetten naar 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

WEND                                          ;Einde programma loop

Ik zie nu dat het gebruikelijk is om de ingang van de PIC hoog te houden met een pull-up weerstand van 10K en alles naar ground te trekken op het moment je de rotary bediend. Dus eigenlijk precies omgekeerd wat ik gedaan heb. Maar maakt dit uit? De fase verschuiving van de pulsjes blijft gelijk dus dat zou dan toch moeten werken?

Arco

Special Member

Aangezien we nog steeds niet weten wat voor uitgangen die rotary encoder heeft, valt er nog niet veel over te zeggen...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com