picbasic commando's

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

Kan iemand mij zeggen waar ik een lijst kan vinden met alle, maar dan ook alle, PICBasic commando's. ook die verband houden met de rotary interrupts.

Alvast bedankt

http://www.cs.wvu.edu/classes/cpe112/presentations/PDF/PIC_Part5_inter…
Iets voorbij halverwege.

dit is alles wat ik hier heb onder mijn interrupt picBasic verzameling. Eerlijkheid halve, zelf heb ik eigenlijk nog nooit met PicBasic geprogrammeerd. Ik doe het met JAL.

HTH

Wat dacht je van de handleiding die bij PicBasic zit?
Wat zijn rotary interrupts? Daar heb ik nog nooit van gehoord.

[Bericht gewijzigd door hadv op donderdag 2 februari 2012 13:52:57 (38%)

Just find out what you like and let it kill you
Arco

Special Member

Ik denk dat in de PicBasic manual alle commando's wel staan beschreven.
Zaken als rotary encoder zijn geen comando's maar library functies.

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

oke,
De volledige picbasic commando's uit de MiniPICbasic cursus die ken ik wel.
De link van Lord Anubis komt dicht in buurt, maar onvolledig en voor mij nog onvoldoende duidelijk
Misschien helpt onderstaande programma mijn vraag te verduidelijken, de vet gedrukte omschrijvingen mij onbekend:

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[/quote]

[Bericht gewijzigd door Henry S. op donderdag 2 februari 2012 20:40:14 (5%)

Tsja, je mist blijkbaar de kennis die je via de datasheet moet opdiepen.
Ten eerste: weet je wat interrupts zijn en hoe die werken?
Ten tweede: weet je het verschil tussen variabelen in je programma en Special Function Registers in de PIC?

Context Restore staat toch echt in de handleiding.
Context Save is voor een 16F niet nodig, die wordt door de compiler gegenereerd. Maar het is wel belangrijk om te snappen waar eea voor dient.

INTCON is een Special Function Register (SFR) dat instellingen voor de interrupts bevat.
Zoek eerst eens in de datasheet van je PIC uit hoe interrupts werken en wat de bijbehorende SFR's zijn.
Zoek dan in de handleiding van Proton uit hoe je met een 16F interrupts kunt gebruiken en hoe je dat moet programmeren.

Just find out what you like and let it kill you

Een juiste analye hadv,

Maar aan de hand van dt programma wil ik nu juist gaan uitpluizen hoe die interrupts nu precies werken.

Jij hebt mij zojuist een handvat gegeven om achter de werking van interrups te komen, hiervoor mijn dank.

Bert!ne,

Hulp is natuurlijk altijd prima, maar manuals van 7 resp 10 jaar oud...

Als TS een licentie heeft, of de lite versie, dan heeft hij ook de bijbehorende documentatie.

@marconist: prima idee, uitzoeken en lekker proberen. Let op, interrupts zijn niet direct het simpelste qua programmeren, maar Proton ondersteunt het prima.
Als het dan niet lukt kun je altijd vragen stellen. Kijk ook eens op het Proton forum op de Crownhill site.
Advies: begin met 1 interrupt, persoonlijk vind ik de Timer0 de makkelijkste.

Just find out what you like and let it kill you

In de datasheet van de desbetreffende PIC staat hoe hij met bepaalde interrupts omgaat. Je kunt bepaalde interrupts activeren of deactiveren door bits in het interrupt register te setten of resetten. Het interrupt register heet bij je voorbeeld INTCON, naam voor INTerrupt CONtrol register. Het staat bij de PIC uitgelegd in de datasheet onder special features.

globale werking van een interrupt:

1. Interruptvoorwaarde doet zich voor.
2. Interrupt flagbit wordt geset.
3. Interrupt service routine wordt aangeroepen.
4. Global interrupt disablen.
5. Code in interrupt service routine wordt uitgevoerd.
6. Interrupt flagbit resetten
7. Global interrupts enablen
7. Terug naar normale code.

Don't build anything you can't take apart

Wat bedoel je met 'Global interrupt flagbit' in stap 3?
Toch niet INTCON.GIE mag ik hopen, die moet namelijk altijd op 1 staan anders werken interrupts niet.
Dus INTCON.GIE zeker niet op 0 zetten in stap 6, want dan komt er geen enkele interrupt meer.

Oftewel:
stap 1: INTCON.GIE = 1
afhankelijk van de interrupt die je wilt opvangen uitzoeken welke 'enable' bits er op 1 moeten staan. Er zitten er een paar in INTCON, maar je hebt ook nog PIE1 (en in andere PIC's nog meer).
stap 2: de gewenste enable bits op 1 zetten (de naam is vrijwel altijd xxxIE).
vervolgens de 'main loop' van je programma aanroepen
als de interruptvoorwaarde zich voor doet wordt de interruptservice routine (ISR) wordt aangeroepen

In de ISR:
stap 1: test welke interrupt flag aan staat (xxxIF in INTCON of PIRx). Op zich is dit alleen nodig als je meerdere interrupts actief hebt.
stap 2: voer de noodzakelijke instructies uit
stap 3: zet de interrupt flag op 0
stap 4: Context Restore
het programma gaat terug naar waar het was gebleven

De PIC zorgt er zelf voor dat tijdens het uitvoeren van de ISR nieuwe interrupts even niet worden uitgevoerd. Het kan dus zomaar zijn dat direct na het teruggaan na stap 4 er weer een interrupt 'klaar staat'.

Algemeen advies voor een ISR: houd ze zo kort (in termen van klokcycly) mogelijk.

Just find out what you like and let it kill you

Met alle antwoorden die ik gekregen heb, ben ik intussen al een klein stukje op weg met het toepassen van interrupts.
Dank hiervoor allemaal!