Auteur Topic: Waar zijn we nu mee bezig ? Microcontrollers  (gelezen 285821 keer)

Offline raf

  • Forumlid
  • Berichten: 4.594
  • Voornaam: raf
Re: Waar zijn we nu mee bezig ? Microcontrollers
« Reactie #975 Gepost op: 04 januari 2016, 10:39:38 am »
hoi dani
ok maar gij gebruikt ook nog een computer om de rijwegen te bepalen
ik niet dat zit allemaal mee in die ene processor
er is 1 slaaf die een 6 tal wissels bestuurt allemaal met en servo als motor
dus er moeten zo wie zo 6 uitgangen gebruikt worden om die aan te sturen
dan 2 ingangen voor de data en adres lijn en daar is dus een groot deel software voor nodig
ik post straks de code van de zender eventjes
de code van de zender

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 Potmeter     = PORTA.1 ;PORTA.1 heet vanaf nu 'Potmeter'
Symbol delay        = PORTA.0  ;dit is de knop die na het weg rijden alles wist



Dim a As Word
Dim Weerstand As Word         ;WORD variabele, bevat straks de stand van de potmeter
Dim cijfer As Word
Dim cijfer1 As Word
Dim cijfer2 As Word
Dim blok As Word
Clear                         ;Wis alle RAM geheugen
DelayMS 100                   ;LCD stabilisering

Cls


start:
Print At 1,1, "cijfer1 -"
Print At 2,1,"cijfer2-"
  While PORTA.1 = 1 : Wend
  High Potmeter               ;Condensator die aan de potmeterpoort zit ontladen
  DelayMS 1                   ;Even wachten zodat condensator helemaal leeg is
  Weerstand = RCIn Potmeter, High   ;Geef RC oplaadtijd aan variabele 'Weerstand'
       
   
    Print At 1,12,"    "
    Print At 1,12,Dec Weerstand
    DelayMS 200
  GoSub test
  cijfer1 = cijfer
  Print At 1,10, Dec cijfer1
  While PORTA.1 = 1 : Wend
  GoTo start2
 
  start2:
   High Potmeter               ;Condensator die aan de potmeterpoort zit ontladen
  DelayMS 1                   ;Even wachten zodat condensator helemaal leeg is
  Weerstand = RCIn Potmeter, High   ;Geef RC oplaadtijd aan variabele 'Weerstand'
   
   While PORTA.1 = 1 : Wend
    DelayMS 200
    Print At 2,12,"    "
    Print At 2,12,Dec Weerstand
   
    GoSub test
  cijfer2 = cijfer
  Print At 2,10, Dec cijfer2
    While PORTA.1 = 1 : Wend
    GoSub vrijgave
DelayMS 100
 Print At 1,10, "  "
 Print At 2,10, "  "
 
 Print At 1,12,"reset"
 Print At 2,12,"knop"
 While delay = 1 : Wend      ;wachten tot de reset knop is gedrukt
 GoSub resetknop
