Nieuws:

Nu in MSM 244 REPORTAGE: De Nederlandse Modelspoordagen * A4 Dioramawedstrijd * Virtuele Messe 2024

Hoofdmenu

verzorging depot asche aan zee

Gestart door raf, 09 december 2015, 08:59:08 AM

raf

hoi daar ik tegen problemen aan loop met communicatie bussen ga ik proberen mijn eigen protocol op te zetten om mijn digitale/analoog baan te sturen .

elke wissel krijgt een slaaf processor
elke stopplaats krijgt een processor en die dient ook meteen als bezet melder
1 master die de rijwegen en de communicatie bepaald

gebruik van 3 communicatie lijnen tussen alle processoren
pwm signaal om te bepalen wie wat waar moet gaan doen

nu aan de gang om een master te programmeren

gr raf en hopelijk snel een vervolg
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

Geert

#1
Welke problemen bedoel je met communicatie bussen?

Ik gebruik al een tijdje de hardware seriële receiver en transmitter van PIC µC om LocoNet data door te sturen.  Dan heb je maar 2 communicatie lijnen nodig (massa en één data lijn).

Geert

Edit: net opgemerk: blijkbaar in een ander draadje je probleem al aangekaart, loopt zo wel wat doorheen al je vragen...
Schaal HO - digitaal zelfbouw - Favoriete Lok: V200 DB
Huidig project: LocoNet 16 poorten ingangen/uitgangen

raf

geert voorlopig nog geen vragen maar daarom dit nieuwe topic er over gemaakt
het test bakje met schakelaars is reeds klaar

ik heb er 18 schakelaars op zitten maar ik moet nu gaan testen tot hoeveel ik kan gaan
dus pic programmeren en de display er aan hangen en kijken tot welke waarde alles stabiel blijft
indien ik niet tot 17 geraak doe ik de schakelaars in twee groepen (binnen in een schakelaar om zetten )en gebruik ik op de pic twee ingangen
waarom gebruik je een draadloze ontvanger voor je verbindingen ???
stuur je de baan vanuit een pc of laptop ???

gr raf
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

raf

reeds een stukje code geschreven zodat ik kan zien waar ik mee bezig ben
dit is nog maar alleen om de ingedrukte toets zichtbaar te maken nu moet ik nog aan het eigenlijke programma beginnen


Device 16F628A                ;Gebruik een 16F628A type
Config WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd
Xtal 20                       ;Kristal van 20MHz
All_Digital TRUE              ;Alle ingangen digitaal

;Poortnamen
Symbol Potmeter     = PORTA.1 ;PORTA.1 heet vanaf nu 'Potmeter'

;Variabele declareren
Dim Weerstand As Word         ;WORD variabele, bevat straks de stand van de potmeter 

Clear                         ;Wis alle RAM geheugen
DelayMS 500                   ;LCD stabilisering


;Hoofdprogramma
Cls                           ;LCD scherm wissen
While 1 = 1                   ;Oneindig door blijven meten
  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, 1, Dec Weerstand, "      " ;Zet waarde van 'Weerstand' op het display
  If Weerstand > 0 Then GoSub test
Wend                          ;Terug naar WHILE
test:

  If Weerstand < 1 Then       ;als geen Toets ingedrukt dan...
      Print At 2,1,"00"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 33  Then  ;Toets 1 ingedrukt dan...
      Print At 2,1,"01"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 330 Then  ;Toets 2 ingedrukt dan...
      Print At 2,1,"02"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 640 Then  ;Toets 3 ingedrukt dan...
      Print At 2,1,"03"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 990 Then  ;Toets 4 ingedrukt dan...
      Print At 2,1,"04"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 1350 Then  ;Toets 5 ingedrukt dan...
      Print At 2,1,"05"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 1750 Then  ;Toets 6 ingedrukt dan...
      Print At 2,1,"06"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 2150  Then  ;Toets 7 ingedrukt dan...
      Print At 2,1,"07"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 2300 Then  ;Toets 8 ingedrukt dan...
      Print At 2,1,"08"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 3140 Then  ;Toets 9 ingedrukt dan...
      Print At 2,1,"09"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 3600 Then  ;Toets 10 ingedrukt dan...
      Print At 2,1,"10"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 4120 Then  ;Toets 11 ingedrukt dan...
      Print At 2,1,"11"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 4750 Then  ;Toets 12 ingedrukt dan...
      Print At 2,1,"12"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 5450  Then  ;Toets 13 ingedrukt dan...
      Print At 2,1,"13"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 6258 Then  ;Toets 14 ingedrukt dan...
      Print At 2,1,"14"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 7540 Then  ;Toets 15 ingedrukt dan...
      Print At 2,1,"15"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 8200 Then  ;Toets 16 ingedrukt dan...
      Print At 2,1,"16"                  ;Zet het toetsnummer achter 'Toets' op het display
    ElseIf Weerstand < 10000 Then  ;Toets 17 ingedrukt dan...
      Print At 2,1,"17"                  ;Zet het toetsnummer achter 'Toets' op het display
      ElseIf Weerstand < 11650 Then  ;Toets 18 ingedrukt dan...
      Print At 2,1,"18"                  ;Zet het toetsnummer achter 'Toets' op het display
    EndIf

    Print At 1, 10, Dec5 Weerstand;Zet waarde van 'Weerstand' op regel 1 van het display
    Return
