interrupts en hun problemen


Jochem

Golden Member

Basic is ook niet mijn favoriete taal, zeker niet in microcontrollers, dus ik heb het even opgezocht: het lijkt er op dat in picbasic geen endif nodig is als je if-statement maar 1 regel beslaat.

Maar de boel een beetje structuur geven zou geen overbodige luxe zijn, Raf.

Heb geduld: alle dingen zijn moeilijk voordat ze gemakkelijk worden.

Bij Mikrobasic is wel altijd een end if nodig, ook op 1 regel.
Ik vind het ontbreken van end if's bij 'C' bijv. een groot nadeel (weinig overzicht, je moet accolades gaan tellen...)

Picbasic vind ik een ongestructureerd iets:

Je mag declares overal waar je wilt neerzetten.
Werking van veel functies is vaag (zelfs na het lezen van de handleiding onduidelijk)
Als je het niet opgeeft, bepaalt de compiler 'met de natte vinger' of een pin input of output is.
Schijnbaar creert de compiler bij het END statement zelf iets van een while...wend loop.

Ik houd totaal niet van compilers met dat soort A.I... (dat bepaal ik zelf wel... ;) )

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

Golden Member

Ik denk dat het een kwestie van wennen is. Ik heb juist het tegenovergestelde: die extra end-keywords in BASIC maken voor mij de leesbaarheid minder omdat er onnodige woorden staan.

Accolades tellen moet niet nodig zijn, omdat je natuurlijk netjes moet inspringen. Voor BASIC geldt dat net zo: een geneste IF in BASIC levert soms ook twee keer een END IF op onder elkaar. Die wil je ook niet tellen: door het inspringen zie je meteen hoe het zit. Dat heeft Raf nagelaten en dat is één van de dingen waarom het programma zo onleesbaar wordt (zeker als je het niet zelf hebt geschreven).

Heb geduld: alle dingen zijn moeilijk voordat ze gemakkelijk worden.

De goto hell maakt het niet beter; je weet nooit waar het vandaan komt, en dus waar je naar terug moet. In basic kun je ook gewoon subroutines maken, die elk een simpel en duidelijk taakje uitvoeren, wat een programma veel meer structuur geeft.

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

Golden Member

Ja absoluut, maar van die dingen kun je zeggen dat TS het nog niet onder de knie heeft. Dus dat kunnen we hem uitleggen hoe het beter kan, eventueel met voorbeelden.

Inspringen is echter gewoon een kwestie van doen. Sterker nog, de meeste IDE's/texteditors kunnen het automatisch voor je doen.

Ik vind als je hulp vraagt op een forum, dat je het de mensen die jou potentieel kunnen helpen zo makkelijk mogelijk moet maken. Niet alleen omdat dat fatsoenlijk is, maar ook omdat je dan meer kans op bruikbare antwoorden krijgt. Als ik deze code zie, dan denk ik: ik heb geen zin om me daar nu doorheen te gaan worstelen. De variabelenamen van 1 letter helpen overigens ook niet mee...

Heb geduld: alle dingen zijn moeilijk voordat ze gemakkelijk worden.

goeie morgen

eerst wat achtergrond
vroeger begonnen met de z80 om te programmeren
we hadden 1 volledige KB om iets mee te doen en daar ging het beeld scherm dan nog vanaf
dat is een van de redenen dat ik met een enkele letter programmeer voor de variabelen
we hadden toen niet meer plaats in dat ding

en voor een for next loopje of er nu staat for a = 1 toe 1000 of er staat for weetikeveel = 1 to 1000 maat het eigenlijk niet veel uit
als ik een 1 byte variabele heb en ik ga er een 10 letter woord van maken dan is dat ook raar
bv f kan alleen maar 1 of 0 zijn
d en e zijn controle variabelen die kijken of BV een servo reeds op zijn juiste plaats staat ;dan is het stom en ongewild om hem eerst terug naar de midden stand te brengen en dan terug naar de gewenste positie

@sparkygsx er zitten maar 3 goto's in

pic basic code:



  
 teller:

 If  a < 6 Then a = a + 1
      While 1 = 1
       PulsIn PORTA.3,1,schakel
       If schakel = midschakel Then Return
       Wend
  setten:

     If a1 = 1 Then GoTo setten2
     If b1 = 1 Then GoTo setten2
     If d1 = 1 Then GoTo setten2
     If a = 1 Then standl = 0       ;standlicht
     If a = 1 Then PulseOut PORTA.1 , 14 , High
     If a = 1 Then a1 = 1 
     If a = 2 Then grootl = 0       ;grootlicht
     If a = 2 Then b1 = 1
     If a = 3 Then fare =  0       ;verstralers
     If a = 3 Then PulseOut PORTA.1 , 18 , High 
     If a = 4 Then mistl = 0        ;mistlampen
     If a = 4 Then d1 = 1
     DelayMS 200
     a = 0 
     Return 
     setten2:
        

     If a = 1 Then standl = 1       ;standlicht
     If a = 1 Then PulseOut PORTA.1 , 20 , High
     If a = 1 Then a1 = 0
     If a = 2 Then grootl = 1       ;grootlicht
     If a = 2 Then b1 = 0
     If a = 3 Then fare =  1       ;verstralers
     If a = 3 Then PulseOut PORTA.1 , 24 , High 
     If a = 4 Then mistl = 1        ;mistlampen
     If a = 4 Then d1 = 0
     DelayMS 200
     a = 0 
     Return     