GoTo start

 
 
 
 
 
 
 test:
     cijfer = 0
  Select Weerstand          ;We gaan de variabele met de naam 'Weerstand' testen
 
      Case <  2
       cijfer = 1  ;Is 'Weerstand' kleiner dan 31, dan is het toets 1, anders
      Case <  60
       cijfer = 2  ;Is 'Weerstand' kleiner dan 94, dan is het toets 2, anders
       
      Case < 133
      cijfer = 3  ;...enz
      Case < 192
      cijfer = 4
      Case < 264
       cijfer = 5
      Case < 339
       cijfer = 6
       Case < 419
       cijfer = 7
       Case < 1208
       cijfer =14
       
     
    End Select
   
    Return
 
    vrijgave:
    ;processor slave 1
    If cijfer1 = 1 And cijfer2 = 2 Then GoTo pak1
    If cijfer1 = 1 And cijfer2 = 4 Then GoTo pak2
    If cijfer1 = 1 And cijfer2 = 3 Then GoTo pak3
    If cijfer1 = 1 And cijfer2 = 5 Then GoTo pak4
    If cijfer1 = 1 And cijfer2 = 6 Then GoTo pak5
    If cijfer1 = 1 And cijfer2 = 7 Then GoTo pak6
    If cijfer1 = 1 And cijfer2 = 14 Then GoTo pak7
    If cijfer1 = 2 And cijfer2 = 4 Then GoTo pak8
    If cijfer1 = 2 And cijfer2 = 14 Then GoTo pak9
    If cijfer1 = 3 And cijfer2 = 5 Then GoTo pak10
    If cijfer1 = 3 And cijfer2 = 6 Then GoTo pak11
    If cijfer1 = 3 And cijfer2 = 7 Then GoTo pak12
    If cijfer1 = 3 And cijfer2 = 14 Then GoTo pak13
    If cijfer1 = 4 And cijfer2 = 14 Then GoTo pak14
    If cijfer1 = 6 And cijfer2 = 7 Then GoTo pak15
    If cijfer1 = 6 And cijfer2 = 14 Then GoTo pak16
    If cijfer1 = 7 And cijfer2 = 14 Then GoTo pak17
    If cijfer1 = 2 And cijfer2 = 1 Then GoTo pak1
    If cijfer1 = 4 And cijfer2 = 1 Then GoTo pak2
    If cijfer1 = 3 And cijfer2 = 1 Then GoTo pak3
    If cijfer1 = 5 And cijfer2 = 1 Then GoTo pak4
    If cijfer1 = 6 And cijfer2 = 1 Then GoTo pak5
    If cijfer1 = 7 And cijfer2 = 1 Then GoTo pak6
    If cijfer1 = 14 And cijfer2 = 1 Then GoTo pak7
    If cijfer1 = 4 And cijfer2 = 2 Then GoTo pak8
    If cijfer1 = 14 And cijfer2 = 2 Then GoTo pak9
    If cijfer1 = 5 And cijfer2 = 3 Then GoTo pak10
    If cijfer1 = 6 And cijfer2 = 3 Then GoTo pak11
    If cijfer1 = 7 And cijfer2 = 3 Then GoTo pak12
    If cijfer1 = 14 And cijfer2 = 3 Then GoTo pak13
    If cijfer1 = 14 And cijfer2 = 4 Then GoTo pak14
    If cijfer1 = 7 And cijfer2 = 6 Then GoTo pak15
    If cijfer1 = 14 And cijfer2 = 6 Then GoTo pak16
    If cijfer1 = 14 And cijfer2 = 7 Then GoTo pak17
    ;processor slave 2 
    If cijfer1 = 8 And cijfer2 = 14 Then GoTo pak18
    If cijfer1 = 14 And cijfer2 = 8 Then GoTo pak18
    If cijfer1 = 9 And cijfer2 = 14 Then GoTo pak19
    If cijfer1 = 14 And cijfer2 = 9 Then GoTo pak19
    If cijfer1 = 10 And cijfer2 = 14 Then GoTo pak20
    If cijfer1 = 14 And cijfer2 = 10 Then GoTo pak20
    If cijfer1 = 11 And cijfer2 = 14 Then GoTo pak21
    If cijfer1 = 14 And cijfer2 = 11 Then GoTo pak21
    If cijfer1 = 12 And cijfer2 = 14 Then GoTo pak22
    If cijfer1 = 14 And cijfer2 = 12 Then GoTo pak22
    If cijfer1 = 13 And cijfer2 = 14 Then GoTo pak23
    If cijfer1 = 14 And cijfer2 = 13 Then GoTo pak23
    If cijfer1 = 14 And cijfer2 = 15 Then GoTo pak24
    If cijfer1 = 15 And cijfer2 = 14 Then GoTo pak24
    If cijfer1 = 14 And cijfer2 = 16 Then GoTo pak25
    If cijfer1 = 16 And cijfer2 = 14 Then GoTo pak25
    If cijfer1 = 14 And cijfer2 = 18 Then GoTo pak26
    If cijfer1 = 18 And cijfer2 = 14 Then GoTo pak26
    If cijfer1 = 14 And cijfer2 = 19 Then GoTo pak27
    If cijfer1 = 19 And cijfer2 = 14 Then GoTo pak27 
   ; If cijfer1 = 14 And cijfer2 = 20 Then GoTo pak28
   ; If cijfer1 = 20 And cijfer2 = 14 Then GoTo pak28
   
