met PIC via triac en met Hall sensor AC motortoeren regelen.

Op 29 oktober 2019 14:31:35 schreef Arco:
[...]
Post die code dan...

START:

WAARDE = ADIn 0

TRIGGER = 0

If WAARDE < 1023 Then
GoSub RUN
EndIf
GoTo START

;---------------------------------------------------
; INLEZEN POTMETER OP ANALOGE INGANG NUL.
; WAARDE VERGELIJKEN EN NAAR START LUS GAAN.
; WAARDE VERMENIGVULDIGEN MET ACHT.
; NULDETECTIE PULS LEZEN EN TRIGGER PULS UITSTUREN.
;---------------------------------------------------

RUN:

WAARDE = ADIn 0

If WAARDE > 1022 Then
Return
EndIf

WAARDE = WAARDE * 8

If PULS_IN = 1 Then
TRIGGER = 0
DelayMS 1
DelayUS WAARDE
TRIGGER = 1
EndIf
GoTo RUN

End

Met dank aan Lambiek,
https://www.circuitsonline.net/artikelen/view/53/8

Dat is een kopie van Lambieks code, niet wat je erboven vermeldde over die 2de potentiometer die de tacho moest voorstellen.

edit: hier een mooie PDF waar ook interrupts worden behandeld in picbasic

http://www.tech-software.net/temp/fifteen.pdf

[Bericht gewijzigd door MGP op dinsdag 29 oktober 2019 19:02:26 (34%)

LDmicro user.
Lambiek

Special Member

Op 29 oktober 2019 13:43:17 schreef stortbak:
blijkbaar is het te moeilijk om even wat programmaregels uit hun mauw te schudden, met moeilijke termen strooien is het enige dat ik hier zie.
Alleen heeft het groentje daar niets aan.

Als je je zo opstelt zal je niet veel steun krijgen vrees ik. Wist je maar een tiende van wat SparkyGSX weet. :)

En MGP is ook iemand uit het veld, die weet ook waar hij het over heeft. Net als zo velen hier. :)

En dat stukje code van mij komt uit een artikel wat ik geschreven heb, dat is om op een simpele manier te laten zien hoe het werkt met zo weinig mogelijk code. Als je de controller meer wil laten doen zal je het aan moeten passen naar wat voor jou bruikbaar is, niet meer en niet minder. :)

Hier een voorbeeld hoe je verschillende timers maakt, die draaien allemaal op de achtergrond. Al wil je er honderd maken. Helemaal in Jip en Janneke taal, wat wil je nog meer. Dit is één methode, je kunt ook de hardware timers gebruiken. De keuze is aan jou.

pic basic code:


Device 16F887                          ; Processor type

On_Interrupt TIMER                     ; Interrupt timer

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

Declare LCD_RSPin PORTD.2              ; Reset display poort D.2
Declare LCD_ENPin PORTD.3              ; Enable display poort D.3
Declare LCD_DTPin PORTD.4              ; Data display poort D.4 t/m D.7

Dim PULS As Bit                        ; Puls voor TMR_1, 2, 3

Dim TMR_1 As Word                      ; Variabele timer 1
Dim TMR_2 As Word                      ; Variabele timer 2
Dim TMR_3 As Word                      ; Variabele timer 3

Dim VAL_TIMER As  Word                 ; Variabele waarde timer
Dim LIMITE_TIMER As Word               ; Variabele limite
                                
GIE = 0                                ; Zet interrupt uit
                                  
GoTo INSTELLING                        ; Ga naar instelling

TIMER:                                 ; Timer interrupt
    Context Save                       ; Save   
    Inc VAL_TIMER                      ; Increment waarde timer
    T0IF = 0                           ; Wis interrupt flag
    Context Restore                    ; 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
                               
    VAL_TIMER = 0                      ; Variabele waarde timer is 0
                                                   
    TMR0 = 0                           ; Reset TIMER0
    T0IE = 1                           ; TIMER0 Interrupt enabel aan
    GIE  = 1                           ; Zet Interrupt aan
    
Cls                                    ; Wis display
                                       
DelayMS 500                            ; Wacht 0.5 sec

Clear                                  ; Wis geheugen 

         ;543210                       ; Hulpregel poort A
