timing

pic basic code:


DEVICE 16F628A                ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

Opnieuw:                      ;Label met zelf te verzinnen naam
TOGGLE PORTA.1                ;Aan moet uit, uit moet aan
DELAYMS 5000                  ;5000 milliseconden = 5 sec
GOTO Opnieuw                  ;ga naar 'Opnieuw' en begin opnieuw 
END                           ;Einde programma

boven staand programma komt uit deel 1 cursus van pic basic.
gebruik dit als opstap naar ander project.

ik een vraag over de delay time van het programma.

Heb bijgevoegd schema opgebouwd.
als ik delay time verander naar 5, 10 of 20 seconden dan meet ik met timer iedere keer een ander tijd.
er zitten behoorlijke verschillen in.
bij 5se meet ik 1 sec bij 10 meet ik 5 sec al met al zitten behoorlijke verschillen in delay time

wat zie of doe ik verkeerd.

Zet even na de lijn alldigital=true

XTAL=4

Dan weet je compiler met welke snelheid je PIC werkt en dan zullen de timings wel zo ongeveer kloppen.

Domoticz en ESP8266, goede combo!!!

maakt inderdaad veel verschil.
meet nu ongeveer afwijking van 2/10 tot 3/10 verschil.
dit is voor mij meer dan acceptabel.

Lambiek

Special Member

Die 2/10 of 3/10 is dat per seconde, of over de totale tijd?

Ik doe hier soms tijden van meer dan een uur, en dan heb ik die tijd binnen één seconde precies.

Zelf zet ik (XTAL) iets hoger neer bij de config.

pic basic code:


Device 16F887                               ; Processor type

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

Als je haar maar goed zit, GROETEN LAMBIEK.

De interne oscillator is +/- 1% nauwkeurig, dus kan +/- 36sec afwijken per uur...

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com
Lambiek

Special Member

O ja, hij gebruikt natuurlijk de interne oscillator. Even vergeten.

Zelf zet ik het in een FOR NEXT lus, rekening houdend met de instructietijd kan dat vrij precies moet ik zeggen.

Als je haar maar goed zit, GROETEN LAMBIEK.

het is per seconde.
of mijn timer moet niet goed.(is een aangepaste stopwatches)

Laat een ledje knipperen 1x per seconde, da's veel makkelijker en nauwkeuriger om mee te testen. Moet dan 60x per minuut knipperen.

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

dat het nauwkeurige kan dat weet ik.
voorlopig is het even goed zo.

ben geen hoogvlieger in programmeren probeer alleen stap voor stap dingen op te bouwen zodat ik het ook snap en begrijp.

vandaar dat ik misschien wat domme vragen stel.

Als je iets hebt als:

pic basic code:

   opnieuw: 

   doe iets
   delayms 1000
   goto opnieuw

dan duurt iedere lus 1 seconde PLUS de tijd van de "doe iets". Als dat misschien iets doet met de buitenwereld zoals serieel debug info naar buiten sturen of iets naar een LCD scherm, dan kan die lus al vrij snel langer dan 1 sec gaan duren.

Of jou taaltje iets heeft als "hoe laat is het?", dat weet ik niet. In chibios heb ik chsystime (); Dan kan ik precies uitreken dat ik wil wachten tot bijvoorbeeld de volgende hele seconde.

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

Special Member

Op 4 juli 2017 21:12:09 schreef rew:
...dan duurt iedere lus 1 seconde PLUS de tijd van de "doe iets". Als dat misschien iets doet met de buitenwereld zoals serieel debug info naar buiten sturen of iets naar een LCD scherm, dan kan die lus al vrij snel langer dan 1 sec gaan duren.

Het is precies zoals rew het hier schetst, alleen in het geval van de TS duurt het maar één instructie "TOGGLE PORTA.1" dat is niet echt lang, maar als je inderdaad naar een LCD gaat schrijven moet je daar terdege rekening mee houden.

Op 4 juli 2017 17:04:14 schreef zeeman..59:
ben geen hoogvlieger in programmeren probeer alleen stap voor stap dingen op te bouwen zodat ik het ook snap en begrijp.

Het is al mooi dat de ouderen onder ons nog lekker bezig zijn met elektronica, is alleen maar mooi toch.

vandaar dat ik misschien wat domme vragen stel.

Vragen zijn niet dom, als ik iets niet weet vraag ik het ook. :)

Als je haar maar goed zit, GROETEN LAMBIEK.

@Lamiek inderdaad als je wat weten wil gewoon vragen.
Vragen die die niet gesteld worden is niet slim.

