pwm signaal met 16F628

Hallo

Het probleem is een spoor baan
er zijn twee bezet melders S1 en S2
een bezet detect
een vrijgave uitgang
met bezet detect word gekeken of het baan vak vrij is door de vrijgave van de volgende schakeling te bekijken.
Wat ik nu zou willen berijken is
een trein komt op S1 en dan word de PWM gestart (geen probleem dat heb ik software matig in de hand).
dan moet de PWM schakeling langzaam van 100% terug lopen naar 10 %
zolang de trein rijd word hij langzamer tot aan S2
dan moet de PWM terug naar 100% omdat de trein dan eigenlijk uit het baanvak is en als hij stil blijft staan voor een signaal moeten de lampjes voluit branden.
optrekken gaat hetzelfde maar dan vanuit een PWM die van 10% vertrekt naar 100% tot weer S2 bedient word.
de PWM moet eigenlijk niet heel stabiel verlopen zoals bij een servo omdat hij een motor aan stuurt .dus de inwendige Xtal is vrij voldoende .
hierbij het reeds geprogrameerde stukje

pic basic code:

Device 16F628A                ;Gebruik een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
All_Digital TRUE              ;Alle ingangen digitaal
Symbol OFF  = 0               ;UIT
Symbol On   = 1               ;AAN
Dim tijd  as byte
Dim a as byte
Tijd = 10
S1=PORTB.0
S2=PORTB.1
Symbol trein = PORTB.3         ;Poort B.3 heeft nu de naam trein ,uitgang pwm van de processor
Symbol LEDrood = PORTA.1       ;Poort A.1 heeft nu de naam LEDrood
Symbol LEDgroen = PORTA.3      ;Poort A.3 heeft nu de naam LEDgroen
Symbol bezetmelder = PORTA.4   ;Poort A.4 heeft nu de naam bezetmelder    
Symbol bezetdetect = PORTB.2       ;Poort B.2 heeft nu de naam bezetdetect
;                 76543210
PORTA = %11100000             
TRISA = %11100000             ;Alleen PORTA.0 - porta.4 als uitgang portA.5 word een bezetdetect porta.6 vrijgave
TRISB = %11101111             ;Dit zijn nu allemaal ingangen behalve poort B.3
PortB_Pullups On              ;On-chip pull-up weerstanden actief
Clear                         ;Wis alle RAM geheugen
Trein = on
Init:

While 1 = 1                   ;Oneindige lus
IF S1 = off and S2=off then ledgroen =on ELSE ledgroen =off
If S1=on OR S2 = on then bezetmelder =on ELSE bezetmelder =off
If S1=on and S2 = on then wend
If  S1=on Then goto pwmstart
wend
pwmstart:

WHILE 1=1
bezetmelder= on
ledrood =on and ledgroen = off
for a = a -tijd
if pulson = 10 then a=10
pulson =100 -a
if  pulson> 10 then trein = on
trein =on
pause pulson 
pulsoff =(100 -pulson )
trein = off
pause pulsoff
next b
IF S2=on then goto init
Wend
End:

Trein = on
Goto init

hier heb ik een pwm proberen te maken met wat ik wel ken van vroeger nog.
Iemand een idee en eventueel een helpend handje
Dit heb ik aan basic vroeger nooit gehad want toen bestond deze instructie nog niet .

Hallo

Ik denk reeds een oplossing gevonden te hebben
Wie zoekt die vind en wie orde en netheid heeft is te lui om te zoeken en lui ben ik zeker niet

hier de oplossing

pic basic code:


Device 16F628A                ;Gebruik een 16F628A type

;als een trein binnen komt en S1 hoog maakt dan start het aftellen van de pwm tot 15%
;als de trein S2 raakt word pwm meteen terug 255 en de loop start terug opnieuw

Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
All_Digital TRUE              ;Alle ingangen digitaal
 Dim duty As Word
 Symbol S1   = PORTB.0         ;Poort B.0 heeft nu de naam S1
Symbol S2   = PORTB.1         ;Poort B.1 heeft nu de naam S2
 PORTA = %11100000             
TRISA = %11100000             ;Alleen PORTA.0 - porta.4 als uitgang portA.5 word een bezetdetect porta.6 vrijgave
TRISB = %11111011             ;Dit zijn nu allemaal ingangen     behalve poort 2B.2
PortB_Pullups On              ;On-chip pull-up weerstanden actief
Clear                         ;Wis alle RAM geheugen
begin:

While 1 = 1  ;Oneindige lus
PWM PORTB.2 , 255 , 5000
if S1=0 then goto verder
if s1 =1 and s2 =1 then goto begin
if s1 =1 then goto pwmsignaal
wend
verder:

 PWM PORTB.2 , 255 , 7       ; ²het pwm signaal blijft op volle sterkte dus de trein rijd volluit
goto begin
pwmsignaal:

For duty = 255 To 15 Step -1 
PWM PORTB.2 , duty , 7
Next
GoTo begin