End                           ;Einde programma
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

raf

weer wat verder en de code aangepast want het geheugen van de pic zat vol
nu heb ik die 18 stukjes spoor dus 36 codes die ik moet verzenden als ik ze allemaal wil aan uit zetten
dan de 8 wissel servo's nog eens daar bij wat er nog eens 16 bij brengt
nu zie je dat ik telkens naar die paks spring om daar te doen wat er moet gebeuren om een rijweg in te stellen
dit wil ik nog eenvoudiger hebben (lees minder geheugen)
case heb ik nog niet goed onder de knie maar daar zou ik toch iets mee moeten kunnen doen om die 44 mogelijkheden te benutten zonder ze 4 of 6 keer dubbel te moeten zetten
iemand enig idee om me een beetje op weg te helpen
gr raf

Device 16F628A                ;Gebruik een 16F628A type
Config WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd
Xtal 20                       ;Kristal van 20MHz
All_Digital TRUE              ;Alle ingangen digitaal

;Poortnamen
Symbol Potmeter     = PORTA.1 ;PORTA.1 heet vanaf nu 'Potmeter'

;Variabele declareren
Dim Weerstand As Word         ;WORD variabele, bevat straks de stand van de potmeter 
Dim a As Byte
Dim b As Word
Dim c As Word


Dim spoor1 As Byte
Dim spoor2 As Byte
Dim spoor3 As Byte
Dim spoor4 As Byte
Dim spoor5 As Byte
Dim spoor6 As Byte
Dim spoor7 As Byte
Dim spoor8 As Byte
Dim spoor9 As Byte
Dim spoor10 As Byte
Dim spoor11 As Byte
Dim spoor12 As Byte
Dim spoor13 As Byte
Dim spoor14 As Byte
Dim spoor15 As Byte
Dim spoor16 As Byte
Dim spoor17 As Byte
Dim spoor18 As Byte




Clear                         ;Wis alle RAM geheugen
DelayMS 500                   ;LCD stabilisering

start:

Cls                           ;LCD scherm wissen
While 1 = 1                   ;Oneindig door blijven meten
  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 2 ,6, Dec2 a

  If Weerstand > 0 Then GoSub test
Wend                          ;Terug naar WHILE
test:
  If Weerstand < 1 Then       ;als geen Toets ingedrukt dan...
      a = 0
    ElseIf Weerstand < 33  Then  ;Toets 1 ingedrukt dan...
     a = 1
    ElseIf Weerstand < 330 Then  ;Toets 2 ingedrukt dan...
      a = 2
    ElseIf Weerstand < 640 Then  ;Toets 3 ingedrukt dan...   
      a = 3
    ElseIf Weerstand < 990 Then  ;Toets 4 ingedrukt dan...   
      a = 4
    ElseIf Weerstand < 1350 Then  ;Toets 5 ingedrukt dan...     
     a = 5
    ElseIf Weerstand < 1750 Then  ;Toets 6 ingedrukt dan...   
      a = 6
    ElseIf Weerstand < 2150  Then  ;Toets 7 ingedrukt dan...   
       a = 7
    ElseIf Weerstand < 2300 Then  ;Toets 8 ingedrukt dan...   
      a = 8
    ElseIf Weerstand < 3140 Then  ;Toets 9 ingedrukt dan...                     
      a = 9
    ElseIf Weerstand < 3600 Then  ;Toets 10 ingedrukt dan...     
      a = 10
    ElseIf Weerstand < 4120 Then  ;Toets 11 ingedrukt dan...     
      a = 11
    ElseIf Weerstand < 4750 Then  ;Toets 12 ingedrukt dan...   
      a = 12
    ElseIf Weerstand < 5450  Then  ;Toets 13 ingedrukt dan...     
      a = 13   
    ElseIf Weerstand < 6258 Then  ;Toets 14 ingedrukt dan...   
      a = 14
    ElseIf Weerstand < 7540 Then  ;Toets 15 ingedrukt dan...   
      a = 15
    ElseIf Weerstand < 8200 Then  ;Toets 16 ingedrukt dan...   
      a = 16
    ElseIf Weerstand < 10000 Then  ;Toets 17 ingedrukt dan...
      a = 17
    ElseIf Weerstand < 11650 Then  ;Toets 18 ingedrukt dan..
      a = 18
    EndIf
      If a < 10 Then
Print At 2,1,"0"
Print At 2,2,a
    Else