Dus heb ik een vraag.
heb onderstaand programma gemaakt gebaseerd op deel 2 picbasic.

s1 t/m s3 is draaischakelaar.
opzet is als schak in stand 1,2 of 3 staat de led 0,5, 1 en 1,5 gaat knipperen.

dit gebeurt dus niet.
led gaat wel en gaat ook uit, maar knippert niet.

wat zie ik over het hoofd.

pic basic 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
Xtal = 4

Symbol AAN  = 0               ; Schakelaar aan = laag (0)
Symbol UIT  = 1               ; Schakelaar uit = hoog (1)

;symbol voet pendaal = porta.3  ;  voet pendaal is voor start/stop

Symbol LED1 = PORTA.2         ; Poort A.0 heeft nu de naam LED1
Symbol S1   = PORTB.0         ; Poort B.0 heeft nu de naam S1
Symbol S2   = PORTB.1         ; Poort B.1 heeft nu de naam S2
Symbol S3   = PORTB.2         ; Poort B.2 heeft nu de naam S3
                              ; S1,S2 en S3 is een 3 standen draaischakelaar
 
Clear                         ; Wis alle RAM geheugen

;Hoofdprogramma
While 1 = 1                   ; Oneindige lus
  If S1 = AAN Then            ; Als S1 aan is dan...
    High LED1                 ; LED1 aan
      DelayMS 500             ; na 0,5 sec uit      
     Low LED1
    While S1 = AAN  
  Wend        
EndIf 
                       
  If S2 = AAN Then            ; Als S2 aan is dan...
    High LED1                 ; LED1 aan
     DelayMS 1000             ; na 1 sec uit
    Low LED1 
   While S2 = AAN
  Wend                 
EndIf                       

If S3 = AAN Then              ; Als S3 aan is dan...
    High LED1                 ; LED1 aan
     DelayMS 1500             ; na 1,5 sec uit       
    Low LED1
   While S3 = AAN 
  Wend            
EndIf                       

Wend

End                           ; Einde programma                                               *

Ps. regel voet pedaal is nog even nvt.

Lambiek

Special Member

En op deze manier.

pic basic code:


LED1 = 0

RUN:

    If S1 = 1 Then
     LED1 = 1
      DelayMS 500
       LED1 = 0
     DelayMS 500
    EndIf
    
    If S2 = 1 Then
     LED1 = 1
      DelayMS 1000
       LED1 = 0
     DelayMS 1000
    EndIf
    
    If S3 = 1 Then
     LED1 = 1
      DelayMS 1500
       LED1 = 0
     DelayMS 1500
    EndIf
GoTo RUN
    
End

En bij die les staat dit ook aan hé.

pic basic code:


PORTB_PULLUPS ON
Als je haar maar goed zit, GROETEN LAMBIEK.

even tussen ziekenhuis en bestralingen door heb ik het programmatje even ingeprogd.

zoals ik het even vlug heb bekeken werkt het niet.

pullups heb ik niet op on staan.
gebruik externe weerstand..

moet even op mijn gemak kijken wat er loos.

Lambiek

Special Member

Op 6 juli 2017 17:42:57 schreef zeeman..59:
even tussen ziekenhuis en bestralingen door.......

Toch niets ernstigs mag ik hopen, in ieder geval heel veel beterschap.

Als je haar maar goed zit, GROETEN LAMBIEK.

Mankeert er niet een tweede delay in elk van de drie cases?

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord

In de picbasic code van 5 juli blijft de routine hangen in de lus van s1.
Wend weghalen ook in lus van. s2 en s3
Ook b.v. Delayms 500 na while 1=1 toevoegen , uit tijd van de led is te kort om te zien.

Groet Johan

jaapvdH

Golden Member

Zoals Johan hierboven al zei moeten de while wend voor S1, S2 en S3 verwijderd worden. Als schakelaar S1 aan staat gat de led aan en weer uit. Vervolgens gebeurt er niets meer totdat de schakelaar in positie 2 of 3 komt. Dan gebeurt weer hetzelfde als bij schakelaar S1.

Lambiek

Special Member

Op 7 juli 2017 11:35:11 schreef big_fat_mama:
Mankeert er niet een tweede delay in elk van de drie cases?

er moet inderdaad nog een delayms tussen. Maar voor de bestaande code ook wat Johannes..54 aan geeft.

Als je haar maar goed zit, GROETEN LAMBIEK.

@Lambiek: om met de deur in huis te vallen ja het is ernstig.