'    If cijfer1 = 9 And cijfer2 = 10 Then GoTo pak29
'    If cijfer1 = 10 And cijfer2 = 9 Then GoTo pak29
    'If cijfer1 = 8 And cijfer2 = 10 Then GoTo pak30
    'If cijfer1 = 10 And cijfer2 = 8 Then GoTo pak30
    'If cijfer1 = 8 And cijfer2 = 9 Then GoTo pak31
    'If cijfer1 = 9 And cijfer2 = 8 Then GoTo pak31
    'If cijfer1 = 12 And cijfer2 = 13 Then GoTo pak32
    'If cijfer1 = 13 And cijfer2 = 12 Then GoTo pak32
    'If cijfer1 = 11 And cijfer2 = 13 Then GoTo pak33
    'If cijfer1 = 13 And cijfer2 = 11 Then GoTo pak33
    'If cijfer1 = 11 And cijfer2 = 12 Then GoTo pak34
    'If cijfer1 = 12 And cijfer2 = 11 Then GoTo pak34
    ' If cijfer1 = 15 And cijfer2 = 17 Then GoTo pak35
    'If cijfer1 = 17 And cijfer2 = 15 Then GoTo pak35
    'If cijfer1 = 16 And cijfer2 = 17 Then GoTo pak36
    'If cijfer1 = 17 And cijfer2 = 16 Then GoTo pak36
    'If cijfer1 = 18 And cijfer2 = 16 Then GoTo pak37
    'If cijfer1 = 19 And cijfer2 = 17 Then GoTo pak38
    'If cijfer1 = 20 And cijfer2 = 17 Then GoTo pak39
    'If cijfer1 = 16 And cijfer2 = 21 Then GoTo pak40
    'If cijfer1 = 21 And cijfer2 = 16 Then GoTo pak40
 Cls
 
 Print "foutieve ingave"
 DelayMS 1000
 Cls
 Return
 
 
 pak1:  ; van 1 naar2
  blok = 10: GoSub GeefBlokVrij
  Return
 
 pak2: ;van 1 naar 4
   blok = 20: GoSub GeefBlokVrij
   Return
 
 pak3: ;van 1 naar 3
   blok = 30: GoSub GeefBlokVrij
   Return
 
 pak4: ;van 1 naar 5
   blok = 40: GoSub GeefBlokVrij
   Return
   
 pak5:  ;van 1 naar 6
   blok = 50: GoSub GeefBlokVrij
   Return
 
 pak6:      ;van 1 naar 7
  blok = 60: GoSub GeefBlokVrij
  Return
 pak7:   ;van 1 naar 14
  blok = 70: GoSub GeefBlokVrij
  Return
   
 pak8:   ;van 2 naar 4
  blok = 80: GoSub GeefBlokVrij 
  Return
     
 pak9:    ;van 2 naar 14
  blok = 90: GoSub GeefBlokVrij
  Return
   
 pak10:   ;van 3 naar 5
  blok = 100: GoSub GeefBlokVrij   
  Return   
   
 pak11:  ;van 3 naar 6
   blok = 110: GoSub GeefBlokVrij
   Return
       
 pak12: ;van 3 naar 7
   blok = 120: GoSub GeefBlokVrij 
   Return
   
 pak13: ;van 3 naar 14 
   blok = 130: GoSub GeefBlokVrij   
   Return 
 pak14:;van 4 naar 14
   blok = 140: GoSub GeefBlokVrij   
 
   Return   
  pak15: ;van 6 naar7   
   blok = 150: GoSub GeefBlokVrij
   Return
   
  pak16: ;van 6 naar 14
   blok = 160: GoSub GeefBlokVrij 
   Return 
   
  pak17:  ;van 7 naar 14
   blok = 170: GoSub GeefBlokVrij   
   Return 
   
  pak18:;van 8 naar 14
  blok = 180 :GoSub GeefBlokVrij   
   Return   
   
   pak19:;van 9 naar 14
  blok = 190 :GoSub GeefBlokVrij   
   Return     
   
  pak20:;van 10 naar 14
  blok = 200 :GoSub GeefBlokVrij   
   Return     
  pak21:;van 11 naar 14
  blok = 210 :GoSub GeefBlokVrij   
   Return     

   pak22:;van 12 naar 14
  blok = 220 :GoSub GeefBlokVrij   
   Return   
    pak23:;van 13 naar 14
  blok = 230 :GoSub GeefBlokVrij   
   Return   
  pak24:;van 15 naar 14
  blok = 240 :GoSub GeefBlokVrij   
   Return   
   pak25:;van 16 naar 14
  blok = 250 :GoSub GeefBlokVrij   
   Return 
   pak26:;van 18 naar 14
  blok = 260 :GoSub GeefBlokVrij   
   Return   
   pak27:;van 19 naar 14
  blok = 270 :GoSub GeefBlokVrij   
   Return   
   pak28:;van 20 naar 14
  blok = 280 :GoSub GeefBlokVrij   
   Return   
  pak29:;van 10 naar 9
  blok = 290 :GoSub GeefBlokVrij   
   Return     
   pak30:;van 8 naar 10
  blok = 300 :GoSub GeefBlokVrij   
   Return   
   pak31:;van 8 naar 9
  blok = 31 :GoSub GeefBlokVrij   
   Return
   pak32:;van 12 naar 13
  blok = 320 :GoSub GeefBlokVrij   
   Return   
   pak33:;van 11 naar 13
  blok = 330 :GoSub GeefBlokVrij   
   Return   
   pak34:;van 11 naar 12
  blok = 340 :GoSub GeefBlokVrij   
   Return   
  pak35:;van 17 naar 15
  blok = 350 :GoSub GeefBlokVrij   
   Return     
  pak36:;van 16 naar 17
  blok = 360 :GoSub GeefBlokVrij   
   Return     
  pak37:;van 18 naar 16
  blok = 370 :GoSub GeefBlokVrij   
   Return     
  pak38:;van 19 naar 17
  blok = 380 :GoSub GeefBlokVrij   
   Return     
  pak39:;van 20 naar 17
  blok = 390 :GoSub GeefBlokVrij   
   Return     
   pak40:;van 16 naar 21
  blok = 400 :GoSub GeefBlokVrij   
   Return   

 GeefBlokVrij:

 PulseOut PORTA.2, blok , High
 DelayMS 10
 While PORTA.0 = 1 :Wend
 Return
 