Print At 2,1,a
    EndIf
       If b > 0 And c = 0 And Weerstand >0 Then GoSub testb
       If b = 0 And Weerstand > 0 Then GoSub testa
     
    Print At 1,12,Dec2 b
    Print At 2,12,Dec2 c
    Return
   
testa:
If b = 0 Then b = a
a = 0
Weerstand = 0
DelayMS 300
Return
testb:
If c = 0 Then c = a
  a = 0
  Weerstand = 0
  DelayMS 300
  Return
 
If c = 1 Then
  If b = 2 Then GoTo pak1
  If b = 4 Then GoTo pak2
  If b = 3 Then GoTo pak3
  If b = 5 Then GoTo pak4
  If b  = 6 Then GoTo pak5
  If b  = 7 Then GoTo pak6
  If b = 14 Then GoTo pak7
EndIf
If b = 1 Then
If c = 2 Then GoTo pak1
If c = 4 Then GoTo pak2
If c = 3 Then GoTo pak3
If c = 6 Then GoTo pak5
If c = 7 Then GoTo pak6
If c = 14 Then GoTo pak8
EndIf

If c = 14 Then
If b = 7 Then GoTo pak9
  If b = 6 Then GoTo pak10
  If b = 3 Then GoTo pak11
  If b = 4 Then GoTo pak12
   EndIf
pak1:    ;  van 1 naar 2
PWM PORTA.3, 150 , 3  ;wissel1
PWM PORTA.4,10 , 3   ;wissel1 recht
PWM PORTA.3, 10 , 3  ;blok1
PWM PORTA.4,10 , 3   ;blok1 vrijgeven
PWM PORTA.3,20 , 3   ;blok2
PWM PORTA.4 ,10 , 3  ;blok2 vrijgeven
GoTo wissen
pak2: ;van 1 naar 4
PWM PORTA.3, 150 , 3  ;wissel1
PWM PORTA.4,10 , 3   ;wissel1 recht
PWM PORTA.3, 10 , 3  ;blok1
PWM PORTA.4,10 , 3   ;blok1 vrijgeven
PWM PORTA.3,20 , 3   ;blok2
PWM PORTA.4 ,10 , 3  ;blok2 vrijgeven
  PWM PORTA.3, 150 , 3  ;wissel1
PWM PORTA.4,10 , 3   ;wissel1 recht
  PWM PORTA.3, 40 , 3  ;blok4
PWM PORTA.4,10 , 3   ;blok4 vrijgeven
GoTo wissen

pak3: ;van 1 naar 3
PWM PORTA.3, 150 , 3  ;wissel1
PWM PORTA.4,20 , 3   ;wissel1 rond
PWM PORTA.3, 10 , 3  ;blok1
PWM PORTA.4,10 , 3   ;blok1 vrijgeven
PWM PORTA.3,30 , 3   ;blok3
PWM PORTA.4 ,10 , 3  ;blok3 vrijgeven

GoTo wissen
pak4: ;van 1 naar 5
  PWM PORTA.3, 150 , 3  ;wissel1
PWM PORTA.4,20 , 3   ;wissel1 rond
PWM PORTA.3, 160 , 3  ;wissel2
PWM PORTA.4,10 , 3   ;wissel2 recht
PWM PORTA.3, 10 , 3  ;blok1
PWM PORTA.4,10 , 3   ;blok1 vrijgeven
PWM PORTA.3,30 , 3   ;blok3
PWM PORTA.4 ,10 , 3  ;blok3 vrijgeven
PWM PORTA.3,50 , 3   ;blok5
PWM PORTA.4 ,10 , 3  ;blok5 vrijgeven
GoTo wissen

  pak5:  ;van 1 naar 6
  PWM PORTA.3, 150 , 3  ;wissel1
PWM PORTA.4,20 , 3   ;wissel1 rond
PWM PORTA.3, 160 , 3  ;wissel2
PWM PORTA.4,20 , 3   ;wissel1 rond
PWM PORTA.3, 10 , 3  ;blok1
PWM PORTA.4,10 , 3   ;blok1 vrijgeven
PWM PORTA.3,30 , 3   ;blok3
PWM PORTA.4 ,10 , 3  ;blok3 vrijgeven
PWM PORTA.3,60 , 3   ;blok6
PWM PORTA.4 ,10 , 3  ;blok6 vrijgeven 
GoTo wissen
pak6:      ;van 1 naar 7
  PWM PORTA.3, 150 , 3  ;wissel1
PWM PORTA.4,20 , 3   ;wissel1 rond
PWM PORTA.3, 160 , 3  ;wissel2
PWM PORTA.4,20 , 3   ;wissel1 rond
PWM PORTA.3, 10 , 3  ;blok1
PWM PORTA.4,10 , 3   ;blok1 vrijgeven
PWM PORTA.3,30 , 3   ;blok3
PWM PORTA.4 ,10 , 3  ;blok3 vrijgeven
PWM PORTA.3,60 , 3   ;blok6
PWM PORTA.4 ,10 , 3  ;blok6 vrijgeven 
PWM PORTA.3,70 , 3   ;blok7
PWM PORTA.4 ,10 , 3  ;blok7 vrijgeven 
GoTo wissen
pak7:   ;van 1 naar 14
  PWM PORTA.3, 150 , 3  ;wissel1