PORTA  = %000000                       ; Maak poort A laag
TRISA  = %111111                       ; 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

         ;543210                       ; Hulpregel analoog poort_B
ANSELH = %000000                       ; ANSEL register analoog poort_B

TMR_1 = 0                              ; Zet timer 1 op 0
TMR_2 = 0                              ; Zet timer 2 op 0
TMR_3 = 0                              ; Zet timer 3 op 0

;---------------------------------
; VOORBEELD ON_INTERRUPT TIMER_0.
;---------------------------------

RUN:                                   ; Begin programma
    LIMITE_TIMER = 38                  ; INT(2500000 /(256*256)) puls is 1sec
    
    If VAL_TIMER > LIMITE_TIMER Then   ; Waarde timer groter dan limite timer
     VAL_TIMER = 0                     ; Waarde timer is nul
      If VAL_TIMER = 0 Then            ; Als waarde timer is nul                                                     
       PULS = 1                        ; Timer puls is één
      EndIf                            ; Einde als 
    EndIf                              ; Einde als
    
    If PULS = 1 Then                   ; Als puls is één dan
     TMR_1 = TMR_1 + 1                 ; Hoog timer_1 op
      If TMR_1 > 60 Then               ; Als timer_1 is groter als 60 dan
       GoTo WIS_DISPLAY                ; Ga naar wis display
      EndIf                            ; Einde als
    EndIf                              ; Einde als
    
    If PULS = 1 Then                   ; Als PULS is één dan
     TMR_2 = TMR_2 + 1                 ; Hoog timer_2 op
      If TMR_2 > 20 Then               ; Als timer_2 is groter dan 20 dan
       TMR_2 = TMR_2 - 1               ; Zet timer_2 vast
      EndIf                            ; Einde als
    EndIf                              ; Einde als
    
    If PULS = 1 Then                   ; Als PULS is één dan
     TMR_3 = TMR_3 + 1                 ; Hoog timer_3 op
      If TMR_3 > 30 Then               ; Als timer_3 is groter dan 30 dan
       TMR_3 = TMR_3 - 1               ; Zet timer_3 vast
      EndIf                            ; Einde als
    EndIf                              ; Einde als
    
    Print At 1,1,"TMR1="               ; Zet text op dislpay
    Print At 1,9,"TMR2="               ; Zet text op dislpay
    Print At 2,1,"TMR3="               ; Zet text op dislpay
    
    Print At 1,6,Dec TMR_1,            ; Zet waarde timer_1 op display
    Print At 1,14,Dec TMR_2,           ; Zet waarde timer_2 op display
    Print At 2,6,Dec TMR_3,            ; Zet waarde timer_3 op display
    
    PULS = 0                           ; Zet puls op 0
GoTo RUN                               ; Naar begin proramma
    
WIS_DISPLAY:                           ; Loop wis display
    TMR_1 = 0                          ; Zet timer_1 op nul
    TMR_2 = 0                          ; Zet timer_2 op nul
    TMR_3 = 0                          ; Zet timer_3 op nul
                                       
    Cls                                ; Wis display
    DelayMS 1000                       ; Pauze 1 sec
GoTo RUN                               ; Naar begin programma
                                  
End                                    ; Einde programma   
Als je haar maar goed zit, GROETEN LAMBIEK.

van de pic basic site maar eens gaan kijken hoe een en ander werkt

pic basic code:


DEVICE 16F628A                ;Gebruik een 16F628A (of 16F648A) type
CONFIG INTRC_OSC_NOCLKOUT,_   ;INTerne RC OSCillator van de PIC gebruiken
       WDT_OFF,_              ;Watch Dog Timer uitgeschakeld
       PWRTE_ON,_             ;PoWeR up Timer Enable ingeschakeld
       BODEN_OFF,_            ;Brown Out Detection ENable uitgeschakeld (minder stroomopname)
       LVP_OFF,_              ;Low Voltage Programming uitgeschakeld
       MCLRE_OFF              ;Master CLeaR Enable uitgeschakeld (resetpin PORTA.5 op OFF)
ALL_DIGITAL TRUE              ;Alle ingangen digitaal (voor de toetsen)