Hoop mijn afleiding en ontspanning te kunnen vinden in het programmeren van kleine dingetjes.

was er inmiddels achter dat ik delaytime moest toevoegen en while wend weglaten.(zoals johannes aangaf)

nu werkt het voorlopig zoals ik in mijn gedachte had.

Lambiek uiteraard heb ik jou programma ook geprobeerd.
Als ik hem zo lees het programma zou het moeten werken alleen is dit niet het geval.

Lambiek

Special Member

Op 10 juli 2017 17:51:05 schreef zeeman..59:
@Lambiek: om met de deur in huis te vallen ja het is ernstig.

Heel veel sterkte in ieder geval!!!

Hoop mijn afleiding en ontspanning te kunnen vinden in het programmeren van kleine dingetjes.

Dat moet je ook zeker blijven doen. :)

Lambiek uiteraard heb ik jou programma ook geprobeerd.
Als ik hem zo lees het programma zou het moeten werken alleen is dit niet het geval.

Ik heb het net even geprobeerd, en hier werkt het gewoon goed. Het doet precies zoals het bedoeld is.

Maar ik gebruik dit ook niet.

pic basic code:


Symbol AAN  = 0              
Symbol UIT  = 1

Jij maakt je ingang waarschijnlijk laag, en ik maak hem juist hoog.

Als je haar maar goed zit, GROETEN LAMBIEK.

Twijfel er ook niet over dat het niet zou werken.

Ik zit te toppe.8)7

Gelukkig is vragen niet dom, maar in dit geval, loop ik vast in mijn gedachtegang en irriteert mij mateloos dat ik het niet zie.

Het knipper programma, hier boven, met while/wend werkt zoals ik in gedachte had.

Wat mij nu al een aantal dagen bezig hou, is dat ik het zelfde programma met run/gotorun, van lambiek, niet aan de gang krijg.

Waar staar ik mij blind op.:(

pic basic 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
Xtal = 4
 
Symbol On   = 1                ; Schakelaar aan = hoog 
Symbol off  = 0                ; Schakelaar uit = laag 
 
Symbol LED1 = PORTA.2         ; Poort A.0 heeft nu de naam LED1
Symbol S1   = PORTB.0         ; Poort B.0 heeft nu de naam S1
Symbol S2   = PORTB.1         ; Poort B.1 heeft nu de naam S2
Symbol S3   = PORTB.2         ; Poort B.2 heeft nu de naam S3
                              ; S1,S2 en S3 is een 3 standen draaischakelaar
 
Clear                         ; Wis alle RAM geheugen
 
;Hoofdprogramma
LED1 = 1
 
RUN:

    If S1 = 1 Then
     LED1 = 1
      DelayMS 500
     LED1 = 0
      DelayMS 500
    EndIf
 
    If S2 = 1 Then
     LED1 = 1
      DelayMS 1000
     LED1 = 0
      DelayMS 1000
    EndIf
 
    If S3 = 1 Then
     LED1 = 1
      DelayMS 1500
     LED1 = 0
      DelayMS 1500
    EndIf
    
GoTo RUN
 
End

@henk stuur de led aan met het commando high led1 en low led1 ipv led1 = 1 en led1 = 0
Symbol on en symbol off vind ik verwarrend

Hallo Zeeman..59,

Wat je nog kan proberen is om de uitgangen te definiëren als ingang of uitgang. Dit wordt besproken in deel 3 van de cursus.
Anders zijn de (meeste) pinnen bij het opstarten een ingang. Ik weet dat dit bij Atmel een problemen kan opleveren. Echter weet ik het niet meer zeker dit uitmaakt bij de 16F628A.

Zie de onderstaande code als voorbeeld. Dit kan vervangen worden voor jou stukje code.

pic basic code:

SYMBOL LED1 = PORTA.0         ;Poort A.0 heeft nu de naam LED1
Symbol LED1 = PORTA.2         ; Poort A.2 heeft nu de naam LED1
Symbol S1   = PORTB.0         ; Poort B.0 heeft nu de naam S1
Symbol S2   = PORTB.1         ; Poort B.1 heeft nu de naam S2
Symbol S3   = PORTB.2         ; Poort B.2 heeft nu de naam S3

;        76543210
PORTA = %00000100             ;Zet PORTA.2 hoog bij het opstarten (LED1 = 1)
TRISA = %11111011             ;Zet PORTA.2  als uitgang
TRISB = %11111111             ;Zet poort b als ingang

Wat werkt er wel precies aan je code? Werkt "LED1 = 1" wel of niet onder hoofdprogramma.

Brandon