PWM PORTA.4,20 , 3   ;wissel1 rond
PWM PORTA.3, 160 , 3  ;wissel2
PWM PORTA.4,20 , 3   ;wissel1 rond
PWM PORTA.3, 10 , 3  ;blok1
PWM PORTA.4,10 , 3   ;blok1 vrijgeven
PWM PORTA.3,30 , 3   ;blok3
PWM PORTA.4 ,10 , 3  ;blok3 vrijgeven
PWM PORTA.3,60 , 3   ;blok6
PWM PORTA.4 ,10 , 3  ;blok6 vrijgeven 
PWM PORTA.3,70 , 3   ;blok7
PWM PORTA.4 ,10 , 3  ;blok7 vrijgeven
PWM PORTA.3,140 , 3   ;blok7
PWM PORTA.4 ,10 , 3  ;blok7 vrijgeven   
GoTo wissen
pak8:   ;via de onderste rail naar 1
PWM PORTA.3, 150 , 3  ;wissel1
PWM PORTA.4,20 , 3   ;wissel1 rond
PWM PORTA.3, 160 , 3  ;wissel2
PWM PORTA.4,20 , 3   ;wissel2 rond
PWM PORTA.3, 170 , 3  ;wissel3
PWM PORTA.4,20 , 3   ;wissel3 rond
PWM PORTA.3, 10 , 3  ;blok1
PWM PORTA.4,10 , 3   ;blok1 vrijgeven
PWM PORTA.3,30 , 3   ;blok3
PWM PORTA.4 ,10 , 3  ;blok3 vrijgeven
PWM PORTA.3,60 , 3   ;blok6
PWM PORTA.4 ,10 , 3  ;blok6 vrijgeven 
PWM PORTA.3,70 , 3   ;blok7
PWM PORTA.4 ,10 , 3  ;blok7 vrijgeven
PWM PORTA.3,140 , 3   ;blok7
PWM PORTA.4 ,10 , 3  ;blok7 vrijgeven   
GoTo wissen
pak9:    ;van 14 naar 7
   PWM PORTA.3, 170 , 3  ;wissel3
PWM PORTA.4,20 , 3   ;wissel3 rond
  PWM PORTA.3,70 , 3   ;blok7
PWM PORTA.4 ,10 , 3  ;blok7 vrijgeven
PWM PORTA.3,140 , 3   ;blok7
PWM PORTA.4 ,10 , 3  ;blok7 vrijgeven
GoTo wissen
pak10:   ;van 14 naar 6
  PWM PORTA.3, 170 , 3  ;wissel3
PWM PORTA.4,20 , 3   ;wissel3 rond
  PWM PORTA.3,70 , 3   ;blok7
PWM PORTA.4 ,10 , 3  ;blok7 vrijgeven
  PWM PORTA.3,140 , 3   ;blok7
PWM PORTA.4 ,10 , 3  ;blok7 vrijgeven
PWM PORTA.3,60 , 3   ;blok6
PWM PORTA.4 ,10 , 3  ;blok6 vrijgeven
  GoTo wissen
pak11:  ;van 14 naar 3
   PWM PORTA.3, 170 , 3  ;wissel3
PWM PORTA.4,20 , 3   ;wissel3 rond
  PWM PORTA.3,70 , 3   ;blok7
PWM PORTA.4 ,10 , 3  ;blok7 vrijgeven
PWM PORTA.3,140 , 3   ;blok7
PWM PORTA.4 ,10 , 3  ;blok7 vrijgeven
PWM PORTA.3,60 , 3   ;blok6
PWM PORTA.4 ,10 , 3  ;blok6 vrijgeven
PWM PORTA.3,30 , 3   ;blok3
PWM PORTA.4 ,10 , 3  ;blok3 vrijgeven
GoTo wissen
pak12: ;van 14 naar 4
PWM PORTA.3, 180 , 3  ;wissel4
PWM PORTA.4,20 , 3   ;wissel4 rond
PWM PORTA.3, 170 , 3  ;wissel3
PWM PORTA.4,10 , 3   ;wissel3 rond
PWM PORTA.3, 190 , 3  ;wissel5
PWM PORTA.4,20 , 3   ;wissel5 rond
PWM PORTA.3, 200 , 3  ;wissel6
PWM PORTA.4,10 , 3   ;wissel6 recht
PWM PORTA.3, 10 , 3  ;blok1
PWM PORTA.4,10 , 3   ;blok1 vrijgeven
PWM PORTA.3,40 , 3   ;blok4
PWM PORTA.4 ,10 , 3  ;blok4 vrijgeven
PWM PORTA.3,140 , 3   ;blok14
PWM PORTA.4 ,10 , 3  ;blok14 vrijgeven 
GoTo wissen

   pak13: ;van 14 naar 3
PWM PORTA.3, 180 , 3  ;wissel4
PWM PORTA.4,20 , 3   ;wissel4 rond
PWM PORTA.3, 170 , 3  ;wissel3
PWM PORTA.4,10 , 3   ;wissel3 rond
PWM PORTA.3, 190 , 3  ;wissel5
PWM PORTA.4,20 , 3   ;wissel5 rond
PWM PORTA.3, 200 , 3  ;wissel6
PWM PORTA.4,10 , 3   ;wissel6 recht
PWM PORTA.3, 10 , 3  ;blok1
PWM PORTA.4,10 , 3   ;blok1 vrijgeven
PWM PORTA.3,40 , 3   ;blok4
PWM PORTA.4 ,10 , 3  ;blok4 vrijgeven
PWM PORTA.3,30 , 3   ;blok3
PWM PORTA.4 ,10 , 3  ;blok3 vrijgeven 
GoTo wissen
wissen:
c= 0
b = 0
GoTo start
Return



End                           ;Einde programma
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

raf

zo we zijn weer een dag verder en er is weer wat aan het programma veranderd

deze nacht de case instructie onder de knie gekregen alsook de arry's definiëren
dan een beslissing genomen om de manuele sturing aan het spoor aan te sluiten en dat gaat via relais gebeuren

zo 4 relais kaarten besteld en die zijn goedkoper dan servo's met een switch er op
begrijpen wie kan dat ze voor dat geld zulke kaarten kunnen bouwen (5.96 dollar) das een 5.50 euries


als je alles los zou moeten kopen hier dan ben je een pak geld kwijt want ze durven 6 euro per relais vragen en nu alles mooi op een kaartje en dat kun je netjes weg werken

de schakeling zelf werkt ook dat is hier op het filmpje te zien
eerst uitleg

links boven komt de waarde die ik inlees van de toetsen

links onder de herberekende waarde naar het sporen plan (1 - 18 )en baan vakken
de wissels worden niet aan een schakelaar gekoppeld die worden door de slaven zelf bestuurd

in het midden boven
de waarde die ingelezen word in de spoorbezet array

in het midden onder
het array dat op dat ogenblik gelezen en geschreven word

rechts boven
het vertrek spoor dat je kunt kiezen

rechts onder
het spoor waar je naar toe wil gaan
https://youtu.be/FLoXEO41ch8
als de processor niets te doen heeft ( vertrek en eindspoor zijn 0)dan gaat hij de bezetmelders af om hun gegevens te laden
dat is of een 1 bezet of een 0 leeg spoor

dit heeft hij nodig om een rijweg te berekenen en de wissels te stellen

de wissels vraag ik niet af want dat maakt niet uit ze worden elke keer gesteld al staan ze in de juiste stand
de servo gaat toch niet meer verdraaien als hij reeds de juiste stand bereikt heeft

zo weer wat geleerd maar kan het nog beter met minder code (buiten de print functies)

gr raf en hier is de code zoals ze voorlopig is want er komt een andere processor met meer geheugen (16F648a)

Device 16F628A                ;Gebruik een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
  All_Digital TRUE
  Xtal 4
  Declare PortB_Pullups On              ;Alle ingangen digitaal

;Poortnamen
Symbol Potmeter     = PORTA.1 ;PORTA.1 heet vanaf nu 'Potmeter'

;Variabele declareren




Dim Weerstand As Word         ;WORD variabele, bevat straks de stand van de potmeter 
Dim a As Byte
Dim b As Word
Dim c As Word
Dim w3 As Word
Dim teller As Byte
Dim blok As Byte
Dim spoor [17] As Byte




Clear                         ;Wis alle RAM geheugen
DelayMS 500                   ;LCD stabilisering

start:


While 1 = 1                   ;Oneindig door blijven meten
  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 ,1, "        "
  Print At 1 ,1, Dec Weerstand
  DelayMS 200
If Weerstand = 0 And a = 0 And b = 0 And c  = 0 Then GoSub leren
If Weerstand > 0 Then GoSub test
Wend                          ;Terug naar WHILE
test:

  Select Weerstand
        Case < 1
            a = 0
        Case 1 To 50
            a = 1
        Case 51 To 120
            a = 2
        Case 121 To 190
            a = 3
         Case 191 To 260
            a = 4
        Case 261 To 341
            a = 5
        Case 341 To 420
            a = 6
         Case 421 To 500
            a = 7
        Case 501 To 600
            a = 8
        Case 601 To 700
            a = 9
        Case 701 To 800
            a = 10
         Case 801 To 900
            a = 11
        Case 901 To 1000
            a = 12
        Case 1001 To  1100
            a = 13
        Case 1101 To 1300
            a = 14
        Case 1301 To 1500
            a = 15
         Case 1501 To 1800
            a = 16
        Case 1801 To 2000
            a = 17
        Case 2001 To  2400
            a = 18         
  EndSelect

   

Print At 2,1,Dec2 a
'    EndIf
    If a = 18 Then b = 0
    If a = 18  Then c = 0
    DelayMS 100
    If a = 18 Then a = 0
       If b > 0 And c = 0 And Weerstand >0 Then GoSub testb
       If b = 0 And Weerstand > 0 Then GoSub testa
     
   Print At 1,15,Dec2 b
    Print At 2,15,Dec2 c
    Return
   
testa:
If b = 0 Then b = a
a = 0
Weerstand = 0
DelayMS 300
Return
testb:
If c = 0 Then c = a
  a = 0
  Weerstand = 0
  DelayMS 300
  Return
 
If c = 1 Then
  If b = 2 Then GoTo pak1
  If b = 4 Then GoTo pak2
  If b = 3 Then GoTo pak3
  If b = 5 Then GoTo pak4
  If b  = 6 Then GoTo pak5
  If b  = 7 Then GoTo pak6
  If b = 14 Then GoTo pak7
EndIf
If b = 1 Then
If c = 2 Then GoTo pak1
If c = 4 Then GoTo pak2
If c = 3 Then GoTo pak3
If c = 6 Then GoTo pak5
If c = 7 Then GoTo pak6
If c = 14 Then GoTo pak8
EndIf

If c = 14 Then
If b = 7 Then GoTo pak9
  If b = 6 Then GoTo pak10
  If b = 3 Then GoTo pak11
  If b = 4 Then GoTo pak12
   EndIf
pak1:    ;  van 1 naar 2
blok = 25: GoSub GeefBlokVrij
blok = 1: GoSub GeefBlokVrij
blok = 2: GoSub GeefBlokVrij
GoTo wissen
pak2: ;van 1 naar 4
blok = 25: GoSub GeefBlokVrij
blok = 1: GoSub GeefBlokVrij
blok = 2: GoSub GeefBlokVrij
  blok = 4: GoSub GeefBlokVrij
GoTo wissen

pak3: ;van 1 naar 3
blok = 25: GoSub GeefBlokVrij
blok = 1: GoSub GeefBlokVrij
blok = 3: GoSub GeefBlokVrij
GoTo wissen
pak4: ;van 1 naar 5
   blok = 25: GoSub wisselrond
blok = 26: GoSub GeefBlokVrij
blok = 1: GoSub GeefBlokVrij
blok = 3: GoSub GeefBlokVrij
blok = 5: GoSub GeefBlokVrij
GoTo wissen

  pak5:  ;van 1 naar 6
blok = 25: GoSub wisselrond
blok = 26: GoSub wisselrond
blok = 1: GoSub GeefBlokVrij
blok = 3: GoSub GeefBlokVrij
blok = 6: GoSub GeefBlokVrij
GoTo wissen
pak6:      ;van 1 naar 7
  blok = 25: GoSub wisselrond
blok = 26: GoSub wisselrond
blok = 1: GoSub GeefBlokVrij
blok = 3: GoSub GeefBlokVrij
blok = 6: GoSub GeefBlokVrij
blok = 7: GoSub GeefBlokVrij
GoTo wissen
pak7:   ;van 1 naar 14
  blok = 25: GoSub wisselrond
blok = 26: GoSub wisselrond
blok = 1: GoSub GeefBlokVrij
blok = 3: GoSub GeefBlokVrij
blok = 6: GoSub GeefBlokVrij 
blok = 7: GoSub GeefBlokVrij
blok = 14: GoSub GeefBlokVrij 
GoTo wissen
pak8:   ;via de onderste rail naar 1
blok = 25: GoSub wisselrond
blok = 26: GoSub wisselrond
blok = 27: GoSub wisselrond
blok = 1: GoSub GeefBlokVrij
blok = 3: GoSub GeefBlokVrij
blok = 6: GoSub GeefBlokVrij
blok = 7: GoSub GeefBlokVrij
blok = 14: GoSub GeefBlokVrij
GoTo wissen
pak9:    ;van 14 naar 7
   blok = 27: GoSub wisselrond
  blok = 7: GoSub GeefBlokVrij
blok = 14: GoSub GeefBlokVrij
GoTo wissen
pak10:   ;van 14 naar 6
  blok = 27: GoSub wisselrond
  blok = 7: GoSub GeefBlokVrij
  blok = 14: GoSub GeefBlokVrij
blok = 6: GoSub GeefBlokVrij
  GoTo wissen
pak11:  ;van 14 naar 3
  blok = 27: GoSub wisselrond
  blok = 6: GoSub GeefBlokVrij
  blok = 7: GoSub GeefBlokVrij
  blok = 14: GoSub GeefBlokVrij
blok = 3: GoSub GeefBlokVrij
GoTo wissen
pak12: ;van 14 naar 4
blok = 28: GoSub wisselrond
blok = 27: GoSub GeefBlokVrij
blok = 29: GoSub wisselrond
blok = 20: GoSub GeefBlokVrij
blok = 1: GoSub GeefBlokVrij
blok = 4: GoSub GeefBlokVrij
blok = 14: GoSub GeefBlokVrij
GoTo wissen

   pak13: ;van 14 naar 3
blok = 28: GoSub wisselrond
blok = 27: GoSub GeefBlokVrij
blok = 29: GoSub wisselrond
blok = 20: GoSub GeefBlokVrij
blok = 1: GoSub GeefBlokVrij
blok = 4: GoSub GeefBlokVrij
blok = 3: GoSub GeefBlokVrij
GoTo wissen
wissen:
c= 0
b = 0
GoTo start
Return

GeefBlokVrij:

PulseOut PORTA.3, blok * 10 , High
DelayMS 10
PulseOut PORTA.4, 10 , High
DelayMS 10
Return
wisselrond:
  PulseOut PORTA.3, blok * 10 , High
  DelayMS 10
PulseOut PORTA.4, 20 , High
DelayMS 10
Return
End                           ;Einde programma


leren:;array vullen met data
For teller = 0 To 17
PulseOut PORTA.3, teller + 1 , High
DelayMS 2
PulseOut PORTA.4, 2500 , High
DelayMS 2
PulseIn PORTA.5,1,w3
If w3 < 10 Then w3 = 1
If w3 >10 Then w3 = 0

spoor [teller]= w3
DelayMS 10
Weerstand = RCIn Potmeter, High
If Weerstand >0 Then GoTo retest
Print At 1,10, Dec w3
Print At 2,10, Dec2 teller
Next
Return
retest:
Weerstand = 0
Print At 2,1,"  "
Return[/img]


If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

raf

het programma zoals het nu is wil niet werken want ik verzend geen adressen
dus nu heb ik twee picjes geprogrammeerd waarmee ik de data /adres lijnen kan testen
en nu krijg ik de waarde van weerstand wel op de 2 display's

nu heb ik dus een mogelijkheid om de data lijnen te testen als het nodig moest zijn
met de test pic kan ik nu mooi de adressen en data uitlezen
nu het hoofd programma terug aan passen zodat dit ook begint te werken

hier het progje om de data lijnen te testen op de master


             Device 16F628A                ;Gebruik een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
  ALL_DIGITAL TRUE
  XTAL 4
  Declare PORTB_PULLUPS On              ;Alle ingangen digitaal

;Poortnamen
Symbol Potmeter     = PORTA.1 ;PORTA.1 heet vanaf nu 'Potmeter'

;Variabele declareren




Dim Weerstand As Word         ;WORD variabele, bevat straks de stand van de potmeter 
Dim a As Byte
Dim b As Word
Dim c As Word
Dim w3 As Word
Dim teller As Byte
Dim blok As Byte
Dim spoor [17] As Byte




Clear                         ;Wis alle RAM geheugen
DelayMS 500                   ;LCD stabilisering

start:


While 1 = 1                   ;Oneindig door blijven meten
  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 ,1, "        "
  Print At 1 ,1, Dec Weerstand
  DelayMS 200
  PulseOut PORTA.2, Weerstand , High
  DelayMS 500
Wend                          ;Terug naar WHILE



en hier het progje om die adres lijn uit te lezen
dit word nog aangepast zodat ik ook de data lijn kan uitlezen
er is een minimaal verschil tussen de verstuurde data en ontvangen data
BV ik verzend 62 en ik ontvang 61 wat meer dan voldoende is om alsnog de chip te adresseren .


Device 16F628A                ;Gebruik een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

;Variabele declareren
Dim data1 As Word         ;WORD variabele, bevat straks de stand van de potmeter

Clear                         ;Wis alle RAM geheugen
DelayMS 500                   ;LCD stabilisering


;Hoofdprogramma
Cls                           ;LCD scherm wissen
While 1 = 1                   ;Oneindig door blijven meten

  PulsIn PORTA.2,1,data1    ;Geef RC oplaadtijd aan WORD variabele 'Weerstand'
  Print At 1, 1, Dec4 data1, "   " ;Zet waarde van 'Weerstand' op het display
Wend                          ;Terug naar WHILE

End                           ;Einde programma


nu de rest aan het werken krijgen en hier een filmpke

[MEDIA=youtube]NqeRuJfQeUs[/MEDIA]
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

raf

filmpke want het werkt
de slaaf reageerd alleen op het juiste adres in dit geval alles tussen 1 en 61
en dan word alleen maar de data over gedragen (tussen de 1 en 10 is stroomloos)en boven de 10 maar < 100 is spanning naar de rails)
hoger dan 150 is een grote puls en die dient om de slaaf data naar de processor te laten zenden
https://www.youtube.com/watch?v=odKftvkSVQE&feature=youtu.be
links boven het adres dat verzonden word
links als het niet goed is dus een verkeerd adres
en dan links boven 10 de data die verzonden is geworden

ikke een blije mens vandaag
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

dani

#8
goed bezig !   Stapje voor stapje zal dat wel in orde komen zeker ?

Dat idee van de haakse printconnectortjes op de display print en dan een vlakke connector er op ga ik even lenen als ik mag :-)

Zijn die schakelaar met een weerstandsnetwerk geschakeld zodat je maar 2 draden naar je controller brengt en een analoge waarde inleest ?

Wat voor weerstanden gebruik je dan ?  Losse van verschillende waarden, of alles in serie met allemaal dezelfde waarde of zo een kant  en klaar weerstandsnetwerkjes van de SC reeks (in serie) ?  Ik zou wel eens de achterkant van da cahakelbordje willen zien als dat kan .
De kruik is te water gegaan...
De kruik is niet meer.

raf

#9
ja ik gebruik een weerstands netwerkje
je kunt geen arry gebruiken want je hebt meer plaats nodig
dus ik heb losse 4K7 weerstanden metaal film  direct aan de schakelaars zitten
ik had toch ergens een foto van geplaatst hoe ik het gedaan had maar ik maak een nieuwe


de massa draden heb ik in het midden afgetakt om deze zo kort mogelijk aan alle schakelaars bij elkaar te krijgen
ja en dit doe ik nog maar recent want mijn vorige hand sturing was nog met 5 draden

het werkt redelijk goed en je krijgt een deel waardes waar je dan in het programma iets mee kunt doen
een condensator van 100nF en een 220E weerstand van de pic pen naar de condensator
dan nog een 220K weerstand over de condensator



de bovenkant is de + van de 5 volt
maar dus het knoop punt tussen de weerstand en de schakelaar daar zit dus mijn lange draad
eens dit allemaal werkt gaat heel de zooi naar boven en word daar in een schakel paneel aangesloten
en dan komt het bakje weer vrij voor nieuwe projecten

gr raf
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

dani

... dat laatste is vermoedelijk om contactdender uit te sluiten ... je kan dat ook in de controller opvangen (de-bounce functie) maar dit is simpel en goedkoop en kost geen processorcycli.

Ik ben even gaan kijken naar DIP series weerstandsnetwerken, en met de waarde die jij gebruikt kan je in principe toekomen met   2stuks  van het type  BOURNS 4120R-001-472

Dat zijn arrays in  "IC-vorm" met 20 pins dus eigenlijk 10 weerstanden elk parallel op elkaar en volledig gescheiden.   Als je ze per kant afwisselend doorverbindt en van op die verbinding naar je schakelaars dan heb je hetzelfde effect.   (en er zijn ook 4108,4114, 4116 en 4118 modellen met resp.  4,7,8 en 9 weerstandjes).

check dit es :   http://www.mouser.com/ds/2/54/bourns_4100r-322555.pdf
Deze datasheet (op pag2) legt alles letjes uit

Dat was ook de reden waarom ik het vroeg, omdat het dan netjes op een printje te maken is.
De kruik is te water gegaan...
De kruik is niet meer.

raf

nee dat heeft te maken met het ontladen van de condensator en contact dender heb ik geen last van want zolang je de knop ingedrukt houd gaat het programma niet verder

een printje en dergelijke allemaal mooi en wel maar je krijgt dan wel langere draden en ik zit op mijn schakel paneel reeds aan 1 meter lengte
en die weerstanden wil je zo dicht mogelijk bij je schakelaars hebben mijn gedacht

gr raf
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

dani

dat printje kan je natuurlijk ook in je schakelkastje inbouwen. Dan zijn de draadjes naar de schakelaars maar even lang als nu.

Maar 't was maar een idee, van mij moet je dat niet doen hoor.   Als het op deze manier ook werkt, waarom niet, het zal goedkoper zijn, sowieso.
Een 10 R netwerk kost al gauw een euro per stuk, terwijl je de "gewone" werstandjes hebt voor  3.. 4 cent of zo ?


Ik zat gewoon te denken aan een printje met centraal daar op de R-netwerken en dan de schakelaartjes van het print-montage type.  Alles netjes in 1 geheel en geen draden behalve de 2 naar de controller.
De kruik is te water gegaan...
De kruik is niet meer.

raf

ja daar in heb je gelijk maar dit moet op het schakel paneel komen wat aan de baan hangt aan de voorkant
dus de onderlinge afstanden van de schakelaar worden max 1 meter en dan zijn die arrys niet zo handig
nu een massa kabel naar alle schakelaars en dan aan elke schakelaar een weerstand en dan verbinden maar met stukjes draad

If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

dani

ik denk niet dat je snapt wat ik bedoel, maar laat maar zitten...
De kruik is te water gegaan...
De kruik is niet meer.