;Logische constanten
SYMBOL OFF          = 0       ;UIT 
SYMBOL ON           = 1       ;AAN 

;Registernamen (zie voor info hierover de datasheet van de 16F628A, kijk bij INTCON)
SYMBOL RBIF         = INTCON.0;Bit 0 van INTerrupt CONtrol register heet: RB Interrupt Flag
SYMBOL RBIE         = INTCON.3;Bit 3 van INTCON register heet: RB change Interrupt Enable
SYMBOL GIE          = INTCON.7;Bit 7 van INTCON register heet: Global Interrupt Enable

;Poortnamen
SYMBOL LED          = PORTA.1 ;Controlesignaal, continu HOOG zolang PIC actief is 
SYMBOL WordtWakker1 = PORTB.4 ;Ingang die de PIC wekt door Interrupt On Change 
SYMBOL WordtWakker2 = PORTB.5 ;Ingang die de PIC wekt door Interrupt On Change 
SYMBOL WordtWakker3 = PORTB.6 ;Ingang die de PIC wekt door Interrupt On Change 
SYMBOL WordtWakker4 = PORTB.7 ;Ingang die de PIC wekt door Interrupt On Change 

;Variabele declareren
DIM BD1             AS BYTE   ;Byte Dummy 1

;         76543210
PORTA  = %00000000            ;Alle uitgangen PORTA bij opstart een laag niveau
TRISA  = %11111101            ;PORTA.1 is uitgang voor LED
GIE    = 0                    ;Global Interrupt Enable uitschakelen(!)
RBIE   = 1                    ;Register portB change Interrupt Enable inschakelen
 
PORTB_PULLUPS ON              ;Pullup weerstanden actief (voor schakelaars en open pinnen)
CLEAR                         ;Wis alle RAM geheugen 


;Hoofdprogramma
FOR BD1 = 1 TO 3              ;LED aan-uit-aan (controle LED dat PIC vanaf begin start)
  LED = ~LED                  ;Toggle de LED
  DELAYMS 300                 ;Knippersnelheid van de LED
NEXT

WHILE 1 = 1                   ;Oneindige lus 
  LED  = OFF                  ;LED uitzetten (controle dat PIC slaapt)
  BD1  = PORTB                ;Lees "This wil end the mismatch condition" in de datasheet
  RBIF = 0                    ;Dit bit moet steeds door het programma zelf op 0 worden gezet
  SLEEP                       ;Breng de PIC in low power mode (PIC laten slapen)
  LED  = ON                   ;LED aanzetten (controle dat PIC wakker is)

  DELAYMS 2000                ;PIC zal 2 seconden wakker zijn, daarna via WEND weer slapen
WEND                          ;Terug naar WHILE waar de PIC weer in slaap wordt gebracht[/code=picbasic]

het programma op zich werkt reeds niet 
on en off zijn protected key words 
deze dan maar omgezet in 0 en 1 
nu dit gedaan was compilde het programma wel 
dus hoera 

dan in real pic simulator alles opgezet en ?????
niet echt een succes de processor gaat niet in sleep en de led flikkert als zot 
dan in deze regels
 For BD1 = 1 To 3              ;LED aan-uit-aan (controle LED dat PIC vanaf begin start)
  LED = ~LED                  ;Toggle de LED
  DelayMS 300                 ;Knippersnelheid van de LED
Next

de delayms op 1000 gezet en ??? de led flikkert nog even snel
dus in jip en janneke taal werken met die interrupts is niet zo maar efkes iets wat je doet als je er nog nooit mee gewerkt hebt 
nu eens gaan kijken hoe en waar de fout in het programma zit 
want nu is dit dus niet werk baar zoals het er nu staat 

gr raf
Gr Raf
Arco

Special Member

Ik denk niet dat TS hier veel aan heeft...
(het werkt niet, en als het werkt doet 't iets heel anders als TS wil...)

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

ik denk dat de TS er wel iets aan heeft
want zowel de TS als ik willen die functies doorgronden
zeg maar onder de knie krijgen en waarmee kan dat het eenvoudigste dan met dit programma door een led te laten knipperen

aan uw bijdrage daar heeft de TS nu eens geen bal aan zie .want eigenlijk is het alleen maar topic vervuiling in mijn ogen

Gr Raf
Arco

Special Member

...want eigenlijk is het alleen maar topic vervuiling in mijn ogen

Het plaatsen van niet relevante en ook nog niet werkende code zeker niet?... ;)
(maak het dan tenminste werkend: hier heeft TS niks aan, TS leert hier ook niks van)

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