Kan ik nu ook eventueel poort A.0 gebruiken ????
Ik wil dit doen daar ik dan geen verschillende printjes moet laten maken .
Of anders moet ik de software in de andere pic's ook aan passen zodat ik een uniforme programmatie heb .

Gr Raf

[Bericht gewijzigd door Henry S. op dinsdag 21 januari 2014 00:58:53 (23%)

Gr Raf

Op 9 januari 2014 17:43:24 schreef raf janssens:

pic basic code:


begin:

While 1 = 1  ;Oneindige lus
PWM PORTB.2 , 255 , 5000
if S1=0 then goto verder
if s1 =1 and s2 =1 then goto begin
if s1 =1 then goto pwmsignaal
wend
verder:

 PWM PORTB.2 , 255 , 7       ; ²het pwm signaal blijft op volle sterkte dus de trein rijd volluit
goto begin
pwmsignaal:

For duty = 255 To 15 Step -1 
PWM PORTB.2 , duty , 7
Next
GoTo begin

Op deze manier uit een while-wend lus stappen is erg lelijk.
Daarvoor gebruik je een break.
Of je neemt de conditie in de while op (daar is dat voor bedoeld).

Just find out what you like and let it kill you

hallo harv

Ik denk dat je hier deze routinne bedoelt.

pic basic code:


if S1=0 then goto verder
if s1 =1 and s2 =1 then goto begin
if s1 =1 then goto pwmsignaal

dit zou mooier zijn
"IF S1 = 1 and S2 = 1 THEN EXIT WHILE"
Maar of dit bruikbaar is ????

de eerste doe ik om steeds volle snelheid te hebben
Als de trein van de vaste rijstroom over gaat op de pwm mag er haast geen verschil zijn
Ik denk 0.7 volt verlies te hebben via de transistor maar dat is te verwaarlozen.
daarom spring ik via "goto verder " naar die subroutine zodat ik steeds max spanning heb eventueel zonder pwm dus transistor max open zonder puls.

Bij de tweede regel moet ik kijken of de trein de tweede schakelaar heeft bedient en dus eventueel voor een signaal stop staat.
Dan terug volledig open sturen om de wagon verlichting vol te laten branden .

de code is nog niet volledig maar zo kan ik ze reeds testen .
Het signaal bezet moet nog gestuurd worden naar het achterliggend signaal .
Ik wil eerst zo testen of het werkt met 2 schakelaars.
Dan kan ik een los spoortje leggen met een trein er op en kijken of de code werkt.
Als deze werkt dan kan ik ook de optrek code maken en te samen met deze print kijken of ook die gaat werken.
de print opbouw is toch gelijk aan al de anderen alleen de software verschilt.

Hallo

Weer wat verder met de programmatie en ik denk dat ik het nu beter heb gedaan

pic basic code:

Device 16F628A                ;Gebruik een 16F628A type

;als een trein binnen komt en S1 hoog maakt dan start het aftellen van A tot 100
;als de trein S2 raakt word a meteen terug 255 en de loop start terug opnieuw

Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
All_Digital TRUE              ;Alle ingangen digitaal
 Dim duty As Word

symbol ledrood = portA.1
Symbol ledgroen = portA.2
Symbol ledoranje = PORTA.3
symbol ledoranje2 = portA.4
symbol ledwit = portA.5
symbol bezetdetect  = portA.6
Symbol S1   = PORTB.0         ;Poort B.0 heeft nu de naam S1
Symbol S2   = PORTB.1         ;Poort B.1 heeft nu de naam S2
symbol vrijgave = portB.2
 PORTA = %11100000             
TRISA = %00000000             ;Alleen PORTA.0 - porta.7 als uitgang ;poortA.0 is de pwm ,poortA.1 is led rood
                              ;poortA.2 =led groen;poortA.3 =ledoranje,poortA.4=ledoranje2,poortA.5 =led wit
                              ;poortA.6 = bezetdetect 
TRISB = %11111111             ;Dit zijn nu allemaal ingangen    
PortB_Pullups On              ;On-chip pull-up weerstanden actief
Clear                          ;Wis alle RAM geheugen
   if vrijgave = 0 then ledrood= 0    and ledoranje = 0                     
begin:

ledgroen = 1
While 1 = 1                       ;Oneindige lus
   if s1=1 then ledgroen=1
   if S1=0 then PWM PORTa.0 , 255 , 5000      ; het pwm signaal blijft op volle sterkte dus de trein rijd volluit
   if s1 =1 and s2 =1 then ledgroen = 0 and ledrood= 1 and ledoranje = 0 and PWM PORTa.0 , 255 , 5000
   if s1 =1 then goto pwmsignaal
wend

pwmsignaal:

  For duty = 255 To 15 Step -1 
   PWM PORTa.0 , duty , 7
   ledoranje =1
  Next
GoTo begin

bij controle alles groen en de hex file gemaakt
nu wachten tot ik kan programmeren..

Halo.
En dit zou dan de optrek module moeten worden.
Ik denk dat deze wat meer gestroomlijnd is dan de vorige en zelfs minder geheugen vraagt.

pic basic code:


Device 16F628A                ;Gebruik een 16F628A type
              
;als een trein binnen komt en S1 hoog maakt dan start het aftellen van A tot 100
;als de trein S2 raakt word a meteen terug 255 en de loop start terug opnieuw

Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
All_Digital TRUE              ;Alle ingangen digitaal
 Dim duty As Word
Symbol S1   = PORTB.0         ;Poort B.0 heeft nu de naam S1
Symbol S2   = PORTB.1         ;Poort B.1 heeft nu de naam S2
symbol bezetdetect  =portA.6
symbol ledrood=portA.1
Symbol ledgroen=portA.2
Symbol ledoranje = PORTA.3
symbol ledoranje2 = portA.4
symbol ledwit=portA.5
symbol vrijgave =portB.2
 PORTA = %11100000             
TRISA = %00000000             ;Alleen PORTA.0 - porta.7 als uitgang ;poortA.0 is de pwm ,poortA.1 is led rood
                              ;poortA.2 =led groen;poortA.3 =ledoranje,poortA.4=ledoranje2,poortA.5 =led wit
                              ;poortA.6 = bezetdetect 
TRISB = %11111111             ;Dit zijn nu allemaal ingangen    
PortB_Pullups On              ;On-chip pull-up weerstanden actief
Clear                          ;Wis alle RAM geheugen
   if bezetdetect = 1 then ledrood= 1    and ledoranje = 0  and ledgroen = 0
   if S1 = 1 then vrijgave =1                     
begin:

While 1 = 1                       ;Oneindige lus
   if bezetdetect = 1 then ledrood=1  and    PWM PORTa.0 , 0 , 5000     ; het pwm signaal staat op minimale sterkte dus de trein rijd niet
   if bezetdetect = 0 and s1 =1 then   ledgroen = 1 and then ledrood = 0 and then ledoranje = 0 then goto pwmsignaal
wend
pwmsignaal:

  For duty = 15 To 255 Step 1 
   PWM PORTa.0 , duty , 7
    Next
  if S2 = 1 then vrijgave =0  and ledrood = 1 and ledgroen = 0
GoTo begin

[Bericht gewijzigd door Henry S. op dinsdag 21 januari 2014 01:00:01 (23%)

Gr Raf

Onderstaand doet precies hetzelfde en is een stuk beter leesbaar.
Je vraagt in de while-wend twee keer of s1 = 1, dat kan ook met één keer

pic basic code:


begin:

ledgroen = 1
while 1 = 1
  if s1 = 1 then 
    ledgroen = 1
    for duty = 255 to 15 step - 1
      PWM PORTA.0, duty, 7
      ledoranje = 1
    next
    if s2 = 1 then
      ledgroen = 0 
      ledrood = 1 
      ledoranje = 0 
      PWM PORTa.0 , 255 , 5000
    endif
  endif
  if s1 = 0 then PWM PORTA.0 , 255 , 5000      ; het pwm signaal blijft op volle sterkte dus de trein rijd voluit
wend

Ik weet niet wat je denkt te bereiken met de constructie

pic basic code:


   if s1 =1 and s2 =1 then ledgroen = 0 and ledrood= 1 and ledoranje = 0 and PWM PORTa.0 , 255 , 5000

maar het is in ieder geval geen geldige syntax.

[Bericht gewijzigd door hadv op donderdag 9 januari 2014 23:35:51 (17%)

Just find out what you like and let it kill you

Hallo HadV

pic basic code:

   if s1 =1 and s2 =1 then ledgroen = 0 and ledrood= 1 and ledoranje = 0 and PWM PORTA.0 , 255 , 5000

als s1 en s2 bezet zijn (dus 1)
dan moet de groene led uitgaan
dan moet de rode led aan gaan
en de pwm portA.0 moet terug op 255 (voluitopen )gaan

via PORTA. stuur ik een darlington schakeling die 12 volt als pwm stuurt

de andere poorten zijn digitale in en uitgangen.
dat het niet mooi is geschreven daar moet ik je gelijk in geven maar de syntax klopt wel want proton geeft er geen fout op
en zoals in uw programma je het geschreven hebt klopt het niet
er moet aan de twee voorwaarden voldaan zijn voor er iets mag gebeuren en bij u is dat niet het geval.
bij u kijk je eerst naar S1 en stuurt dan de led en de pwm en nadien ga je naar de rest kijken.
maar als tijdens het afremmen de trein vroeger S2 berijkt dan kijk je daar dus niet naar en loopt hij S2 voorbij.

een beetje een andere kijk op de zaak

je hebt een sleutel en die steek jij in het slot en draait hem om??? deur gaat niet open want je hebt het verkeerd huis.
er is niet aan beide voorwaarden voldaan.

gr raf

[Bericht gewijzigd door raf janssens op maandag 13 januari 2014 11:38:53 (10%)

Gr Raf

Die constructie geeft in mijn versie van de compiler een fout.
En dat is ook logisch, want wat je wilt bereiken is een sequentie aan statements en wat je doet is een booleaanse test.
Een programmeertaal is iets anders dan natuurlijke taal.

Wat betreft de opmerking dat er aan twee voorwaarden moet zijn voldaan: dat is in mijn code wel degelijk het geval, er wordt alleen op s2 = 1 getest als s1 al op 1 staat. Het enige 'probleem' dat daar zou kunnen optreden is dat de for-next lus te lang duurt om s2 = 1 te detecteren.

Just find out what you like and let it kill you

Hallo Hadv

En dat is juist het probleem.
Bij niet of te late detectie kan de loc door het signaal rijden en achterop een voorligger en das niet de bedoeling.
Ik heb het nu zo geprogrammeerd en als ik alles op een test bordje heb staan ga ik proberen of het werkt.
Eerst manueel met knoppen daarna op een baantje met 1 trein .
zodat ik kan testen hoeveel tijd er nodig is om te remmen met de verschillende machine's die ik heb .
Ze rijden niet allemaal even snel en als er voldoende tijd is kan ik uw oplossing toepassen welke ik wel beter en mooier vind.
In het station heb ik voor te remmen 1.80 meter .dit is helemaal S1
maar er is maar een 30 cm om stil te staan en dat is S2
het gaat dus af hangen van de snelste machine hoe langzaam de treinen kunnen blijven rijden als de pwm vertraagd is tot minimum snelheid.
En dit gaat de tijd bepalen die er is om S2 te detecteren.

We gaan het zien als het zover is en een filmpje komt er dan ook aan .
Gr raf

Gr Raf
Arco

Special Member

Schakelaars kun je met een interrupt detecteren. Sluit ze aan op RB4...7, daar zit IOC (interrupt-on-change) op.

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

Hallo Arco

Ja maar het is de bedoeling dat ze als ze in de baan worden ingebouwd met optocopels worden aangesloten.
Zo blijf ik weg van de baan spanning want als er eens iets verkeerd loopt wil ik niet de volledige 12 volt op de ingangen hebben.
Dus de schakelaars zijn maar voorlopig als test of het werkt.
En het probleem is dat (IOC )20 jaar gelden niet in basic zat en ik het dus nooit geleerd heb.
Maar al doende leert men dus ik ga het proberen dus ik ga het data blad eens door spitten want om het station te besturen is het misschien wel interessanter om dit te gebruiken.

Hallo

ha inderdaad in de datasheet gevonden dat die poorten IOC hebben
nu nog zien hoe het werkt in het programma.
Dus als ik het goed heb dan ongeacht wat het programma bezig is als er een verandering op een van deze poorten komt reageerd de ic naargelang het programma.

[Bericht gewijzigd door Henry S. op dinsdag 21 januari 2014 01:00:48 (19%)

Gr Raf

Hallo

De pic geprogrammerd volgens deze data om een ledje te laten pinken en ???niks.

pic basic code:

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

Opnieuw:                      ;Label met zelf te verzinnen naam
TOGGLE PORTA.1                ;Aan moet uit, uit moet aan
DELAYMS 500                   ;500 milliseconden = 0,5 seconde
GOTO Opnieuw                  ;Spring naar 'Opnieuw' en ga zo steeds door 

END                           ;Einde programma

Hier een foto van de opzet
https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-prn1/q77/s320x320/1009916_682475418471277_689782330_n.jpg

De voeding is een 7805 met twee condensatoren op de pootjes en deze hangt aan een voeding's blok van 12 volt
Wat is er verkeerd ????
De spannig die ik meet is 5.44 volt na de 7805.
Het kan zijn dat die 0.44 een afwijking van de meter is.
Ik ga nu eens proberen met een accu en kijken wat dit geeft want het kan zijn dat er nog rimpel op die voedingblok zit.

Hallo

Ok probleem opgelost
Het was dus echt een voeding probleem.
Ik heb nu een 9 volt accu er aan hengen en nu werkt de pic wel perfect.
Oef gelukkig Dat we dit nu kunnen uitsluiten.
Nu een goede voeding vinden voor de processoren want er gaan er een stuk of 30 gebouwd moeten worden.

[Bericht gewijzigd door Henry S. op dinsdag 21 januari 2014 01:01:15 (12%)

Gr Raf
Arco

Special Member

Probleem zit in je bedrading, die véél te lang is. Draad van voeding/adapter naar 78xx mag maar 15cm zijn zonder extra bufferelco.

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

Hallo

??????
die pic prosessoren komen onder een trein baan te hangen en die zitten naar alle kanten 8 meter max. weg van de voeding.

De accu die er nu aan hangt geeft geen problemen dus ik denk dat het meer aan een niet propere 12 volt ligt.
gr raf

Gr Raf

Wat Arco bedoelt is dat je een elco vlak voor de 7805 moet zetten, denk hierbij aan 100uF tot 220uF.
Op de foto zien ze er tamelijk klein uit.
En zet bij voorkeur een diode met serieweerstand in de voedinglijn.
De diode voorkomt dat de buffer-elco bij korte spanningdipjes ontlaad over de andere aangesloten belastingen.
De weerstand houdt de laadstroom naar de elco binnen de perken en kan tevens wat vermogen dissiperen wat anders de 7805 zou moeten doen.
Bovendien mis ik ook de condensator over de PIC.
Deze is wel degelijk belangrijk, zeker met een draad van die lengte van 7805 naar PIC.

Aan het fotootje te zien heb je de PIC niet eens ontkoppeld met de verplichte 100 nF over de voedingspinnen. Dat is basiskennis digitale techniek, in elk schema met digitale IC's staan ze. Elk IC moet zo dicht mogelijke bij de voedingspennen een ontkoppel-C'tje hebben. Dan praten we verder.

Mijn echte naam: Joris | Mijn elektronica website: Fuzzcraft.com

Hallo fuzzbass

Die kleine condensator zit er wel
die zit over pootje 5 en pootje 14 recht over de ic
het is zo een kleine blauwe.
Moeilijk te zien maar het zit er wel.
https://fbcdn-sphotos-b-a.akamaihd.net/hphotos-ak-ash3/q71/s320x320/1010209_682673518451467_1558152333_n.jpg
moeilijk zo een foto te nemen en dan nog proberen hem scherp te hebben ook nog.
maar hier van de zijkant beter te zien.
Als de schakelingen werken dan moeten er zo een 30 tal gebouwd worden en dan zitten de 7805 veel dichter op de printjes .
alsook de elco's maar nu op zo een test bordje (de eerste keer dat ik er mee werk)is het voor mij nogal priele werk.
Gr raf

[Bericht gewijzigd door raf janssens op vrijdag 17 januari 2014 22:55:30 (22%)

Gr Raf
Arco

Special Member

Zoals reeds gezegd dus ook een 100/220uF elco aan de ingang van alle 78xx stabilisatoren...

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

Hallo arco

die heb ik nu niet op voorraad
die er nu op zitten zijn 1µf
maar die waarde heb ik wel van deze site vandaan

http://www.picbasic.nl/images/schema_handdoekrek.gif
http://www.picbasic.nl/images/schema_schemerlamp.gif

en het is hier dat ik ook de cursus voor beginners aan het volgen ben
http://www.picbasic.nl/frameload.htm?http://www.picbasic.nl/beginners1…

gr raf
en sorry dat ik dus de verkeerde condensatoren heb gekocht maar ????

Gr Raf

Op 17 januari 2014 22:53:27 schreef raf janssens:
Hallo fuzzbass

Die kleine condensator zit er wel

Op de eerste foto niet.

Mijn echte naam: Joris | Mijn elektronica website: Fuzzcraft.com
Arco

Special Member

die er nu op zitten zijn 1µf

Dat kan (alhoewel vrij hoog, normaal 100...220nF), maar dan moeten het wel tantaalelco's zijn. Gewone elco's heeft geen zin.
En daarenboven nog steeds de 100/220uF gebruiken aan de input.

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

Hallo Fuzzbass

Ik had daar zeker juist de pic veranderd en dan moet ik steeds de condens terug zetten .
Het is dus dat ik ofwel de pic wilde herprogrammeren en de condens reeds had weg gehaald of hem juist terug gezet en de condens nog niet geplaatst.
Maar normaal staat hij er altijd over .
@Arco

ik zal proberen om deze week de condensatoren te vervangen.
Maar zolang ik nu op de accu test is er geen probleem.
Het is nu zaterdag en dan geraak ik niet meer aan de winkel, zondag zijn ze dicht en maandag werken
Dus het zal dinsdag worden.
2 X 100 nF en 1 keer 220 µf
Das ook niet de kost maar alleen de tijd om daar te geraken.

Hallo

En de problemen zijn nog niet van de baan.
Ik ben nog steeds een hardware oplossing aan het zoeken om alles aan elkaar te koppelen.
Met de software gaat het ook niet zoals het moet en ik ben helemaal opnieuw begonnen.
Wat ik eigenlijk wil is een PWM sturing die van 255 naar 10 gaat
wanneer schakelaar S1 bedient is
die 10 is nodig omdat niet alle treinen even snel rijden en dus de tijd moeten krijgen om tot aan S2 te rijden waar ze stoppen (hardware matig het stuk spoor is stroomloos)maar S2 detecteerd nog wel de trein.
Dus bij het binnen rijden van de sectie vertragen tot 10% duty circle
als vrijgave aan staat dan moet de trein gewoon verder rijden zonder vertragen (maar dit heb ik denkelijk reeds klaar)

Het gegeven voor de eerste schakeling
ik heb dus
vrijgave 0/1
S1 0/1 maar een verschrikkelijk denderend contact over een lengte van 1.5 meter.
S2 ook een denderend contact .

pic basic code:


symbol S1 = portB.1   ;dit dendert dus enorm
symbol S2 = portB.2    ;dit denderd ook maar word maar kort gelezen
symbol vrijgave = portB.0  ;dit is een schakelaar of komt van een uitgang van een andere pic

dim duty  as byte
dim a as byte
hpwm 1,255,2000  ;zet de pwm op voluit want er moet toch van voluit geremd worden
a = 0
portA =%00000000
trisA =%00000000
trisB = %11110111

clear
detectie:


While 1=1
if vrijgave =1 then goto door 
if s2 = 1 and a =1 then a = 2 
if A=0 and S1 = 1 then goto test
if a = 2 and s1 = 1 then goto stoppen2
if S2=0 and S1 = 0 goto pauze  ;als er geen trein staat dan is de test 0
wend

door:           ;blijft in de korte loop hangen daar er niets veranderd moet worden de trein mag door rijden
While 1=1
hpwm 1,255,2000
if S2 = 1 then goto detectie
wend


test:

A = 1   ;met deze constructie probeer ik het denderen te vermijden
goto remmen ;anders gaat de pic steeds terug naar remmen en begint dus steeds opnieuw met 255


remmen:

duty = 255
while 1=1
if duty >10 then inc duty  ;zolang duty meer dan 10 is er steeds 1 van aftrekken
hpwm 1,duty,2000
if S2 = 1 then goto stoppen
delayms 20
wend

stoppen:

a=1
goto detectie

stoppen2:

a=2
goto detectie

pauze:

delayms 300   ;geeft de trein de tijd om uit de sectie te geraken 
a=0
goto detectie

ik ben er niet zeker van maar tot zover zit ik

pauze is toegevoegd maar ik denk niet echt noodzakelijk maar dient om de trein de tijd te geven om de sectie te verlaten
S1 detecteerd de trein weer wel en begint terug af te remmen maar de loc is reeds uit de sectie dus er remt niets meer af.
Misschien nie tnetjes wat programma aangaat maar het stoort niet op de baan.
Ik kan nu niets testen want ik ben niet thuis en proton kan ik hier niet installeren (t'is niet mijn pc)
fuses weet ik niet uit het kopke dus laat ik die maar eventjes weg maar ze worden wel mee genomen in het progr.

[Bericht gewijzigd door Henry S. op dinsdag 21 januari 2014 01:02:07 (68%)

Gr Raf

Ik heb geen ervaring met basic, maar ik heb even naar je programma gekeken.
Dit aan de hand van je vorige programma.
Op zich zou de contactdender geen rol mogen spelen zolang de S1 en S2 niet tegelijkertijd 1 zijn

code:



clear
detectie:
 
While 1=1
if vrijgave =1 then goto door  
if A=0 and S1 = 1 then goto test  
if s2 = 1 then a = 0   //S1 is 1 na het stoppen daarmee wordt a weer direct 0.
wend                   //Wanneer S1 nog 1 is wordt er weer begonnen met remmen. 
                       //Dit remmen start met max PWM
                       //Schakelaars S1 en S2 mogen nooit tegelijkertijd 1 zijn 
 
door:           ;blijft in de korte loop hangen daar er niets veranderd moet worden de trein mag door rijden
hpwm 1,255,2000
goto detectie
 
 
test:
A = 1
goto remmen
 
 
remmen:
for duty = 255 to 10 step -1
hpwm 1,duty,2000
if duty = 10 then goto uitrijdenTotS2
if S2 = 1 then goto stoppen
delayms 20  //Deze lus duurt +/- 5sec
next
 
uitrijdenTotS2
While 1=1
if S2 = 1 then goto stoppen
wend


stoppen: 
Hier PWM op nul zetten      
a=1
goto detectie

Hallo André

die S1 en S2 worden wel alle twee 1 als de trein het tweede blok binnen rijd
ik zal eens een tekening maken met de vereenvoudigde sporen en blokken
dan hebben jullie een beter idee
Ik vraag geen volledig programma want ik wil het zelf leren hoe het moet.
Er moeten verschillende schakelingen gebouwd worden en dan steeds hulp vragen dat wil ik niet.
Dit is dus 1 blok met een volgblok
in het volg blok stop de trein daar staat dus S2
S2 is weer S1 van het volgende blok wat anders om werkt
de trein trek hier bij vrijgave dus op naar volle snelheid.
dit blok is korter en het optrekken is hier dus veel korter daar als de trein over de wissels gaat hij daar reeds de vaste baan spanning heeft.
dit tot het volgende afrem blok wat weer een zelfde is als ik nu aan het bouwen ben

een volledig blok bestaat dus uit 2 processoren die twee verschillende zaken doen
Processor A doet afremmen of volle gas houden
processor B doet optrekken of volle gas houden
in het station worden de drie volledige blokken door een vierde processor gestuurd die de signalen bedient en bepaald waar en wanneer er iets moet gebeuren.
Maar dat is een probleem voor latere zorg.
eerst het afremblok en optrekblok klaar krijgen want daar moeten er het meeste van gebouwd worden.

https://imagizer.imageshack.us/v2/895x267q90/22/peoe.jpg
in blok S1 word er dus afgeremd(dit is ongeveer 1.5 meter)
dit mag duren tot aan detectie S2 omdat de trein dan toch stroomloos word is dit geen probleem omdat het optrek blok het hier voor het zeggen heeft.
maar een snelle trein kan ver in het blok door rijden terwijl een trage maar tot de helft geraakt .
daarom moet de pwm op een minimum snelheid blijven staan om de trein dan toch door te laten rijden tot S2

Gr raf

Gr Raf

Het is mij nu een stuk duidelijker geworden.
Ik heb de code iets aangepast, nogmaals ik weet niet veel van basic normaal programmeer ik in C.
Het zal ongetwijfeld anders kunnen met de While wend lussen maar dit heb ik zo maar even overgenomen.
Vanwege de contactdender in S2 heb ik een vaste wachtlus gebruikt om er zeker van te zijn dat de hele trein het blok heeft verlaten.
Het is ook mogelijk op S2 te testen door het in een lus te zetten en te wachten tot S2 een vastgestelde tijd geopend blijft.
Bij gebruik van PWM is het signaal aanwezig op PORTB 3.
Op de foto's heb ik de LED op PORTA 6 en op PORTB 3 gezien.

code:


clear
detectie:
 
While 1=1
if vrijgave =1 then goto door  
if S1 = 1 then goto remmen  
if s2 = 1 then goto stoppen  
wend

 
door:           ;blijft in de korte loop hangen daar er niets veranderd moet worden de trein mag door rijden
hpwm 1,255,2000
goto detectie
 
remmen:
for duty = 255 to 10 step -1
hpwm 1,duty,2000
if duty = 10 then goto uitrijdenTotS2
if S2 = 1 then goto stoppen
delayms 20  //Deze lus duurt +/- 5sec
next
 
uitrijdenTotS2
While 1=1
if S2 = 1 then goto stoppen
wend

stoppen: 
hpwm 1,0,2000
While 1=1
if vrijgave=1 goto wegrijden
wend

wegrijden:
for duty = 0 to 255 step +1
hpwm 1,duty,2000
delayms 20  
next
 
for loop = 1 to 255 step +1
delayms 100  ; wachtlus om er zeker van te zijn dat S2 en S1 verlaten is
next         ; afhankelijk van lengte trein

goto detectie

hallo

Ik word er knetter van .
Ik krijg afzonderlijke blokken aan het werken maar alles tesamen ????

pic basic code:

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 18-1-2014                                         *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************



symbol S1 = PORTB.1   ;dit dendert dus enorm
symbol S2 = PORTB.2    ;dit denderd ook maar word maar kort gelezen
symbol vrijgave = PORTB.0  ;dit is een schakelaar of komt van een uitgang van een andere pic
 
dim duty  as byte
dim a as byte
hpwm 1,255,2000  ;zet de pwm op voluit want er moet toch van voluit geremd worden
a = 0
PORTA =%00000000
TRISA =%00000000
TRISB = %11110111
clear
detectie:
 

While 1=1

if vrijgave =1 then hpwm 1,255,2000
if vrijgave = 0 then hpwm 1,0,2000
if vrijgave = 1 then porta.0 =1
if vrijgave = 0 then porta.0 = 0

wend  

Dit werk perfect
als vrijgave 1 is dan is de hpwm ook goog en de trein kan door rijden
S2 heeft hier geen invloed want hij mag door rijden.

hier het tweede stukje dat de Hpwm maakt

pic basic code:


symbol S1 = PORTB.1   ;dit dendert dus enorm
symbol S2 = PORTB.2    ;dit denderd ook maar word maar kort gelezen
symbol vrijgave = PORTB.0  ;dit is een schakelaar of komt van een uitgang van een andere pic
 
dim duty  as byte
dim a as byte
hpwm 1,0,2000  ;zet de pwm op voluit want er moet toch van voluit geremd worden
a = 0
PORTA =%00000000
TRISA =%00000000
PORTb =%00000100
TRISB = %11110111
clear

detectie:

 While 1 = 1
 WHILE S1 = 0  : WEND                   ; normaal zou er alleen uit deze loop gesprongen mogen worden als 
 if a=0 and s1 = 1  then goto remmen    ; A =o  en S1 =1 
                                        ;het gebeurt ook de eerste keer maar daarna blijft de hpwm door lopen en herhalen
wend                                    ;dim A = 1 zorgt er voor dat meermaals S1 drukken geen zin heeft (anty dender)
                                        ; de hpwm zou alleen maar op 10 % mogen door lopen tot S2 is gedrukt (nu nie tin het prog opgenomen)

 remmen:
 

 porta.1 =1
 a = 1
 for duty = 255 to 10  step -1
 if duty = 10 then goto pauze
 hpwm 1,duty,200
 delayms 20      ;moet 200 worden maar met het test programma beter de blokjes te zien
 next
  goto detectie
  
 pauze:


 porta.2 = 1
  if a = 1 then porta.6=1
 goto detectie 

Iemand een idee ?? om me een beetje op weg te helpen.
want ik doe iets verkeerd maar ik zou niet weten wat.

Hallo André

je posting te laat gezien
ik heb het programma aangepast wat je gepost had maar het detecteerd S2 niet

pic basic code:


symbol S1 = PORTB.1   ;dit dendert dus enorm
symbol S2 = PORTB.2    ;dit denderd ook maar word maar kort gelezen
symbol vrijgave = PORTB.0  ;dit is een schakelaar of komt van een uitgang van een andere pic
 
dim duty  as byte
dim a as byte
hpwm 1,255,2000  ;zet de pwm op voluit want er moet toch van voluit geremd worden
a = 0
PORTA =%00000000
TRISA =%00000000
PORTb =%00000100
TRISB = %11110111
clear

detectie:
 

While 1=1
if vrijgave =1 then goto door  
if a=0 and S1 = 1 then goto test  
if s2 = 1 then a = 0   ;S1 is 1 na het stoppen daarmee wordt a weer direct 0.
wend                   ;Wanneer S1 nog 1 is wordt er weer begonnen met remmen. 
                       ;Dit remmen start met max PWM
                       ;Schakelaars S1 en S2 mogen nooit tegelijkertijd 1 zijn 
 
door:           ;blijft in de korte loop hangen daar er niets veranderd moet worden de trein mag door rijden
hpwm 1,255,2000
a=0
goto detectie
 
 
test:

a = 1
goto remmen
 
 
remmen:

for duty = 255 to 10 step -1
hpwm 1,duty,2000
if duty = 10 then goto uitrijdenTotS2
if S2 = 1 then goto stoppen
delayms 20  ;Deze lus duurt +/- 5sec
next
 
uitrijdenTotS2:

While 1=1
if S2 = 1 then goto stoppen
wend


stoppen:

duty = 0 
hpwm 1,duty,2000     
a=1
goto detectie

Het programma werkt wat betreft door rijden en S1 met pwm vertragen.
Maar daarna word er geen detectie gedaan wat S2 betreft.
S2 word dus nergens gedetecteerd waar ik de sleutel ook maar in het programma neer zet

En het zou zo eenvoudig moeten zijn de oplossing maar weet ze maar eens te vinden???

[Bericht gewijzigd door Henry S. op dinsdag 21 januari 2014 01:03:08 (23%)

Gr Raf

Posts gaan elkaar nu kruisen,na je uitleg heb ik je code nog een beetje aangepast.
Het is inderdaad alsof S2 niet gezien wordt vanwege het ontbreken van een wachttijd om de trein helemaal uit S1 en S2 te laten lopen.

code:


Symbol S1 = PORTB.1   ;dit dendert dus enorm
Symbol S2 = PORTB.2    ;dit denderd ook maar word maar kort gelezen
Symbol vrijgave = PORTB.0  ;dit is een schakelaar of komt van een uitgang van een andere pic
 
Dim duty  As Byte
Dim a As Byte
Dim loop As Byte
HPWM 1,255,2000  ;zet de pwm op voluit want er moet toch van voluit geremd worden

PORTA =%00000000
TRISA =%00000000
TRISB = %11110111


Clear
detectie:
 
While 1=1
If vrijgave =1 Then GoTo door  
If S1 = 1 Then GoTo remmen  
If S2 = 1 Then GoTo stoppen  
Wend
 
door:           ;blijft in de korte loop hangen daar er niets veranderd moet worden de trein mag door rijden
HPWM 1,255,2000
GoTo detectie
 
remmen:
For duty = 255 To 10 Step -1
HPWM 1,duty,2000
If duty = 10 Then GoTo uitrijdenTotS2
If S2 = 1 Then GoTo stoppen
DelayMS 20
Next
 
uitrijdenTotS2:
While 1=1
If S2 = 1 Then GoTo stoppen
Wend

stoppen: 
HPWM 1,0,2000
While 1=1
If vrijgave=1 Then GoTo wegrijden
Wend

wegrijden:
For duty = 1 To 255 Step 1
HPWM 1,duty,2000
DelayMS 20  
Next
 
For loop = 1 To 255 Step 1
DelayMS 100  ; wachtlus om er zeker van te zijn dat S2 en S1 verlaten zijn
Next         ; afhankelijk van lengte trein

GoTo detectie