en deze gaan allemaal naar de zelfde subroutine

met a1 = 1 bv geef ik aan het programma aan dat er reeds een functie is in of uitgeschakeld,

dit is nodig omdat de pulseout op poort 1 naar een IR diode gaat die de verlichting in de trailer mee stuurt
de trailer kan verschillen of helemaal afwezig zijn
het voordeel van die IR is dat je geen kabels moet aan sluiten

gr raf
nu eerst een print herstellen waar de voeding aan een verkeerde stekker is aangesloten geworden
12 volt op een 5 volt uitgang aansluiten is niet die persoon zijn slimste zet ,maar hij heeft nog van die trukken uitgehaald

Gr Raf
Jochem

Golden Member

Op 8 november 2019 08:05:29 schreef raf janssens:
vroeger begonnen met de z80 om te programmeren
we hadden 1 volledige KB om iets mee te doen en daar ging het beeld scherm dan nog vanaf
dat is een van de redenen dat ik met een enkele letter programmeer voor de variabelen
we hadden toen niet meer plaats in dat ding

Ik programmeerde vroeger ook regelmatig op een Z80. Maar dat heeft hier niks meer mee te maken toch?

en voor een for next loopje of er nu staat for a = 1 toe 1000 of er staat for weetikeveel = 1 to 1000 maat het eigenlijk niet veel uit

Dat klopt wel, een simpele iterator mag best i, of in jouw geval a heten. Zeker bij een kleine loop. Dat doet ook niks af aan leesbaarheid of begrip van de code.

als ik een 1 byte variabele heb en ik ga er een 10 letter woord van maken dan is dat ook raar
bv f kan alleen maar 1 of 0 zijn

Leuk dat het alleen 1 of 0 kan zijn, maar als ik jouw code voor de eerste keer zie heb ik geen idee wat "f" doet. Als ik een paar keer kijk heeft het iets met het remmen/rijden te maken? Ik snap het nog niet helemaal, maar in zo'n geval zou ik er iets van StopGoFlag of bStopGo (b van boolean) van maken.

d en e zijn controle variabelen die kijken of BV een servo reeds op zijn juiste plaats staat ;dan is het stom en ongewild om hem eerst terug naar de midden stand te brengen en dan terug naar de gewenste positie

Prima, maar noem hem dan ook bServoCheck, of liever iets wat de lading nog beter dekt.

met a1 = 1 bv geef ik aan het programma aan dat er reeds een functie is in of uitgeschakeld,

Lees nou eens wat je ons hier vertelt. En bedenk je nou eens hoe makkelijk het was geweest als die variabele "FunctieBezig1" ofzo had geheten.

Geloof je eigenlijk dat als je je eigen code over anderhalf jaar zelf terugleest (bijvoorbeeld voor een kleine aanpassing) dat dit nog duidelijk is?

Heb geduld: alle dingen zijn moeilijk voordat ze gemakkelijk worden.

hallo

pic basic code:


  remmen:

  f = 0
  h = 100
   PulseOut PORTB.1, 10 , High     ;link
 While 1 = 1
 DelayMS 200
 h = h - 1
 If h = 0 Then PulseOut PORTB.1 , 12 , High  ;link
 If h = 0 Then Return 
  Wend

het staat er wel degelijk dat dit het stukje is waarop het programma de remlichten laat aan gaan hoor
"remmen:"
kan niet veel meer betekenen in een programma wat over de verlichting van een wagen gaat

pic basic code:


vooruit:


  f = 1 
  Return

vooruit is niet meer dan dit en zet de stoplichten uit
het moet en kan ook niet veel meer zijn dacht ik in een programma over verlichting op een auto

op je vraag
"Geloof je eigenlijk dat als je je eigen code over anderhalf jaar zelf terugleest (bijvoorbeeld voor een kleine aanpassing) dat dit nog duidelijk is?"
ja dit is zeer logische voor mij en ik kan dit programma nog perfect begrijpen zelfs na 5 herseninfarcten die ik dit jaar gehad heb ;waar andere zaken bv gezichten aan namen koppelen niet meer lukt

mijn verwijzing naar de z80 is dat ook de 16f628 maar 1K geheugen heeft en ik geen TB ter beschikking heb om veel anders te programmeren dan nodig

zoals bv de schrijf routine die is eigenlijk maar 1 keer nodig
eens de waarden van de ontvanger in het geheugen zijn gezet veranderd daar niets meer aan .midden stand van de stick is en blijft de midden stand

pic basic code:


 midstuur =  ERead 0  ;puls waarde die weg geschreven is terug inlezen
 If midstuur = 0 Then GoSub  schrijven   ;b2 is ingang setten ewrite
 If setting = 0 Then GoSub schrijven 
  DelayMS 100
 
 midgas = ERead 0
 midstuur = ERead 2
 midschakel = ERead 4
 
DelayMS 800

met de teller kies je welke lampen je gaat aan zetten

pic basic code:


 teller:


 If  a < 6 Then a = a + 1
      While 1 = 1
       PulsIn PORTA.3,1,schakel
       If schakel = midschakel Then Return
       Wend

de 6 kan nog verhoogd worden indien er meer lampen op de wagen gemonteerd worden .
daarna gaat het programma dus verder met setten: en setten2:

setten: is het aan zetten van de betreffende lampen
setten2: is het uitzetten van de gekozen lampen