In de handleiding staat een veel mooier en begrijpelijker voorbeeld, zie 'On_Hardware_Interrupt'.
Bij mij op blz 307 maar ik heb niet de laatste versie.

Maar eerst moet je begrijpen wat interrupts eigenlijk zijn, los van het soort programmeertaal.

LDmicro user.

sorry maar die code is niet door mij geschreven en dus ga ik die buiten de 0 en de 1 ook niet aanpassen .de schrijver van deze site https://www.picbasic.nl/index.htm heeft tenminste moeite gedaan om een en ander duidelijk te maken .dat het programma niet werkt kan afhangen van de proton versie die ik heb

@MPG
inderdaad de ts en ik willen dus inderdaad die interupts onder de knie krijgen want zo te zien kun je er (eenvoudig)zaken mee oplossen die dan geen processor tijd kosten .ik heb nu oplossingen die wel tijd kosten maar het werkt wel .

en zo te zien is het niet of ;of of maar is het en ;en ;en want zonder het een werkt het ander ook niet
in de proton handleiding vind ik e rook weinig over terug maar je die is zo enorm groot en zoeken is niet evident .
nu naar de club nog wat modules gaan inbouwen en morgen eens naar die interrupts gaan kijken
maar stortbak zal jullie nog wel bezig houden denk ik volgens zijn facebook

Gr Raf
Arco

Special Member

Het voorbeeld gebruikt geen interrupts, die staan uit...
Het demonstreert alleen (mocht het gaan werken) hoe de processor in slaap valt en weer wakker wordt bij een externe gebeurtenis...

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

Wat gezellig hier, met weer een hoop waardevolle opmerkingen. |:(

De code van Lambiek werkt eindelijk.

Lambiek, bedankt voor de genomen moeite, je bent hier de enige die serieus wat doet voor iemand met een vraag. Als info over de "timer" is dit waardevol.

Mijn bevindingen:
ON_INTERRUPT TIMER
zou volgens pic basic helemaal niet werken, voor TIMER zou GOTO moeten.
verder zou ON_ gekoppeld zijn aan een hardware interrupt
en een ON aan een software interrupt.
Lekker wazig dus.
Gezien hier met een GIE (software) gewerkt wordt en ON_ wel werkt, wordt dat niet duidelijk.

Heb wel gezien dat je bij deze timer de snelheid kan ingeven.
Voorlopig het enige voordeel boven het werken met een variabele die je telkens +1 doet en dan bij een waarde wat laat starten, waarna je de "teller" reset.
(edit: tmr wordt bij een lang programma net zo veel trager dan var = var + 1, dus weer een voordeel minder)
Het "voordeel" van die interrupt boven IF dit of dat THEN... zie ik nog steeds niet.
Misschien komt dat nog

Wat ik mis, is een regel met kijk naar de ingang die en die, want het moet tenslotte werken gaan op de nuldoorgangdetectie.
Zelf proberen dus.
Ik zie in de code van raf al iets over RBIE, maar dan zou ik per pic maar 1 ingang kunnen aanmelden voor de interrupt? Gelukkig hier niet een probleem want er komt maar 1 nuldoorgang.
(edit, geen RBIE maar INT waarschijnlijk , wanneer je 1 enkele ingang wilt gebruiken)
MGP ik zal je pdf doorkijken.

Verder valt het me op dat, nu ik de code geplaatst heb, er toch geen antwoord komt. Typisch!
Lijkt dus gewoon op wat ik al eerder ondervonden heb: bezighouden zodat je nooit hoeft te antwoorden.

Fijne dag verder.
Vandaag nog wat buiten doen, volgende week regentijd, dus tijd genoeg om weer binnen te blijven.

Op 30 oktober 2019 12:43:52 schreef stortbak:
Verder valt het me op dat, nu ik de code geplaatst heb, er toch geen antwoord komt. Typisch!
Lijkt dus gewoon op wat ik al eerder ondervonden heb: bezighouden zodat je nooit hoeft te antwoorden.

Fijne dag verder.

Je hebt gewoon een copy paste gedaan, geen enkel letter is van u, ofwel heb je de verkeerde file gepost.

Zal ik u eens iets vertellen, de dag dat je uw topic geplaatst hebt, heb ik zo'n programma gemaakt in LDmicro en dan nog met PI(d) control.
Het werkte toen al in de simulator maar heb het vertikt om een opstelling te maken wegens uw houding hier op CO.

Ook nog een fijne dag verder, ga nu ook nog wat buiten spelen met de metalen ballekes.

LDmicro user.
Arco

Special Member

Inderdaad, alleen een 'geleend' stukje code wat ook nog eens iets anders doet... ;)