resetknop:
  PulseOut PORTA.3, blok , High
  DelayMS 10
  Print At 1,12,"     "
 Print At 2,12,"    "
  Return

en wat uitleg
je kiest eerst waar je vanaf wil vertrekken
dan waar je naar toe wil
dan zet de zender een code op de bus waar de slaven dan hun adres van krijgen wat ook meteen is wat ze moeten doen
BV
vertrek 1 naar 14
dan word de code 70 op de adreslijn gezet
elke slaaf die nu code 70 herkent reageerd op deze code en doet dan zijn ding
de wissels worden gezet en de blokken worden vrij gegeven dit gebeurt altijd ook al is een blok bezet
want de blokken zelf controleren of ze bezet zijn of niet en houden zelf de voor en achterliggen de blokken in het oog
bv van 1 naar 14 worden deze blokken gezet
blok1
wissel 1 recht
blok 2
blok 4
wissel 6 rond
wissel 4 ronde
wissel 3 rond
blok 14
als nu blok 4 bezet is dan gaat de loco rijden om in blok 2 tot stilstand te komen  want blok 4 is bezet
hier de lay out


hopelijk begrijp naar maar als je een manier vind om de code makkelijker te krijgen ben ik een en al oor
gr raf 
Na 5 herseninfarcten kan het raar zijn wat ik schrijf .Dat is niet mijn fout maar je bril kuisen kan helpen en eens twee keer overlezen .Versta je het nog niet kan ik altijd de Ierse versie er nog van geven die leest misschien iets makkelijker

Offline dani

  • Forumlid
  • Berichten: 5.850
  • Game over. Insert coin.
  • Voornaam: Dani
Re: Waar zijn we nu mee bezig ? Microcontrollers
« Reactie #976 Gepost op: 04 januari 2016, 11:05:45 am »
niks computer....  enkel om de data op te slaan.     Dat doe jij toch ook, je gebruikt je pc om je PIC te programmeren.

Laat maar, we praten naast mekaar
QUICK...  Switch off that fan, before something brown hits it !

Offline raf

  • Forumlid
  • Berichten: 4.594
  • Voornaam: raf
Re: Waar zijn we nu mee bezig ? Microcontrollers
« Reactie #977 Gepost op: 04 januari 2016, 12:23:45 pm »
 ja maar nadien als de pic geprogrammeerd is staat die wel los van de computer
en ik sla op de pc dus geen data op maar gebruik die alleen maar om de pic te programmeren

gr raf
Na 5 herseninfarcten kan het raar zijn wat ik schrijf .Dat is niet mijn fout maar je bril kuisen kan helpen en eens twee keer overlezen .Versta je het nog niet kan ik altijd de Ierse versie er nog van geven die leest misschien iets makkelijker

Offline dani

  • Forumlid
  • Berichten: 5.850
  • Game over. Insert coin.
  • Voornaam: Dani
Re: Waar zijn we nu mee bezig ? Microcontrollers
« Reactie #978 Gepost op: 04 januari 2016, 13:13:03 pm »
dat is bij de arduino ook zo, die pikt de signalen van de DCC centrale op als commando's ipv dat jij op knopkes drukt.


Even je code bekeken, en ik heb alweer 30 nieuwe grijze haren.
IF.. and... GOTO. en dat maal n-tig.   Dat is spaghetti uit de goede oude tijd inderdaad.

Bestaat er niet zo iets als een "switch" of  "case" statement  om multiple vertakkingen te maken in dezelfde code ?
En wat die   "if ... and ...." betreft :   gebruik wat wiskunde en het wordt makkelijker !!

een voorbeeld
* cijfer1 en cijfer2 kunnen blijkbaar van  1 tot 21 of zo lopen  (of verder).

Als je dat omzet in unieke waarden en er een enkel getal van maakt, kan je prima met een "switch" structuur werken.
vb   (met een nieuwe variabele   "doel" van het "unsigned integer" type)

doel =  cijfer1*100 + cijfer2
   (je hebt dan een getal tot maximaal 9999)
bepaal de mogelijke waarden van "doel"  en koppel daar de akties uit je  "go to"  blokken aan.

vb  ( van arduino)

switch (doel)
{case  2 :
     hier de acties voor dit geval
  break;
case  109 :
     hier de acties voor dit geval
  break;
case  215 :
     hier de acties voor dit geval
  break;
.... etc
}

Deze manier van "branching" is veeeeel minder belastend voor je processor/ALU  dan al die IF... na elkaar 

Als dat toch niet zou bestaan, overweeg dan eens om  in het einde van je  "goto blokken" de return te vervangen door een andere  goto  die zich NA  al die opeenvolgende  IF... statements bevindt !!!   Dan ga je niet al de onnodige  IF's doorlopen  eens je een passende waarde hebt   (dat is de filosofie achter de Switch structuur).

Daarmee kan je PAKKEN  cycle tijden besparen , zelfs met gebruik van Goto's..

En in jouw geval kan het nog simpeler als je de   "goto's " en de  "pak..."  combineert.  want je doet telkens het zelfde...



BVB:

  If cijfer1 = 19 And cijfer2 = 14 Then GoTo pak27 
En dan
 pak27:;van 19 naar 14
  blok = 270 :GoSub GeefBlokVrij   
   Return   


Maak daar zoals hierboven dan van :   (alweer Arduino syntax)

.
.
.
.
.
if (doel == 1914)     {blok=270; goto EINDELUS;}
.
.
.
.
.

EINDELUS:
Geefblokvrij();
// en dan de rest van je code

QUICK...  Switch off that fan, before something brown hits it !

Offline raf

  • Forumlid
  • Berichten: 4.594
  • Voornaam: raf
Re: Waar zijn we nu mee bezig ? Microcontrollers
« Reactie #979 Gepost op: 04 januari 2016, 13:47:16 pm »
arduino en proton basic lopen ver uit elkaar
maar ik zal de code eens opnieuw bekijken
zoals ze nu is werkt ze en ja als je 59 jaar bent en 30 jaar geleden begonnen bent met basic dan programmeer je op de oude manier
hoofd zaak is dat ze werkt hoe je het ook doet en tijd ach als je naar de 60 gaat heb je tijd
en een loco is nu eenmaal het langzame element in heel de zaak
maar ik zal het eens bekijken of het inderdaad nog iets meer gestroomlijnd kan
gr raf en reeds bedankt want het kan alleen maar beter werken
Na 5 herseninfarcten kan het raar zijn wat ik schrijf .Dat is niet mijn fout maar je bril kuisen kan helpen en eens twee keer overlezen .Versta je het nog niet kan ik altijd de Ierse versie er nog van geven die leest misschien iets makkelijker

Offline raf

  • Forumlid
  • Berichten: 4.594
  • Voornaam: raf
Re: Waar zijn we nu mee bezig ? Microcontrollers
« Reactie #980 Gepost op: 04 januari 2016, 15:51:18 pm »
ok dani ik doe echt wel wat met je input hoor maar het naar proton omzetten is niet altijd evident