rechts: en rechts1: is het aan/uit zetten van de rechter pinker
links: en links1: is aan en uitzetten van de linker pinker

ik denk toch dat er voldoende info in het programma aanwezig is om het te kunnen begrijpen

ik vind juist "FunctieBezig1" een onduidelijke beschrijving
want welke functie is met wat bezig ???
net zoals StopGoFlag onduidelijk is want is het nu "stop" of "go" en "flag" er worden geen vlaggen gezet
bStopGo B word als teller gebruikt en heeft geen stop of go functie

ik begrijp wat je wil bedoelen hé maar voor mij is jullie manier van programmeren onduidelijker dan wat ik reeds een 30 jaar doe
en als het werkt waarom overschakelen
zo word me aangeraden in flash of c of cc+ te programmeren en wat is de meer waarde buiten dat ik een nieuwe programmeer taal moet gaan leren
snelheid ???? heb ik echt niet nodig want buiten de pinkers is er niets tijdgebonden .

gr raf

Gr Raf

Of iets begrijpelijk geprogrammeerd is zie je zoals gezegd als je de code na 1 of 2 jaar terugziet.
Duurt het dan lang om te doorgronden wat er gebeurt, dan is dat meestal een kwestie van onduidelijke benaming of ontbrekend commentaar...

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

Golden Member

Op 8 november 2019 14:12:24 schreef raf janssens:

pic basic code:


  remmen:

  f = 0
  h = 100
   PulseOut PORTB.1, 10 , High     ;link
 While 1 = 1
 DelayMS 200
 h = h - 1
 If h = 0 Then PulseOut PORTB.1 , 12 , High  ;link
 If h = 0 Then Return 
  Wend

het staat er wel degelijk dat dit het stukje is waarop het programma de remlichten laat aan gaan hoor
"remmen:"

Die variabele f staat ook nog op andere plekken.

mijn verwijzing naar de z80 is dat ook de 16f628 maar 1K geheugen heeft en ik geen TB ter beschikking heb om veel anders te programmeren dan nodig

Dat je spaarzaam met geheugenruimte om moet gaan heeft echt werkelijk NIKS met de lengte van een variabelenaam te maken.

setten: is het aan zetten van de betreffende lampen
setten2: is het uitzetten van de gekozen lampen

Tja, ik denk dat ik tegen een muur aan praat inmiddels, maar ik zou die labels dan iets van 'aanzetten' en 'uitzetten' genoemd hebben. Je bent hier elke keer in dit topic dingen over de werking/bedoeling van je code aan het uitleggen die juist door wat duidelijkere namen van labels/variabelen voor zich hadden kunnen spreken.

ik vind juist "FunctieBezig1" een onduidelijke beschrijving
want welke functie is met wat bezig ???

Okee, prima argument, maar ik kon uit jouw info niet meer opmaken. FunctieBezig1 is nog altijd meer info dan a1, zoals jij die vlag noemde. Geef hem dan een naam die beter beschrijft wat er voor functie bezig is.

net zoals StopGoFlag onduidelijk is want is het nu "stop" of "go"

Dan noem je hem Stop óf Go, of bRemFlag, of je noemt hem Stop_nGo om duidelijk te maken dat 0=Go. Mogelijkheden te over, en alles begrijpelijker dan f.

en "flag" er worden geen vlaggen gezet
bStopGo B word als teller gebruikt en heeft geen stop of go functie

Je zegt zelf dat f alleen 0 of 1 kan worden. Is voor mij een soort vlag, of op z'n minst een boolean. Geen counter.

ik begrijp wat je wil bedoelen hé maar voor mij is jullie manier van programmeren onduidelijker dan wat ik reeds een 30 jaar doe

Nou heel eerlijk, wat je hier aan het doen bent is echt gerommel. En dat is niet erg, want je komt ook om hulp vragen. Maar nu sla je goedbedoelde adviezen in de wind en steek je je kop in het zand.

Ik ben nog niet eens begonnen over constructies zoals deze:

pic basic code:

While 1 = 1
 DelayMS 200
 h = h - 1
 If h = 0 Then PulseOut PORTB.1 , 12 , High  ;link
 If h = 0 Then Return 
  Wend

Leuk dat je het al 30 jaar zo doet, maar waar denk je dat een while-conditie voor is? Je maakt een oneindige loop, en daarin verstop je dan de return-conditie. Los van het gebrek aan fatsoenlijk inspringen...

en als het werkt waarom overschakelen

Werkt het allemaal? Waarom dan die 2 topics? Jij wilt nu iets bijzonders met interrupts gaan doen, terwijl je huidige code op niks trekt. Dan is het toch fijn als mensen je goed op weg proberen te helpen?
Nee hoor, Raf doet het al 30 jaar zo! Waarom veranderen?

zo word me aangeraden in flash of c of cc+ te programmeren en wat is de meer waarde buiten dat ik een nieuwe programmeer taal moet gaan leren
snelheid ???? heb ik echt niet nodig want buiten de pinkers is er niets tijdgebonden .

Ho ho, nu haal je er iets heel anders bij. Ik ben geen aanhanger van Basic (zeker niet voor een uC), maar ik ga iemand die net een beetje de taal onder de knie heeft echt niet naar een andere programmeertaal lopen pushen.

Heb geduld: alle dingen zijn moeilijk voordat ze gemakkelijk worden.

Jochem
ik heb dit topic geopend omdat ik een probleem met de tijd van de pinkers heb
de rest werkt allemaal

een andere taal ging niet over uw inbreng maar er waren anderen die dat in andere topics wel aan haalden

pic basic code:


  remmen:


  f = 0
  h = 100
   PulseOut PORTB.1, 10 , High     ;link

hier dient die while lus voor
om de tijd te bepalen van hoelang de stop lichten werken
dit stukje programma word eens ingeschakeld uitgevoerd
dit staat onder Remmen:

ook hier zou ik een timer voor kunnen gebruiken

F kom je maar op twee plaatsen tegen en dat heeft allemaal met het remmen te maken .
ik zal eens kijken of ik de code meer begrijpbaar voor jullie kan maken
dan lost dat misschien reeds een probleem op en kan het timer probleem opgelost worden
want tot nu toe is daar nog niets van gekomen

gr raf

Gr Raf
Jochem

Golden Member

Het punt is dat als je de tijd van de pinkers niet met een delay wilt doen maar met een timer/ticker, de stuctuur van dergelijke routines ook op de schop moet. Als er dan dingen als while 1=1 in staan met in de loop zowel een delayMS als een return, dan MOET dat gewoon anders.

Reden dat je (voor jouw gevoel) nog steeds geen antwoord op je vraag hebt, is omdat veel antwoordgevers bovenstaande aan zien komen, en zich dus eerst bekommeren om de huidige opbouw van de code. Dat is in aanloop naar de oplossing van jouw oorspronkelijke probleem. Als jij dan zegt "maar het werkt zo, ik zie geen reden tot veranderen", dan kom je nooit aan je timer-probleem toe.

Mijn advies om het allemaal wat leesbaarder te maken was eveneens zodat de oorspronkelijke vraag eerder opgelost kan worden.

Heb geduld: alle dingen zijn moeilijk voordat ze gemakkelijk worden.

Op 8 november 2019 14:53:28 schreef Arco:
Duurt het dan lang om te doorgronden wat er gebeurt, dan is dat meestal een kwestie van onduidelijke benaming of ontbrekend commentaar...

Als het goed getest is tijdens ontwerpen hoef je er over 2 jaar niet meer in te wroeten.

Ik ben wel erg benieuwd naar hoe in het autoprogramma straks de interrupts geplaatst gaan worden.
Het lijkt er nu nog op dat er niet begrepen wordt hoe het moet werken.

Jochem

Golden Member

Op 8 november 2019 15:21:21 schreef stortbak:
Als het goed getest is tijdens ontwerpen hoef je er over 2 jaar niet meer in te wroeten.

Dat weet je nooit. Misschien wil je er een zwaailicht bij. Of misschien hergebruik je een stuk code straks voor iets anders, en moet je er dan nog eens naar kijken.

Het lijkt er nu nog op dat er niet begrepen wordt hoe het moet werken.

Dat is inderdaad onderdeel van waarom er nog geen pasklaar antwoord is voorgeschoteld.

Heb geduld: alle dingen zijn moeilijk voordat ze gemakkelijk worden.

Als het goed getest is tijdens ontwerpen hoef je er over 2 jaar niet meer in te wroeten.

Ik heb al heel veel commerciele ontwerpen gemaakt.
Bijna altijd blijf je daarin bezig omdat kleine bugs bovenkomen in het gebruik, of omdat sommige zaken beter kunnen.
(of simpel omdat de klant functionele uitbreiding wil. Wel zo handig als je dat dan snel kunt implementeren en niet eerst hoeft uit te vlooien hoe alles werkt)

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

Golden Member

Even vooropgesteld dat ik geen PICBASIC kenner ben, heb ik de moeite genomen om door je programma heen te lopen om het te begrijpen. Ik kom daarbij een aantal dingen tegen waar ik m'n vraagtekens bij heb. Hopelijk kun je me wat duidelijk maken.

Ten eerste: er blijkt een MELABS PICbasic Pro te bestaan, en een Proton (PIC)basic. Welke gebruik jij? Dan weet ik even welke manual ik erbij moet pakken.

pic basic code:

stuurrechts = midstuur - 20
stuurlinks = midstuur + 20

Dit staat vrijwel bovenin je code, net na de config, de symbols en de declaratie van variabelen.
Hier heeft midstuur nog geen waarde gekregen, dan ga ik er zomaar even vanuit dat hij door de compiler op 0 geïnitialiseerd wordt. Gezien je 'calibratieroutines' van midstuur denk ik dat je de toekenning aan stuurrechts en stuurlinks pas wilt doen NA de ERead (of na de nieuwe setting). Op dit punt in je code had er net zo goed kunnen staan stuurlinks=20 of stuurrechts=-20.

pic basic code:

 midstuur =  ERead 0  ;puls waarde die weg geschreven is terug inlezen
 If midstuur = 0 Then GoSub  schrijven   ;b2 is ingang setten ewrite
 If setting = 0 Then GoSub schrijven 
  DelayMS 100
 
 midgas = ERead 0
 midstuur = ERead 2
 midschakel = ERead 4

Dus ik zou zeggen NA bovenstaande code pas de stuurlinks / stuurrechts toekenning doen.
Ik snap eigenlijk niet hoe het momenteel kan werken, aangezien de middenstand om een pulslengte gaat en dus nooit 0 kan zijn. Een negatieve waarde voor stuurrechts wordt al helemaal lastig. Maar je zegt "het programma werkt", en op diverse plaatsen controleer je of stuur = stuurrechts. Dus OF ik zal iets niet begrijpen (best mogelijk), OF wat je nu hebt gepost is niet de programmacode die werkt (en dat is lastig als we je proberen te helpen).
.

pic basic code:

start:  

 While 1 = 1
  PulsIn PORTA.2,1,gas
  PulsIn PORTA.3,1,stuur
  PulsIn PORTA.4,1,schakel

De manual zegt

PULSIN Pin,State,Var

Maar bovenin je code worden gas/stuur/schakel als symbols voor de respectievelijke pinnen van PORTA gebruikt, en niet als variabele gedeclareerd:

pic basic code:

Symbol stuur   = PORTA.4      ;servostuur ingang
Symbol gas     = PORTA.2      ;servo gas ingang
Symbol schakel = PORTA.3      ;servo schakelaar

Je zegt dat je code werkt, dus kennelijk gaat PICBASIC alsnog inline een variabele voor je declareren met dezelfde naam als het symbol.

Het is in elk geval heel verwarrend dat je allemaal symbols definieert die je in de rest van je code (ook op andere plaatsen) vervolgens niet gebruikt, maar hard-coded PORTx.# neerzet.

Hier hetzelfde verhaal:

pic basic code:

      While 1 = 1
       PulsIn PORTA.3,1,schakel
       If schakel = midschakel Then Return
       Wend

Of hier:

pic basic code:

While stuur = stuurlinks
PulsIn PORTA.4,1,stuur 
Wend 

En nog iets over bovenstaande code: wat als de uitgelezen waarde van stuur nu eens net 1 stapje meer of minder is dan die afwijking van 20 ten opzichte van de middenstand? Het lijkt me dat je een band wilt definiëren. Zelfde voor mid-posities, tenzij je controller daar precies genoeg voor is.
.

pic basic code:

rechts:

 If e = 0 Then e = 1
 PulseOut PORTB.1 , 14 , High  ;link
  While stuur = stuurrechts 
 PulsIn PORTA.4,1,stuur
 Wend
 Return 
 rechts1:

 If e = 1 Then e = 0
 PulseOut PORTB.1 , 16 , High  ;link
  While stuur = stuurrechts 
 PulsIn PORTA.4,1,stuur
 Wend
 Return 

Wat betekent in bovenstaande code eigenlijk steeds het commentaar ;link ? Ik zie dat op diverse plaatsen terug.

Heb geduld: alle dingen zijn moeilijk voordat ze gemakkelijk worden.

beginnen bij het begin
ik gebruik proton basic

stuurrechts = midstuur -20

daar word inderdaad op dat ogenblik niets mee gedaan
maar dit dient om een dode slag te hebben anders zou de routine bijna elke keer aan gesproken worden om de pinkers uit of aan te zetten

Symbol ledwit = PORTB.0 ;controle ledje status
Symbol link = PORTB.1 ;uitgang naar achter modulle
Symbol stuur = PORTA.4 ;servostuur ingang
Symbol gas = PORTA.2 ;servo gas ingang
Symbol schakel = PORTA.3 ;servo schakelaar
Symbol setting = PORTB.5 ;setknopje
Symbol pinkl = PORTB.0 ;pinker links
Symbol pinkr = PORTB.1 ;pinker rechts
Symbol standl = PORTA.0 ;standlicht
Symbol grootl = PORTA.1 ;grootlicht
Symbol fare = PORTB.7 ;verstralers
Symbol mistl = PORTB.6 ;mistlampen

dit zijn al de in en uitgangen die worden als symbol gedefinieerd
hier mee geeft ik de poorten een naam zodat het programma leesbaarder word
doe ik dit niet dan is dit het verschil

pic basic code:


If e = 0 Then e = 1
 PulseOut PORTB.1 , 14 , High  ;link
  While stuur = stuurrechts 
 PulsIn PORTA.4,1,stuur
 Wend
 Return 

If e = 0 Then e = 1
 PulseOut PORTB.1 , 14 , High  ;link
  While PORTA.4 = stuurrechts 
 PulsIn PORTA.4,1,STUUR
 Wend
 Return 

wat nu hier gebeurt is dat of de linker of rechter poort van de pinkers word laag gemaakt
een aparte 12f629 die knipperd altijd maar als ik nu links of rechts laag maak dan knipperd de led van de pinkers dus wel zonder invloed van de rest van het programma

Dan je vraag naar de beschrijving "link"
dit is de infrarood link naar de trailer
dit staat reeds duidelijk vermeld bij de symbol bepaling

Symbol link = PORTB.1 ;uitgang naar achter modulle

de ingangen zijn stuur omdat het programma moet weten of het stuur recht ,links of rechts staat

ingang gas is om te kijken of je voor of achteruit rijd en heeft betrekking op de stop lichten

ingang schakel is een schakelaar die midden onder en boven heeft en waar je mee kiest welke lamp je wil inschakelen
knip je naar boven dan telt de teller op en knip je naar beneden den bevestig je deze lamp aan of uit te doen
is hij groter dan midschakel dan gaat hij naar de teller
is hij kleiner dan gaat hij naar setten waar hij dan dit tegen komt
If a1 = 1 Then GoTo setten2
If b1 = 1 Then GoTo setten2
If d1 = 1 Then GoTo setten2
a1 ,b1 en d1 zijn de betreffende lampen dat als die uit zijn en dus 1 dat niet de lamp nog eens word uit gezet maar dat het programma dan naar setten2 gaat en dan deze lamp aan doet
de schakelaar moet wel elke keer terug naar de midden stand voor hij verder optelt anders weet je nooit welke lamp je gekozen hebt

elke keer een lamp aan of uit gedaan word dan word een pwm over een infrarood verbinding gemaakt met de module in de trailer
PulseOut PORTB.1, 10 , High ;link
komt over een met de stop lichten te laten oplichten
If h = 0 Then PulseOut PORTB.1 , 12 , High ;link
en hier worden ze terug uitgezet

hopelijk een wat betere uitleg en morgen ga ik het programma aan passen met dat inspringen

gr raf

Gr Raf

Op 8 november 2019 15:28:48 schreef Jochem:

[...]Dat is inderdaad onderdeel van waarom er nog geen pasklaar antwoord is voorgeschoteld.

Twee weken verder nadat een speciaal herschreven code is geplaatst op verzoek van de lezers en helemaal niemand die er verder op ingaat.

Jochem

Golden Member

Ik probeer te helpen waar ik kan. Maar helaas wordt de helft van mijn vragen niet beantwoord.

En waar is die "speciaal herschreven code" te vinden? Het laatste wat raf zei was dat hij hem aan ging passen met dat inspringen.

.
Nog wat feedback:

Op 8 november 2019 17:15:29 schreef raf janssens:
stuurrechts = midstuur -20

daar word inderdaad op dat ogenblik niets mee gedaan
maar dit dient om een dode slag te hebben anders zou de routine bijna elke keer aan gesproken worden om de pinkers uit of aan te zetten

Er wordt wél wat mee gedaan, er wordt op verschillende plaatsen in je code aan gerefereerd.
Zoals hier

pic basic code:

While stuur = stuurlinks
PulsIn PORTA.4,1,stuur 
Wend 

.

Op 8 november 2019 17:15:29 schreef raf janssens:
Symbol ledwit = PORTB.0 ;controle ledje status
[..knip..]
Symbol mistl = PORTB.6 ;mistlampen

dit zijn al de in en uitgangen die worden als symbol gedefinieerd
hier mee geeft ik de poorten een naam zodat het programma leesbaarder word

Ik weet wat een symbol is. Maar er is een verschil tussen een symbol en een variabele. Door deze met dezelfde naam te gebruiken wordt het zo verwarrend dat je het kennelijk zelf niet meer snapt.

Ik probeer het nog een keer:
Er worden symbolen gedefinieerd die niet gebruikt worden. De symboolnamen worden vervolgens dubbel gebruikt als naam voor een variabele.

Dan je vraag naar de beschrijving "link"
dit is de infrarood link naar de trailer
dit staat reeds duidelijk vermeld bij de symbol bepaling

Symbol link = PORTB.1 ;uitgang naar achter modulle

Ik vraag wat het commentaar ;link betekent. Het symbol gebruik je daar helemaal niet. Dus je stelling "dit staat reeds duidelijk vermeld bij de symbol bepaling" is een onterecht verwijt aan mijn adres.

Heb geduld: alle dingen zijn moeilijk voordat ze gemakkelijk worden.
Jochem

Golden Member

Heb geduld: alle dingen zijn moeilijk voordat ze gemakkelijk worden.

Op 19 november 2019 17:12:27 schreef stortbak:
[...]
Twee weken verder nadat een speciaal herschreven code is geplaatst op verzoek van de lezers en helemaal niemand die er verder op ingaat.

Heeft hij misschien schrik om zelf nog iets te vragen?

Ik heb dat programma nu al enkele keren doorlezen en ik kan maar niet in de gedachtengang van de TS kruipen en ben waarschijnlijk niet de enige.
Petje af voor Jochem die dat wel kan.

code:

Ik vraag wat het commentaar ;link betekent. 
Het symbol gebruik je daar helemaal niet. Dus je stelling "dit staat reeds duidelijk vermeld bij de symbol bepaling" is een onterecht verwijt aan mijn adres.

Ik vermoed dat "link" een IR zenddiode is die op de trekker staat en op de aanhang/trailer een ontvangstdiode, gewoon een aan/af verbinding.

Ik ga nu eens iets stouts zeggen wat ik normaal gezien niet doe ;)

Zo'n programma die geen of weinig communicatie vergt is voor LDmicro een fluitje van een cent.
Een beginneling die al weet hoe het programma werkt zou zo'n programma kunnen maken in 1 of 2 dagen, een gevorderde in 1/2 dag en te beginnen van een blanco blad.

Het is een soort PLC denken maar o zo makkelijk voor besturingen.

Ik weet het, weeral een nieuwe taal om problemen in een andere taal op te lossen is niet wat je moet doen, maar als je toch een "risico" wilt nemen kijk er dan met een open geest naar, er zal voor u een heel andere wereld opengaan om dergelijke besturingen te maken.
Je zult nooit meer naar eender welke andere programmeertaal teruggaan >:)

LDmicro user.
Lambiek

Special Member

Hier heb je een voorbeeld met, "ON_HARDWARE_INTERRUPT" Je kunt de waarde achter TMR_1 veranderen om te zien wat er gebeurd. Of je zet een led op PORTB.0 om te zien wat er gebeurd, als je daar de tijd van wil veranderen moet je PS0, PS1, en PS2 veranderen. "zie boven bij TMR0 Prescaler Ratio Configurations"

pic basic code:


; TMR0 Prescaler Ratio Configurations                                               

; PS2 PS1 PS0 PSA=0 (External crystal OSC) PSA=1 (Internal WDT OSC)

; 7 6 5 4 3 2 1 0   OPTION_REG: OPTION REGISTER
; 0 0 0 0 0 0 0 0   1 : 2    1 : 1
; 0 0 0 0 0 0 0 1   1 : 4    1 : 2
; 0 0 0 0 0 0 1 0   1 : 8    1 : 4
; 0 0 0 0 0 0 1 1   1 : 16   1 : 8
; 0 0 0 0 0 1 0 0   1 : 32   1 : 16
; 0 0 0 0 0 1 0 1   1 : 64   1 : 32
; 0 0 0 0 0 1 1 0   1 : 128  1 : 64
; 0 0 0 0 0 1 1 1   1 : 256  1 : 128

; bit 7 RBPU: PORTB Pull-up Enable bit
; 1 = PORTB pull-ups are disabled
; 0 = PORTB pull-ups are enabled by individual PORT latch values

; bit 6 INTEDG: Interrupt Edge Select bit
; 1 = Interrupt on rising edge of INT pin
; 0 = Interrupt on falling edge of INT pin

; bit 5 T0CS: TMR0 Clock Source Select bit
; 1 = Transition on T0CKI pin
; 0 = Internal instruction cycle clock (FOSC/4)

; bit 4 T0SE: TMR0 Source Edge Select bit
; 1 = Increment on high-to-low transition on T0CKI pin
; 0 = Increment on low-to-high transition on T0CKI pin

; bit 3 PSA: Prescaler Assignment bit
; 1 = Prescaler is assigned to the WDT
; 0 = Prescaler is assigned to the Timer0 module

; bit 2-0 PS<2:0>: Prescaler Rate Select bits


Device 16F887                          ; Processor type

On_Hardware_Interrupt GoTo INTERRUPT_VLAG

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
Symbol NTEDG = OPTION_REG.6            ; Instelling interrupt selec bit
Symbol RBPU  = OPTION_REG.7            ; Instelling poort-b pull-up

Symbol LED = PORTA.0                   ; Uitgang voor led

Dim TMR_1 As Dword                     ; Variabele timer-1

Dim PULS As Bit                        ; Variabele puls voor timer-1

GoTo INSTELLING                        ; Spring over nterrupt

INTERRUPT_VLAG:                        ; Interrupt vlag

Context Save 
    If INTCONBITS_T0IF = 1 Then        ; Timer-0 interrupt vlag = 1
        PORTB.0 = PORTB.0 ^ 1          ; Zo nodig zet een puls op poort b
        ;OF Toggle PORTB.0             ; Zo nodig zet een PULS op poort b
       INTCONBITS_T0IF = 0             ; Timer-0 interrupt vlag = 0
    EndIf
Context 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
    NTEDG = 0                          ; Interrupt select bit
    RBPU  = 0                          ; Poort-B pull-up 
                                                   
    TMR0 = 0                           ; Reset TIMER0
    PULS = TMR0                        ; Puls voor gemaakte teller TMR_1
    T0IE = 1                           ; TIMER0 Interrupt enabel aan
    GIE  = 1                           ; Zet Interrupt aan

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

         ;76543210                     ; Hupregel analoog
;ADCON1 = %10000000                    ; ADCON1 register analoog 10 bit

         ;76543210                     ; Hulpregel analoog poort_B
;ANSELH = %00000000                    ; ANSEL register analoog poort_B


RUN:


    If PULS = 0 Then
       Inc TMR_1
       If TMR_1 > = 125000 Then
          LED = 1
          If TMR_1 > = 250000 Then
             LED = 0
             TMR_1 = 0
          EndIf
       EndIf
    EndIf
    
   
GoTo RUN

End
Als je haar maar goed zit, GROETEN LAMBIEK.

Op 22 november 2019 19:06:50 schreef Lambiek:
Hier heb je een voorbeeld

En weer is het Lambiek die met iets zinnigs komt.
Bedankt.

Ook ik zal het tzt eens gaan proberen.
Ik ben nu weer druk met draai- en freeswerk.

Nu tenminste ook de settings van ntedg.
Alleen heeft een pic volgens mij maar 1 zo'n (interrupt)uitgang.
Heb je dus 2 timers, kan je toch maar 1 uitgang sturen, werkt het nog niet.
Dat is later natuurlijk verder uit te zoeken.
Tot zover dank voor de bijdrage.

Die uitgang en interrupts hebben werkelijk helemaal niets met elkaar te maken. De CCP uitgang wordt direct door de timer aangestuurd, dat wordt geen code voor uitgevoerd.

De 16F887 heeft 2 dergelijke uitgangen, en modernere controllers hebben er vaak veel meer; een stuk of 8 voor de kleine, en meer dan 20 voor de grotere varianten.

Als een kleine vertraging (10-20 CPU cycles, dus ~1us @16MHz) acceptabel is, kun je elke willekeurige uitgang gebruiken, als je die in een interrupt service routine bestuurd, en die een beetje slim hebt opgezet.

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

Special Member

Op deze manier kun je afzonderlijke timers maken die je kunt koppelen aan een uitgang.

En kijk naar de reactie van SparkyGSX.

Ga hier maar eens een beetje mee spelen.

Op 22 november 2019 20:16:52 schreef stortbak:
Ook ik zal het tzt eens gaan proberen.

Moet toch te doorgronden zijn met de voorbeelden lijkt mij.

Nu tenminste ook de settings van ntedg.

Ik denk toch dat je, je zelf eens meer moet gaan verdiepen in de datasheet van je desbetreffende controller, daar staan alle settingen voor je registers in en nog veel meer. Als je dat niet doet kom je er nooit achter hoe je iets moet instellen of hoe iets werkt of werkend kan krijgen.

pic basic code:


; TMR0 Prescaler Ratio Configurations                                               

; PS2 PS1 PS0 PSA=0 (External crystal OSC) PSA=1 (Internal WDT OSC)

; 7 6 5 4 3 2 1 0   OPTION_REG: OPTION REGISTER
; 0 0 0 0 0 0 0 0   1 : 2    1 : 1
; 0 0 0 0 0 0 0 1   1 : 4    1 : 2
; 0 0 0 0 0 0 1 0   1 : 8    1 : 4
; 0 0 0 0 0 0 1 1   1 : 16   1 : 8
; 0 0 0 0 0 1 0 0   1 : 32   1 : 16
; 0 0 0 0 0 1 0 1   1 : 64   1 : 32
; 0 0 0 0 0 1 1 0   1 : 128  1 : 64
; 0 0 0 0 0 1 1 1   1 : 256  1 : 128

; bit 7 RBPU: PORTB Pull-up Enable bit
; 1 = PORTB pull-ups are disabled
; 0 = PORTB pull-ups are enabled by individual PORT latch values

; bit 6 INTEDG: Interrupt Edge Select bit
; 1 = Interrupt on rising edge of INT pin
; 0 = Interrupt on falling edge of INT pin

; bit 5 T0CS: TMR0 Clock Source Select bit
; 1 = Transition on T0CKI pin
; 0 = Internal instruction cycle clock (FOSC/4)

; bit 4 T0SE: TMR0 Source Edge Select bit
; 1 = Increment on high-to-low transition on T0CKI pin
; 0 = Increment on low-to-high transition on T0CKI pin

; bit 3 PSA: Prescaler Assignment bit
; 1 = Prescaler is assigned to the WDT
; 0 = Prescaler is assigned to the Timer0 module

; bit 2-0 PS<2:0>: Prescaler Rate Select bits


Device 16F887                          ; Processor type

On_Hardware_Interrupt GoTo INTERRUPT_VLAG

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
Symbol NTEDG = OPTION_REG.6            ; Instelling interrupt selec bit
Symbol RBPU  = OPTION_REG.7            ; Instelling poort-b pull-up

Symbol LED_0 = PORTA.0                 ; Uitgang voor led-0
Symbol LED_1 = PORTA.1                 ; Uitgang voor led-1
Symbol LED_2 = PORTA.2                 ; Uitgang voor led-2

Dim TMR_1 As Dword                     ; Variabele timer-1
Dim TMR_2 As Dword                     ; Variabele timer-2

Dim PULS As Bit                        ; Variabele puls voor timer-1 en timer-2

GoTo INSTELLING                        ; Spring over nterrupt

INTERRUPT_VLAG:                        ; Interrupt vlag

Context Save 
    If INTCONBITS_T0IF = 1 Then        ; Timer-0 interrupt vlag = 1
       Toggle PORTB.0                  ; Zo nodig zet een PULS op poort b
       INTCONBITS_T0IF = 0             ; Timer-0 interrupt vlag = 0
       
       PULS = PORTB.0                  ; Maak een puls voor TMR-1 en TMR-2
       
       If PULS = 1 Then                
       Inc TMR_1                       
           If TMR_1 > = 10 Then        ; Waarde TMR-1
              LED_0 = 1                
              If TMR_1 > = 20 Then     ; Waarde TMR-1
                 LED_0 = 0             
                 TMR_1 = 0             
              EndIf                    
           EndIf                       
       EndIf                           
    
       If PULS = 1 Then                
       Inc TMR_2                       
           If TMR_2 > = 20 Then        ; Waarde TMR-2
              LED_1 = 1                
              If TMR_2 > = 40 Then     ; Waarde TMR-2
                 LED_1 = 0             
                 TMR_2 = 0             
              EndIf                    
           EndIf                       
       EndIf                           
    EndIf                              
Context 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
    NTEDG = 0                          ; Interrupt select bit
    RBPU  = 0                          ; Poort-B pull-up 
                                                   
    TMR0 = 0                           ; Reset TIMER0
    T0IE = 1                           ; TIMER0 Interrupt enabel aan
    GIE  = 1                           ; Zet Interrupt aan
    
         ;543210                       ; Hulpregel poort A
PORTA  = %000000                       ; Maak poort A laag
TRISA  = %000000                       ; 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 8 bit

         ;76543210                     ; Hupregel analoog
;ADCON1 = %10000000                    ; ADCON1 register analoog 10 bit

         ;76543210                     ; Hulpregel analoog poort_B
;ANSELH = %00000000                    ; ANSEL register analoog poort_B


RUN:


    LED_2 = 1
    DelayMS 50
    LED_2 = 0
    DelayMS 50
      
GoTo RUN

End
Als je haar maar goed zit, GROETEN LAMBIEK.