Wat betreft nuldoorgangen een hint: daar gebruik je de comparator (met zijn interrupt) voor...
Soft/hardware interrupt heeft niets met het soort interrupt te maken, maar de manier waarop de compiler ermee om gaat.
(hardware is de eigen interrupt van de pic, software is een bouwsel van de compiler zelf)

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

Op 30 oktober 2019 13:19:32 schreef Arco:

Soft/hardware interrupt heeft niets met het soort interrupt te maken, maar de manier waarop de compiler ermee om gaat.
(hardware is de eigen interrupt van de pic, software is een bouwsel van de compiler zelf)

Kan je dat uitleggen?
Hoe krijg ik dan dat wanneer ik op "een" ingang van laag naar hoog ga die pic zover krijg dat hij dan (in het voorbeeld van Lambiek) hetzelfde doet als wat nu gie automatisch doet?

Want je zal toch echt ergens moeten aangeven dat die ingang iets anders is dan een normale ingang, waar alleen naar gekeken wordt als de programma doorloop op het punt is dat er gelezen wordt "if ingang...then...".

Arco

Special Member

Als je een hardware interruptprocedure hebt en de GIE, PEIE en RBIE bits aanzet, krijg je bij iedere verandering op portb4...7 een interrupt.

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

Op 30 oktober 2019 17:53:19 schreef Arco:
krijg je bij iedere verandering op portb4...7 een interrupt.

En?

ik heb maar 1 ingang waar naar gekeken moet worden geen 4

Arco

Special Member