wat ik gedaan heb tot nu toe

pak2:  ;14-18
    Print At 2,6,"           "               
  Print At 2,6, "14-18"                   
     PORTA.6 = 1
     PORTA.0 = 1
      PORTA.0 = 1                                 
    DelayMS 500   ;While PORTA.5 = 1 :Wend                 
     PORTA.0 = 0                       
     PORTA.6 = 0
     PORTA.0 = 0                             
  DelayMS 200                               
  Return

dit was het en dit is het geworden
pak2:  ;14-18             
    Print At 2,6, "14-18"     
    PORTA = %01100001                                             
    GoSub wachten
    PORTA = %00100000                             
    DelayMS 200                               
  Return

voordeel is er niet wat processor ruimte aan gaat eigenlijk
want ik win nagenoeg niets
er is nu een blok wachten aan gemaakt

 wachten:
  While PORTA.5 = 1 :Wend
  Return
nu heb ik dus maar 1 wacht blok voor al de andere blokken wat dus een besparing zou moeten zijn
hier word dus gewacht tot de master over zijn tweede data lijn alle processoren op porta.5 een 0 aan bied waarna ze terug springen en hun betreffende blokken terug sperren

het blijft wel veul werk lol
maar plezant om te doen
gr raf
Na 5 herseninfarcten kan het raar zijn wat ik schrijf .Dat is niet mijn fout maar je bril kuisen kan helpen en eens twee keer overlezen .Versta je het nog niet kan ik altijd de Ierse versie er nog van geven die leest misschien iets makkelijker

Offline dani

  • Forumlid
  • Berichten: 5.850
  • Game over. Insert coin.
  • Voornaam: Dani
Re: Waar zijn we nu mee bezig ? Microcontrollers
« Reactie #981 Gepost op: 04 januari 2016, 16:10:19 pm »
ik heb inderdaad de indruk dat de talen uit elkaar lopen, maar toch blijft de logica er achter gelijkaardig.  Ik zou me eens moeten verdiepen in die "proton basic" taal.


Dit is wat ik bedoelde met die   "switch case" instructies.

In Proton Basic is dat blijkbaar  "select case" maar het bestaat dus wel !


http://www.protonbasic.co.uk/showthread.php/56507-select-case-else


select X
 case 1 : xxx
 case 2 : yyy
 case else : zzz
 EndSelect

QUICK...  Switch off that fan, before something brown hits it !

Offline raf

  • Forumlid
  • Berichten: 4.594
  • Voornaam: raf
Re: Waar zijn we nu mee bezig ? Microcontrollers
« Reactie #982 Gepost op: 04 januari 2016, 17:27:50 pm »
ja select case bestaat maar werkt niet echt evident
 Select Weerstand          ;We gaan de variabele met de naam 'Weerstand' testen
 
      Case <  2
       cijfer = 1  ;Is 'Weerstand' kleiner dan 2, dan is het toets 1, anders
      Case <  60
       cijfer = 2  ;Is 'Weerstand' kleiner dan 60, dan is het toets 2, anders
      Case < 133
      cijfer = 3  ;...enz
      Case < 192
      cijfer = 4
      Case < 264
       cijfer = 5
      Case < 339
       cijfer = 6
       Case < 419
       cijfer = 7
        Case < 264
       cijfer = 8
      Case < 339
       cijfer = 9
       Case < 419
       cijfer = 10
       Case < 264
       cijfer = 11
      Case < 339
       cijfer = 12
       Case < 419
       cijfer = 13       
      Case < 1208
       cijfer =14
       Case < 264
       cijfer = 15
      Case < 339
       cijfer = 16
       Case < 419
       cijfer = 17       
      Case < 1208
       cijfer =18
     
    End Select

hier gebruik ik ze in de schakeling waar de knoppen aan hangen
maar in de slaven is het niet zo evident om ze daar te gebruiken omdat er per pak verschillende instructies moeten doorlopen worden
en er kan naar meerdere pak's gesprongen worden om dat er over het zelfde spoor gereden word en daarom schrijf ik daar niet terug een pak code voor
BV van 10 naar 14 gebruikt het pak van 8 naar 14 om de wissels reeds te zetten en dan die van 9 naar 14 om de blokken vrij te geven en dan uiteindelijk het pak van 10 wat er ook voor zorgt dat de deur van de loods open gaat voor de loco kan vertrekken
als de loco in 14 is aangekomen dan zijn de deuren reeds terug aan het dicht gaan en dat gebeurt dan weer door de detectie in blok 8
maar voor van blok 14 naar blok 10 te rijden gelden dan weer andere criteria
de deuren gaan pas open als de loco blok 8 binnen rijd en bij het binnen rijden van blok 10 gaan ze na een bepaalde tijd weer terug dicht want anders zit de loco tussen de deuren   en dat is niet de bedoeling
er komt nog een schakelaar in de loods gemonteerd achter aan die gaat bepalen of de deuren terug dicht gaan
gr raf
Na 5 herseninfarcten kan het raar zijn wat ik schrijf .Dat is niet mijn fout maar je bril kuisen kan helpen en eens twee keer overlezen .Versta je het nog niet kan ik altijd de Ierse versie er nog van geven die leest misschien iets makkelijker

Offline patrick smout

  • Forumlid
  • Berichten: 165
  • Voornaam: patrick
Re: Waar zijn we nu mee bezig ? Microcontrollers
« Reactie #983 Gepost op: 05 januari 2016, 00:34:32 am »
raf,

ik ben niet vertrouwd met proton basic maar dit probleem leent zich voor een zogenaamde datadriven aanpak.
Hierbij worden condities en daaruit volgende acties vastgelegd via datastructuren en niet via code.
Dit is veel flexibeler en levert in veel gevallen ook compactere code op.

Toegespitst op jouw code voor het omzetten van cijfercombinaties naar de blokken zou dit als volgt er uit kunnen zien (mogelijk compileert dit niet maar het geeft een beeld):


index = 0

while cijfer1lijst[index]<>0

If cijfer1=cijfer1lijst[index] And cijfer2 = cijfer2lijst[index] Then Blok = Bloklijst[index] : GoSub GeefBlokVrij :return
index = index+1

whend



De 3 arrays dien je vooraf te initialiseren met de cijfer/blok gegevens. Het einde van de lijst geef je aan met een 0
Heel de logica is dan gereduceerd tot een handvol lijnen code en 3 arrays met data.

mvg,

Patrick Smout

Offline sn00zerman

  • Forumlid
  • Berichten: 162
    • http://www.digitalplayground.be
  • Voornaam: Kris
Re: Waar zijn we nu mee bezig ? Microcontrollers
« Reactie #984 Gepost op: 05 januari 2016, 11:07:15 am »
Raf,

De logica van je select case in je laatst geposte code ontgaat me een beetje.
- je hebt meermaals dezelfde case in je lijst, alleen de waarde van de laatste case die geldig
  is, zal effect hebben op je "cijfer".
- Moet de volgorde niet van groot naar klein ingesteld worden ?
  als je weerstand kleiner is dan 2, wil je cijfer 1, en als weerstand kleiner is dan 60, wil je 
  cijfer 2. echter, als je weerstand kleiner is dan 2, krijg je dus ook cijfer 2, doordat kleiner
  dan 60, eigenlijk die eerste case overruled ...

- je zou je case ook kunnen opbouwen als:
  case < 2
  case > 1 and < 60
  case > 59 and < 133


succes,
Kris
-=[www.digitalplayground.be]=-
Where fun meets technology ...

Offline Steam.N

  • Administrator
  • Forumlid
  • Berichten: 9.382
  • Voornaam: Jean
Re: Waar zijn we nu mee bezig ? Microcontrollers
« Reactie #985 Gepost op: 05 januari 2016, 11:15:57 am »
Kris,  volgens mij moeten in dit voorbeeld de condities "> 1" en "> 59" er zelfs  niet bijstaan, want daar is automatisch aan voldaan door de vorige stappen:
de eerste "case" waaraan voldaan wordt, wordt uitgevoerd, waarna je uit de "select case" instructie springt.
De sortering van de voorwaarden moet dus van klein naar groot. (denk ik dan zo  ;) )
Knutselgroeten !  Jean       TP-I (B) & TP-II (DR) - N - DC - Handbediening - Zelfbouw  { Sedelocus - De Feniks - Pira-N's Crossing - Turnhout NEEB - Scrap Yard }

Offline dani

  • Forumlid
  • Berichten: 5.850
  • Game over. Insert coin.
  • Voornaam: Dani
Re: Waar zijn we nu mee bezig ? Microcontrollers
« Reactie #986 Gepost op: 05 januari 2016, 11:30:47 am »
het blijft een spaghetti :-)
QUICK...  Switch off that fan, before something brown hits it !

Offline Steam.N

  • Administrator
  • Forumlid
  • Berichten: 9.382
  • Voornaam: Jean
Re: Waar zijn we nu mee bezig ? Microcontrollers
« Reactie #987 Gepost op: 05 januari 2016, 11:44:40 am »
het blijft een spaghetti :-)

Yep.  Patrick's oplossing is een heel stuk overzichtelijker  ;)
Knutselgroeten !  Jean       TP-I (B) & TP-II (DR) - N - DC - Handbediening - Zelfbouw  { Sedelocus - De Feniks - Pira-N's Crossing - Turnhout NEEB - Scrap Yard }

Offline raf

  • Forumlid
  • Berichten: 4.594
  • Voornaam: raf
Re: Waar zijn we nu mee bezig ? Microcontrollers
« Reactie #988 Gepost op: 05 januari 2016, 13:16:30 pm »
ok patrick efkes proberen om te zetten

geen code maar gewoon efkes denken

je maakt dus een array index [40] want er zijn 40 mogelijkheden
heel die index moet je dus eerst vullen met data en dat kost ook geheugen plaats want het is niet 1,2,3 maar het is < 2 of <10 of < 50 of <240
dus index = index + 1 gaat niet kloppen
de reden is dat ik 18 knoppen op 1 ingang heb zitten met een weerstands array en elke weerstand is niet 100% gelijk dus er is een afwijking in de gemeten ingaven daarom < 2 of <10 of < 50 of <240 zo valt de betreffende knop altijd ergens in een gebied dat juist is
en op de andere manier ziet het uit of het effectieve waarden moeten zijn

en ja het ziet er uit als spaghetti maar met saus en gehakt is da ook lekker

Jean de case zoals ik ze gebruikt heb werkt zo inderdaad
<2 kan dus alleen maar 1 zijn want 0 is niet toegelaten
da < 10 kan alleen maar tussen 2 en 10 zijn enz.
en ja je springt uit de case routine indien aan de voorwaarde is voldaan
die arry kan ook maar dan moet ik hem alsnog vullen en dat kost ook veel geheugen
BV
cijfer(1,1) = 1 ,cijfer(1,2) =2 ,pak(1,3) = 10
cijfer(2,1) = 1 ,cijfer(2,2) =3 ,pak(2,3) = 20
enz.
nadien al die array's terug af gaan om te kijken welke klopt gaat misschien wel sneller maar er is tijd genoeg om de baan want de loco is het traagste element in het geheel
hij moet het traject afleggen voor er een nieuw kan ingegeven worden

 
 gr raf
Na 5 herseninfarcten kan het raar zijn wat ik schrijf .Dat is niet mijn fout maar je bril kuisen kan helpen en eens twee keer overlezen .Versta je het nog niet kan ik altijd de Ierse versie er nog van geven die leest misschien iets makkelijker

Offline dani

  • Forumlid
  • Berichten: 5.850
  • Game over. Insert coin.
  • Voornaam: Dani
Re: Waar zijn we nu mee bezig ? Microcontrollers
« Reactie #989 Gepost op: 05 januari 2016, 13:52:36 pm »
je maakt dus een array index [40] want er zijn 40 mogelijkheden
heel die index moet je dus eerst vullen met data en dat kost ook geheugen plaats want het is niet 1,2,3 maar het is < 2 of <10 of < 50 of <240
Dat is nu net de kracht van de arrays, je kan er meerdere in parallel bekijken of meerdimensionele maken.
En als je het type variabele in je arrays simpel houdt  (bvb een integer of byte  waarde) dan pakt dat veel minder geheugen in dan een ellenlang stuk programma code.


Als je een array maakt van 40 plaatsen met daarin 2 kolommen, zijnd e de te vergelijken waarde  (2, 10, 50, 240, .... uit je voorbeeld)  en in de tweede kolom de doel waarde (doe je moet verwerken) dan ben je er al.

Maar ik heb de indruk dat dit te complex aan het worden is, zoals je zelf al zei dateert je programmeerkennis nog van vroeger en heb je die "nieuwe" dingen niet zo mee gevolgd.

Dus soit, als het op jouw manier werkt, dan is dat voor mij goed.
QUICK...  Switch off that fan, before something brown hits it !