Dan negeer je die gewoon. (of je gebruikt de RBO interrupt pin, da's wel een enkele...)
Zoals gezegd, voor nuldoorgang gebruik je normaal gesproken de comparator...

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

Op 30 oktober 2019 18:20:10 schreef Arco:
of je gebruikt de RBO interrupt pin, da's wel een enkele...)

Dat schreef ik zelf al.
""Ik zie in de code van raf al iets over RBIE, maar dan zou ik per pic maar 1 ingang kunnen aanmelden voor de interrupt?
(edit, geen RBIE maar INT waarschijnlijk , wanneer je 1 enkele ingang wilt gebruiken)""

de comparator...

ja en?
Dat is toch gewoon een dure naam voor kijk naar de ingang of die hoog of laag is?

Blijft over:
""Wat ik mis, is een regel met kijk naar de ingang die en die, want het moet tenslotte werken gaan op de nuldoorgangdetectie."""

Waar en hoe moet in onderstaande code nu de oplossing om die timer te starten als ingang "nuldoorgang" hoog wordt?
(opmerking , wel zo dat dit programma niet alleen draait maar onderdeel wordt van nog heel veel meer programma)

pic basic code:


Device 16F887                          ; Processor type

On_Interrupt TIMER                     ; Interrupt timer

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

Declare LCD_RSPin PORTD.2              ; Reset display poort D.2
Declare LCD_ENPin PORTD.3              ; Enable display poort D.3
Declare LCD_DTPin PORTD.4              ; Data display poort D.4 t/m D.7

Dim PULS As Bit                        ; Puls voor TMR_1

Dim TMR_1 As Word                      ; Variabele timer 1


Dim VAL_TIMER As  Word                 ; Variabele waarde timer
Dim LIMITE_TIMER As Word               ; Variabele limite
                                
GIE = 0                                ; Zet interrupt uit
                                  
GoTo INSTELLING                        ; Ga naar instelling

TIMER:                                 ; Timer interrupt
    Context Save                       ; Save   
    Inc VAL_TIMER                      ; Increment waarde timer
    T0IF = 0                           ; Wis interrupt flag
    Context Restore                    ; Restore
    
INSTELLING:                            ; Instelling register
    PS0  = 0                           ; Prescaler bit_0        0 want het gaat over micro seconden
    PS1  = 0                           ; Prescaler bit_1
    PS2  = 0                           ; Prescaler bit_2
    PSA  = 0                           ; Prescaler toegewezen aan TIMER0
    T0SE = 0                           ; Trigger van laag naar hoog
    T0CS = 0                           ; Trigger door interne clock
                               
    VAL_TIMER = 0                      ; Variabele waarde timer is 0
                                                   
    TMR0 = 0                           ; Reset TIMER0
    T0IE = 1                           ; TIMER0 Interrupt enabel aan
    GIE  = 1                           ; Zet Interrupt aan
    
Cls                                    ; Wis display
                                       
DelayMS 500                            ; Wacht 0.5 sec

Clear                                  ; Wis geheugen 

         ;543210                       ; Hulpregel poort A
PORTA  = %000000                       ; Maak poort A laag
TRISA  = %111111                       ; 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

         ;543210                       ; Hulpregel analoog poort_B
ANSELH = %000000                       ; ANSEL register analoog poort_B

TMR_1 = 0                              ; Zet timer 1 op 0


;---------------------------------
; VOORBEELD ON_INTERRUPT TIMER_0.
;---------------------------------

RUN:                                   ; Begin programma
    LIMITE_TIMER = 8000                  ; INT(2500000 ) puls is kort.
    
    If VAL_TIMER > LIMITE_TIMER Then   ; Waarde timer groter dan limite timer
     VAL_TIMER = 0                     ; Waarde timer is nul
      If VAL_TIMER = 0 Then            ; Als waarde timer is nul                                                     
       PULS = 1                        ; Timer puls is één
      EndIf                            ; Einde als 
    EndIf                              ; Einde als
    
    If PULS = 1 Then                   ; Als puls is één dan
     TMR_1 = TMR_1 + 1                 ; Hoog timer_1 op
      If TMR_1 > 60 Then               ; Als timer_1 is groter als 60 dan................ wordt variabele 0 tot 6000
       GoTo WIS_DISPLAY                ; Ga naar wis display
      EndIf                            ; Einde als
    EndIf                              ; Einde als
    
   
    EndIf                              ; Einde als
    
    Print At 1,1,"TMR1="               ; Zet text op dislpay
    
    Print At 1,6,Dec TMR_1,            ; Zet waarde timer_1 op display
   
    PULS = 0                           ; Zet puls op 0
GoTo RUN                               ; Naar begin proramma
    
WIS_DISPLAY:                           ; Loop wis display
    TMR_1 = 0                          ; Zet timer_1 op nul
    
    Cls                                ; Wis display
    DelayMS 1000                       ; Pauze 1 sec
GoTo RUN   ; mag niet want dan komt wat hierna komt niet aan de beurt  ; Naar begin programma

;
; subroutine1                                
;
;heel 
;subroutine2
;
;
;subroutine veel
;
;
;
;veel
;meer
;programma
;
;
;
;
;
;
;
 ;gosub hoofdprogramma
End                                    ; Einde programma
Arco

Special Member

De RB0 interrupt zet je met INTE aan.

Dat is toch gewoon een dure naam voor kijk naar de ingang of die hoog of laag is?

Nee,
Een comparator is veel nauwkeuriger en veel dichter bij de nul detecteren. (pic met een 'echte' zero-cross detector kan natuurlijk ook...)

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

Op 30 oktober 2019 19:28:43 schreef Arco:
De RB0 interrupt zet je met INTE aan.

Wat snap jij nou niet aan mijn vraag:
"Hoe start ik die voorbeeld timer van lambiek met het hoog worden van de ingang ?"

Geef gewoon de code, zet de regel even bij al die code die ik net hieronder heb gepost.
Met dat INTE, INTF, INTEDG en weet ik wat nog meer.
IK WEET NIET HOE DAT MOET, jij vindt het blijkbaar zo vreselijk vanzelfsprekend en denkt mogelijk, "zo simpel dat moet hij zelf ook weten" of doe je inderdaad maar alsof, want er komt maar geen antwoord, je blijft er maar uitvluchten voor zoeken.

'echte' zero-cross detector kan natuurlijk ook...)

kijk eens:
https://www.circuitsonline.net/forum/view/message/2114792#2114792

Dus kan het wel met kijken naar een ingang, want de schakeling werkt.
ALLEEN niet met een timer en niet met een interrupt die voor mij ergens als grote onzichtbare in de pic zweeft.

Geef gewoon de code, zet de regel even bij al die code die ik net hieronder heb gepost. Met dat INTE, INTF, INTEDG en weet ik wat nog meer.
IK WEET NIET HOE DAT MOET

Zelf eens wat gaan opzoeken is weer teveel gevraagd....

als grote onzichtbare in de pic zweeft.

Staat keurig in het datasheet van de PIC, moet je wel opzoeken en lezen uiteraard...

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
Arco

Special Member

Je wilt een complex iets maken, terwijl je geen idee hebt wat er in een microcontroller zit en hoe die werkt...
(een cursusje volgen met een makkelijker projectje als start lijkt me een goede manier om basiskennis op te doen)

Programmeren is niet code van anderen aan elkaar knippen en plakken, dat werkt bijna nooit.
('zet de nuldoorgangdetectie regel er even bij': zo makkelijk is dat niet. Bij fase aan/afsnijden komt ook nog het nodige rekenwerk te pas)

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

Op 30 oktober 2019 20:46:24 schreef Arco:
een cursusje volgen met een makkelijker projectje als start lijkt me een goede manier om basiskennis op te doen

Ben ik al druk mee bezig.

Hoe start ik deze timer als ik portb.0 als interrupt/startcommando moet gebruiken.

Op 30 oktober 2019 18:55:21 schreef stortbak:

pic basic code:





RUN:                                   ; Begin programma
    LIMITE_TIMER = 8000                  ; INT(2500000 ) puls is kort.
    
    If VAL_TIMER > LIMITE_TIMER Then   ; Waarde timer groter dan limite timer
     VAL_TIMER = 0                     ; Waarde timer is nul
      If VAL_TIMER = 0 Then            ; Als waarde timer is nul                                                     
       PULS = 1                        ; Timer puls is één
      EndIf                            ; Einde als 
    EndIf                              ; Einde als
    
    If PULS = 1 Then                   ; Als puls is één dan
     TMR_1 = TMR_1 + 1                 ; Hoog timer_1 op
      If TMR_1 > 60 Then               ; Als timer_1 is groter als 60 dan................ wordt variabele 0 tot 6000
       GoTo WIS_DISPLAY                ; Ga naar wis display
      EndIf                            ; Einde als
    EndIf                              ; Einde als
Arco

Special Member

Da's zo niet te zeggen, is een losse flard code. (er ontbreekt het nodige)
Welke timer gaat het over? (timer 0, 1, 2)

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

Op 30 oktober 2019 20:14:54 schreef stortbak:
[...]Geef gewoon de code, zet de regel even bij al die code die ik net hieronder heb gepost.
Met dat INTE, INTF, INTEDG en weet ik wat nog meer.
IK WEET NIET HOE DAT MOET, jij vindt het blijkbaar zo vreselijk vanzelfsprekend en denkt mogelijk, "zo simpel dat moet hij zelf ook weten" of doe je inderdaad maar alsof, want er komt maar geen antwoord, je blijft er maar uitvluchten voor zoeken.

Jij kan blijkbaar niet bevatten dat wij wel SNAPPEN hoe dat werkt, maar ook niet alle bitjes in alle registers uit ons hoofd kennen, en dus ook zomaar een uur zoet zijn met de datasheet om alles bij elkaar te zoeken.

Als je mensen blijft beschuldigen van "doen alsof" zijn ze echt een keer klaar met je, en ik ben oprecht verbaast dat dat niet allang gebeurd is.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken