Hallo,
Op het moment ben ik bezig om software te maken ten behoeve van een 7 kanaals multiswitch module voor in de modelbouw.
Nu heb ik deze software vrij redelijk werkend alleen krijg ik een paar bugs er niet uit.
Wat er gebeurt:
-Op het moment dat ik op de zender kanaal 2 aanstuur dan gaat soms kanaal3 aan, op een of andere manier lijkt hier een interlink tussente zitten.
-Op het moment dat ik kanaal 5 aanstuur gaat soms kanaal6 aan.
-Op het moment dat ik meerdere kanalen vaak achter elkaar aanstuur grijpt de failsave in.
Het lijkt er dus op dat de servo signalen niet altijd goed verwerkt worden door de microcontroller?
Hierbij mijn code:
Device 16F627A ;We gebruiken een 16F627A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_ON
All_Digital true
Dim Signaal1in As Byte ;Opslag signaaltijd eerste kanaal
Dim Signaal2in As Byte ;Opslag signaaltijd tweede kanaal
Dim Signaal1out As Byte ;Signaal na verwerking eerste kanaal
Dim Signaal2out As Byte ;Signaal na verwerking tweede kanaal
Dim Errorteller As Byte ;Aantal foute signalen (failsave)
Symbol Puls1 = PORTA.0 ;Ingang eerste servo kanaal
Symbol Puls2 = PORTA.1 ;Ingang tweede servo kanaal
Symbol Errorled = PORTB.0 ;Uitgang errorled
Symbol Kanaal1 = PORTB.1 ;Uitgang kanaal 1
Symbol Kanaal2 = PORTB.2 ;Uitgang kanaal 2
Symbol Kanaal3 = PORTB.3 ;Uitgang kanaal 3
Symbol Kanaal4 = PORTB.4 ;Uitgang kanaal 4
Symbol Kanaal5 = PORTB.5 ;Uitgang kanaal 5
Symbol Kanaal6 = PORTB.6 ;Uitgang kanaal 6
Symbol Kanaal7 = PORTB.7 ;Uitgang kanaal 7
Symbol Servotijdhoog = 170 ;Alles boven dit signaal wordt gezien als hoog
Symbol Servotijdlaag = 130 ;Alles onder dit signaal wordt gezien als laag
Symbol Servotijdhoog1 = 171 ;170 en lager wordt gezien als midden
Symbol Servotijdlaag1 = 129 ;130 en hoger wordt gezien als midden
Symbol Servotijdmax = 220 ;alles boven de 220 wordt gezien als een fout signaal
Symbol Servotijdmin = 80 ;alles onder de 80 wordt gezien als een fout signaal
Symbol Delay = 200
PORTB = 0
Signaal1in = 0 ;Signaal1in op 0 zetten
Signaal2in = 0 ;Signaal2in op 0 zetten
Errorteller = 0 ;Errorteller resetten
High Errorled ;Startup bevestiging
DelayMS 500 ;Korte vertraging om te laten zien dat module opgestart is
Low Errorled
While 1=1
GoTo Pulsmeting ;Beginnen met inlezen kanalen
Errorteller = 0 ;Als we hier terug zijn gekomen is de loop goed doorlopen zonder errors
Pulsmeting:
DelayMS 50
Signaal1in = PulsIn Puls1 , 1 ;Sla gemeten tijd op in kanaal1
If Signaal1in > Servotijdmax And Signaal1in < Servotijdmin Then ;Bepaal of signaal fout is
GoTo Errorprogram ;Zo ja ga naar de errorloop om de teller te verhogen
ElseIf Signaal1in < Servotijdhoog1 And Signaal1in > Servotijdlaag1 Then ;Bepaal of signaal neutraal is
Signaal1out = 1
ElseIf Signaal1in > Servotijdhoog Then ;Bepaal of signaal hoog is
Signaal1out = 2
ElseIf Signaal1in < Servotijdlaag Then ;Bepaal of signaal laag is
Signaal1out = 0
EndIf
DelayMS 50
Signaal2in = PulsIn Puls2 , 1 ;Sla gemeten tijd op in kanaal2
If Signaal2in > Servotijdmax And Signaal2in < Servotijdmin Then ;Bepaal of signaal fout is
GoTo Errorprogram ;Zo ja ga naar de error loop om de teller te verhogen
ElseIf Signaal2in < Servotijdhoog1 And Signaal2in > Servotijdlaag1 Then ;Bepaal of signaal neutraal is
Signaal2out = 1
GoTo Mainprogram ;We hebben nu beide waarden begin met uitvoering kanaal verandering
ElseIf Signaal2in > Servotijdhoog Then ;Bepaal of signaal hoog is
Signaal2out = 2
GoTo Mainprogram ;We hebben nu beide waarden begin met uitvoering kanaal verandering
ElseIf Signaal2in < Servotijdlaag Then ;Bepaal of signaal laag is
Signaal2out = 0
GoTo Mainprogram ;We hebben nu beide waarden begin met uitvoering kanaal verandering
EndIf
Errorprogram: ;Fout registratie programma
Inc Errorteller ;Verhoog bij elk bezoek de teller
If Errorteller > 5 Then ;5x op rij een error dan zetten we de failsave in
High Errorled
Low Kanaal1
Low Kanaal2
Low Kanaal3
Low Kanaal4
Low Kanaal5
Low Kanaal6
Low Kanaal7
DelayMS 500
Low Errorled ;Zet de errorled weer uit en herstart routine.
EndIf
Mainprogram: ;Hier gaan we beginnen met de uitgangen aan te sturen
If Signaal1out = 0 Then ;Als signaal1 laag is dan
If Signaal2out = 0 Then ;Als signaal2 laag is dan
Toggle Kanaal5 ;Schakelen we kanaal 5 om.
DelayMS Delay
ElseIf Signaal2out = 1 Then ;Als signaal2 neutraal is dan
High Errorled ;Resetten we de module
DelayMS Delay
Low Kanaal1
Low Kanaal2
Low Kanaal3
Low Kanaal4
Low Kanaal5
Low Kanaal6
Low Kanaal7
Low Errorled
ElseIf Signaal2out = 2 Then ;Als signaal2 hoog is dan
Toggle Kanaal4 ;Schakelen we kanaal 4 om
DelayMS Delay
EndIf
ElseIf Signaal1out = 1 Then ;Als signaal1 neutraal is dan
If Signaal2out = 0 Then ;Als signaal2 laag is dan
Toggle Kanaal6 ;Schakelen we kanaal 6 om
DelayMS Delay
ElseIf Signaal2out = 2 Then ;Als signaal2 hoog is dan
Toggle Kanaal3 ;Schakelen we kanaal 3 om
DelayMS Delay
EndIf
ElseIf Signaal1out = 2 Then ;Als signaal1 hoog is dan
If Signaal2out = 0 Then ;Als signaal2 laag is dan
Toggle Kanaal7 ;Schakelen we kanaal 7 om
DelayMS Delay
ElseIf Signaal2out = 1 Then ;Als signaal2 neutraal is dan
Toggle Kanaal1 ;Schakelen we kanaal1 om
DelayMS Delay
ElseIf Signaal2out = 2 Then ;Als signaal2 hoog is dan
Toggle Kanaal2 ;Schakelen we kanaal 2 om
DelayMS Delay
EndIf
EndIf
Signaal1out = 5 ;We zetten een valse waarde terug op de uitgangen zodat de loop pas herhaald kan worden na een nieuwe inlezing.
Signaal1out = 5 ;We zetten een valse waarde terug op de uitgangen zodat de loop pas herhaald kan worden na een nieuwe inlezing.
Wend ;Terug naar het begin Het commando PULSIN neemt wel iets tijd in beslag, zorg er dus voor dat je het programma goed opsteld.
Als je met vatste waardes werkt waarbij iets moet schakelen, kan je misschien beter SELECT en CASE gebruiken.
hallo lambiek,
dat pulsin wat tijd in neemt is mij bekend, zover ik weet wacht pulsin totdat die op gaat en weer neer komt.
In mijn geval komen de signalen elke 20ms. Dit is voor mij geen probleem. Ik heb ook een delay aangehouden van 50ms.
of select en case beter is weet ik niet ben geen ervaren programmeur, dit werkt voor mij op het moment ook gewoon. Alleen dus de "spook" signalen zijn erg verstorend voor de werking.
Weet jw zeker dat het door het programma komt. Ik lees op deze manier ook mijn ontvanger uit, maar dat gaat gewoon goed.
Als er zomaar iets schakeld, dan zal de ingang toch wel iets op pikken denk. Ben je in het bezit van een scoop, dan zou je daar eens mee kunnen kijken.
In mijn geval komen de signalen elke 20ms. Dit is voor mij geen probleem. Ik heb ook een delay aangehouden van 50ms.
Waarom om de 20ms, je kan toch continue je ontvanger signaal afvragen. Maar misschien ligt dat wel aan jou toepassing natuurlijk.
ontvanger signaal wordt in 50hz verstuurd door de ontvanger zelf.
(20ms). Voor mijn toepassing heb ik totaal geen snelheid nodig dus dat geeft ook geen probleem.
wat ik merk met kleine wijzigingen in het programma is dat het gedrag ook kleine veranderingen vertoond.
Ik heb wel eens met een scope meegekeken maar hier geen gekke dingen gezien. Het lijkt er meer op dat die tijdens het uitvoeren van een knop niet de juiste waarde heeft behouden. Op het moment dat ik bijvoorbeeld een knop vast ingedrukt hou heb ik dat probleem niet.
ik vermoed dat ik moet kijken naar een oplossing die de signalen eerst verifeerd eerdat het programma uitgevoerd mag worden.
En dat kan makkelijk met select en case.
Als je de gekochte versie van proton hebt, kan je eens bij de help functie kijken daar staan wel voorbeelden met select en case.
Oeps foutje.
[Bericht gewijzigd door Lambiek op (93%)]
MGP
LDmicro user.
Veenie, je hebt een heel "rare" manier van programmeren.
Ik ken picbasic niet, maar er staan toch dingen in waarvan ik achter mijn oren krab.
Leer een beetje gestructureerd werken bv.
Je schrijft:
DelayMS 50
Signaal2in = PulsIn Puls2 , 1 ;Sla gemeten tijd op in kanaal2
If Signaal2in > Servotijdmax And Signaal2in < Servotijdmin Then ;Bepaal of signaal fout is
GoTo Errorprogram ;Zo ja ga naar de error loop om de teller te verhogen
ElseIf Signaal2in < Servotijdhoog1 And Signaal2in > Servotijdlaag1 Then ;Bepaal of signaal neutraal is
Signaal2out = 1
GoTo Mainprogram ;We hebben nu beide waarden begin met uitvoering kanaal verandering
ElseIf Signaal2in > Servotijdhoog Then ;Bepaal of signaal hoog is
Signaal2out = 2
GoTo Mainprogram ;We hebben nu beide waarden begin met uitvoering kanaal verandering
ElseIf Signaal2in < Servotijdlaag Then ;Bepaal of signaal laag is
Signaal2out = 0
[b]GoTo Mainprogram[/b] ;We hebben nu beide waarden begin met uitvoering kanaal verandering
EndIf
Hoeveel keer kun je zomaar uit een "If..endif " springen met Goto Mainprogram in een programma, zonder dat er fouten optreden?
Is er garbage collection in picbasic misschien?
[Bericht gewijzigd door MGP op (20%)]
If Signaal1in > Servotijdmax And Signaal1in < Servotijdmin Then ;Bepaal of signaal fout is
GoTo Errorprogram
Deze if zal nooit uitgevoerd worden volgens mij, hoe kan iets groter zijn dan 220 en ook kleiner dan 80? denk dat je OR moet hebben.
Volgens mij mag en kan je ongestraft vanuit een IF-statement via een GoTo-statement naar "Mainprogram" springen. Ik weet niet wat "garbage collection" in PicBasic is. "Mainprogram" is een subroutine. Het is een beetje vergelijkbaar met een functie in C. Na afwikkelen van de subroutine "Mainprogram" kom je weer terug bij het IF-statement waar je vertrokken bent.
Nu zie ik dat het eind van "Mainprogram" en van "Errorprogram" geen instructie "Return" staat. Ik heb geen idee hoe een PIC-processor dat probleem "oplost".
MGP
LDmicro user.
@ohm pi, het is geen subroutine maar het hoofdprogramma omdat het laatste wat hij tegenkomt een Wend is, van de While 1=1 cyclus.
@Dantos, volgens mij heb je gelijk. Signaal1out en Signaal2out zullen nooit 1 zijn.
De error zal bijzaak zijn 
Edit: je kunt alle goto's schrappen binnen de elseif's als je na het Endif de goto Mainprogram schrijft, want al de resterende elseif's worden overgeslagen.
High en low kan je ook beter niet gebruiken.
Maak daar gewoon dit van.
Errorled = 1
Kanaal1 = 1
; of
Errorled = 0
Kanaal1 = 0
ik ben absoluut geen ervaren programmeur. dat blijkt ook wel uit mijn code. Ben een hobbyist die wat probeert te maken en probeert bij te leren van zijn fouten.
Het is voor mij al een stap voorwaarts dat ik ondanks de "bugs" toch een redelijk werkend programma heb. Ik vermoed dat ik wat moet bedenken om foute signalen af te vangen. Men drukt een knop in op de zender en vervolgens wordt af en toe bij kanaal5 bijvoorbeeld kanaal6 geactiveerd.
Als ik dit terugkijk in de code is het verschil tussen beide kanalen alleen signaal1. Signaal2 is voor beiden hetzelfde.
Mijn vermoeden is dan ook dat de module nog een vorig kanaal verwerkt of de 2 kanalen ongelijk verwerkt waardoor er hier fouten in op treden.
If Signaal1out = 0 Then ;Als signaal1 laag is dan
If Signaal2out = 0 Then ;Als signaal2 laag is dan
Toggle Kanaal5 ;Schakelen we kanaal 5 om.
DelayMS DelayElseIf Signaal1out = 1 Then ;Als signaal1 neutraal is dan
If Signaal2out = 0 Then ;Als signaal2 laag is dan
Toggle Kanaal6 ;Schakelen we kanaal 6 om
DelayMS DelayHeb de code op advies van een aantal bovenstaande personen wat opgeschoond, code is ook wat rommelig geworden doordat ik op een gegeven moment het punt naarbij was dat ik maar gewoon dingen ging doen om te zoeken naar het effect.
Device 16F627A ;We gebruiken een 16F627A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_ON
All_Digital true
Dim Signaal1in As Byte ;Opslag signaaltijd eerste kanaal
Dim Signaal2in As Byte ;Opslag signaaltijd tweede kanaal
Dim Signaal1out As Byte ;Signaal na verwerking eerste kanaal
Dim Signaal2out As Byte ;Signaal na verwerking tweede kanaal
Dim Errorteller As Byte ;Aantal foute signalen (failsave)
Symbol Puls1 = PORTA.0 ;Ingang eerste servo kanaal
Symbol Puls2 = PORTA.1 ;Ingang tweede servo kanaal
Symbol Errorled = PORTB.0 ;Uitgang errorled
Symbol Kanaal1 = PORTB.1 ;Uitgang kanaal 1
Symbol Kanaal2 = PORTB.2 ;Uitgang kanaal 2
Symbol Kanaal3 = PORTB.3 ;Uitgang kanaal 3
Symbol Kanaal4 = PORTB.4 ;Uitgang kanaal 4
Symbol Kanaal5 = PORTB.5 ;Uitgang kanaal 5
Symbol Kanaal6 = PORTB.6 ;Uitgang kanaal 6
Symbol Kanaal7 = PORTB.7 ;Uitgang kanaal 7
Symbol Servotijdhoog = 160 ;Alles boven dit signaal wordt gezien als hoog
Symbol Servotijdlaag = 140 ;Alles onder dit signaal wordt gezien als laag
Symbol Servotijdhoog1 = 161 ;170 en lager wordt gezien als midden
Symbol Servotijdlaag1 = 139 ;130 en hoger wordt gezien als midden
Symbol Servotijdmax = 250 ;alles boven de 220 wordt gezien als een fout signaal
Symbol Servotijdmin = 50 ;alles onder de 80 wordt gezien als een fout signaal
Symbol Delay = 200
PORTB = 0
Signaal1in = 0 ;Signaal1in op 0 zetten
Signaal2in = 0 ;Signaal2in op 0 zetten
Errorteller = 0 ;Errorteller resetten
High Errorled ;Startup bevestiging
DelayMS 500 ;Korte vertraging om te laten zien dat module opgestart is
Low Errorled
While 1=1
Errorteller = 0 ;Als we hier terug zijn gekomen is de loop goed doorlopen zonder errors
Signaal1in = PulsIn Puls1 , 1 ;Sla gemeten tijd op in kanaal1
DelayMS 100
If Signaal1in > Servotijdmax Or Signaal1in < Servotijdmin Then ;Bepaal of signaal fout is
GoSub Errorprogram ;Zo ja ga naar de errorloop om de teller te verhogen
ElseIf Signaal1in < Servotijdhoog1 And Signaal1in > Servotijdlaag1 Then ;Bepaal of signaal neutraal is
Signaal1out = 1
ElseIf Signaal1in > Servotijdhoog Then ;Bepaal of signaal hoog is
Signaal1out = 2
ElseIf Signaal1in < Servotijdlaag Then ;Bepaal of signaal laag is
Signaal1out = 0
EndIf
Signaal2in = PulsIn Puls2 , 1 ;Sla gemeten tijd op in kanaal2
DelayMS 100
If Signaal2in > Servotijdmax Or Signaal2in < Servotijdmin Then ;Bepaal of signaal fout is
GoSub Errorprogram ;Zo ja ga naar de error loop om de teller te verhogen
ElseIf Signaal2in < Servotijdhoog1 And Signaal2in > Servotijdlaag1 Then ;Bepaal of signaal neutraal is
Signaal2out = 1
;We hebben nu beide waarden begin met uitvoering kanaal verandering
ElseIf Signaal2in > Servotijdhoog Then ;Bepaal of signaal hoog is
Signaal2out = 2
;We hebben nu beide waarden begin met uitvoering kanaal verandering
ElseIf Signaal2in < Servotijdlaag Then ;Bepaal of signaal laag is
Signaal2out = 0
;We hebben nu beide waarden begin met uitvoering kanaal verandering
EndIf
'************* Hier gaan we beginnen met de uitgangen aan te sturen ************
If Signaal1out = 0 Then ;Als signaal1 laag is dan
If Signaal2out = 0 Then ;Als signaal2 laag is dan
Toggle Kanaal5 ;Schakelen we kanaal 5 om.
DelayMS Delay
ElseIf Signaal2out = 1 Then ;Als signaal2 neutraal is dan
High Errorled ;Resetten we de module
DelayMS Delay
Low Kanaal1
Low Kanaal2
Low Kanaal3
Low Kanaal4
Low Kanaal5
Low Kanaal6
Low Kanaal7
Low Errorled
ElseIf Signaal2out = 2 Then ;Als signaal2 hoog is dan
Toggle Kanaal4 ;Schakelen we kanaal 4 om
DelayMS Delay
EndIf
ElseIf Signaal1out = 1 Then ;Als signaal1 neutraal is dan
If Signaal2out = 0 Then ;Als signaal2 laag is dan
Toggle Kanaal6 ;Schakelen we kanaal 6 om
DelayMS Delay
ElseIf Signaal2out = 2 Then ;Als signaal2 hoog is dan
Toggle Kanaal3 ;Schakelen we kanaal 3 om
DelayMS Delay
EndIf
ElseIf Signaal1out = 2 Then ;Als signaal1 hoog is dan
If Signaal2out = 0 Then ;Als signaal2 laag is dan
Toggle Kanaal7 ;Schakelen we kanaal 7 om
DelayMS Delay
ElseIf Signaal2out = 1 Then ;Als signaal2 neutraal is dan
Toggle Kanaal1 ;Schakelen we kanaal1 om
DelayMS Delay
ElseIf Signaal2out = 2 Then ;Als signaal2 hoog is dan
Toggle Kanaal2 ;Schakelen we kanaal 2 om
DelayMS Delay
EndIf
EndIf
Signaal1out = 5 ;We zetten een valse waarde terug op de uitgangen zodat de loop pas herhaald kan worden na een nieuwe inlezing.
Signaal2out = 5 ;We zetten een valse waarde terug op de uitgangen zodat de loop pas herhaald kan worden na een nieuwe inlezing.
Wend ;Terug naar het begin
Errorprogram: ;Fout registratie programma
Inc Errorteller ;Verhoog bij elk bezoek de teller
If Errorteller > 5 Then ;5x op rij een error dan zetten we de failsave in
Errorled = 1
Kanaal1 = 0
Kanaal2 = 0
Kanaal3 = 0
Kanaal4 = 0
Kanaal5 = 0
Kanaal6 = 0
Kanaal7 = 0
DelayMS 500
Errorled = 0 ;Zet de errorled weer uit en herstart routine.
EndIf
ReturnEDIT: code weer bijgewerkt 21:42.
MGP
LDmicro user.
Veenie,
- Plaats de subroutine Errorprogram buiten de While loop dan vervalt ook de aanroep goto Mainprogram boven die routine.
- Verwijder de 2x else goto pulsmeting want de Whileloop doet dat toch.
Editeer uw laatste antwoord en schrijf onder de code "code aangepast!
heb de code bijgewerkt maar dit heeft functioneel geen verschil.
De else had ik er voor test ingezet maar in theorie zal die die nooit kunnen halen want alle opties daarboven vangen dat al af.
heb de mainprogram routine nu dus door laten lopen. maar dit maakt niet uit.
MGP
LDmicro user.
Wil je eens een soort waarheidstabel maken van de Mainprogram routine want ik geraak er niet aan uit.
Veel teveel elseif statements en er klopt iets niet, maar zoals het daar nu staat is het geheimschrift 
Ik heb speciaal voor u Picbasic lite geinstalleerd op mijn computer.
Wanneer moeten die kanalen nu aan of uit gaan.
Op 11 november 2013 20:56:10 schreef veenie:
heb de code bijgewerkt maar dit heeft functioneel geen verschil.
Functioneel maak het idd geen verschil, maar het is veel overzichtelijker (voor mij)
Als je grotere programma's maakt is dat nog nuttiger, voor u dan 
Edit2: goto errorprogram moet nu gosub zijn.
Edit3: goto pulsmeting onder While mag ook weg (opkuis)
kanaal signaal1 signaal2
1 2 1
2 2 2
3 1 2
4 0 2
5 0 0
6 1 0
7 2 0
Reset 0 1
Vals 5 5
hopelijk pakt die de tabel een beetje hier.[Bericht gewijzigd door veenie op (11%)]
...While 1=1
GoTo Pulsmeting ;Beginnen met inlezen kanalen
Errorteller = 0 ;Als we hier terug zijn gekomen is de loop goed doorlopen zonder errors
Pulsmeting:
...
....
Wend ;Terug naar het begin
Errorprogram:
....
ReturnDirect achter While 1=1 staat een Goto-statement (Goto Pulsmeting)
De volgende instructie "Errorteller = 0" wordt dus nooit uitgevoerd.
Deze instructie kan dus weggelaten worden.
Het programma wordt dan
...While 1=1
GoTo Pulsmeting ;Beginnen met inlezen kanalen
Pulsmeting:
...
....
Wend ;Terug naar het begin
Errorprogram:
....
ReturnIn dit programma kan de instructie "Goto Pulsmeting" weggelaten worden. Ook het label "Pulsmeting" kan vervallen. Door uitvoeren van genoemd Goto-statement worden er geen instructies overgeslagen.
Bovengenoemde wijzigingen lossen je probleem niet op, maar verkleint wel de te onderzoeken code op fouten.
PS:
In de tabel hierboven mis ik standje
55, we zetten een valse waarde terug .....
Je tabel kan je direct in Picbasic omzetten als de waarden van signaal1 en signaal2 gevonden is.
Voor de overzichtelijkheid heb ik "Errorprogram" weer tot leven geroepen.
'************* Hier gaan we beginnen met de uitgangen aan te sturen ************
If signaal1out == 2 And signaal2out == 1 Then Toggle kanaal 1
If signaal1out == 2 And signaal2out == 2 Then Toggle kanaal 2
If signaal1out == 1 And signaal2out == 2 Then Toggle kanaal 3
If signaal1out == 0 And signaal2out == 2 Then Toggle kanaal 4
If signaal1out == 0 And signaal2out == 0 Then Toggle kanaal 5
If signaal1out == 1 And signaal2out == 0 Then Toggle kanaal 6
If signaal1out == 2 And signaal2out == 0 Then Toggle kanaal 7
If signaal1out == 0 And signaal2out == 1 Then Gosub Errorprogram
signaal1out = 5
signaal2out = 5
DelayMS Delay
Wendheb de tabel aangepast.
code is ook bijgewerkt heb hem even wat opgeschoond want werd beetje een rommeletje met alle bewerkingen.
ben zelf even aan het kijken of ik een flag situatie kan maken die registreert dat het signaal 3x is binnen gekomen en pas dan actie onderneemt. inplaats van wat die nu direct doet.
[Bericht gewijzigd door veenie op (42%)]
MGP
LDmicro user.
Mainprogram:
If Signaal1out = 0 and Signaal2out = 0 Then
Toggle Kanaal5
Endif
If Signaal1out = 0 and Signaal2out = 2 Then
Toggle Kanaal4
EndIf
If Signaal1out = 1 and Signaal2out = 0 then
toggle Kanaal6
Endif
......
Zo moet je het doen! Overzichtelijk werken.
edit:
Op 11 november 2013 21:41:57 schreef veenie:
...
ben zelf even aan het kijken of ik een flag situatie kan maken die registreert dat het signaal 3x is binnen gekomen en pas dan actie onderneemt. inplaats van wat die nu direct doet.
Als je denkt aan een soort contactdender, zo gaat dat niet werken, het gaat allemaal veel te vlug.
Je kunt wel aan het begin (na de While) een 0.5 sec wachttijd insteken.
Je kunt dan maar elke 1/2 seconde een verandering van toestand krijgen.
[Bericht gewijzigd door MGP op (28%)]
het gaat niet zo zeer om een dender contact maar meer om dat een signaal langere tijd aanwezig moet zijn voordat deze doorgevoerd wordt in het systeem. Juist als ik de knop vasthoudt dan werken de functies goed. Het gaat alleen fout bij het inschakelen van een nieuwe knop.
Ook voorkom ik ermee dat de lus midden in een signaal gaat inlezen dus zeg dat een knop ingedrukt is en dat signaal1 nog de oude waarde heeft maar signaal2 de nieuwe waarde.
MGP
LDmicro user.
Dat gaat niet want je weet nooit waar het programma zit op dat moment.
Je hebt eigenlijk een soort "enterknop" nodig.
Als je geen onverwachte reset wilt zou je uw tabel moeten aanpassen zodat je bv. 1 1 = reset of 2 2 = reset.
Nu (0 1 = reset) is het gevaarlijk als ik ervan uitga dat je een afstandsbediening gebruikt.
Edit:
0 0 = kan. 5 is ook onbruikbaar, omdat de hendels dan in rust staan.
[Bericht gewijzigd door MGP op (11%)]
hallo mgp,
Ik denk dat je een deel niet overziet in de telling.
0 = niet midden van het kanaal, 1 is het midden.
0 , 0 = allebei de kanalen naar uiterste.
1,1 is ook de status die ontbreekt omdat dat de rust positie is.
Ik heb vanuit een nieuwe hoek wat geprobeerd maar zie kennelijk een foutje over het hoofd. Ik hoop op deze manier te zorgen dat ieder willekeurig signaal pas kan schakelen nadat het signaal 3x is binnen gekomen.
COde is nog wat onoverzichtelijk excuses daarvoor is ook maar een probeersel.
Device 16F627A ;We gebruiken een 16F627A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_ON
All_Digital true
Dim Signaal1in As Byte
Dim Signaal2in As Byte
Dim S1_uit_laag As Bit ;Opslag signaaltijd eerste kanaal
Dim S1_uit_neutraal As Bit ;Opslag signaaltijd tweede kanaal
Dim S1_uit_hoog As Bit
Dim S2_uit_laag As Bit
Dim S2_uit_neutraal As Bit
Dim S2_uit_hoog As Bit
Dim S1hoog As Byte
Dim S1neutraal As Byte
Dim S1laag As Byte
Dim S2hoog As Byte
Dim S2neutraal As Byte
Dim S2laag As Byte
Dim Errorteller As Byte
Symbol Puls1 = PORTA.0 ;Ingang eerste servo kanaal
Symbol Puls2 = PORTA.1 ;Ingang tweede servo kanaal
Symbol Errorled = PORTB.0 ;Uitgang errorled
Symbol Kanaal1 = PORTB.1 ;Uitgang kanaal 1
Symbol Kanaal2 = PORTB.2 ;Uitgang kanaal 2
Symbol Kanaal3 = PORTB.3 ;Uitgang kanaal 3
Symbol Kanaal4 = PORTB.4 ;Uitgang kanaal 4
Symbol Kanaal5 = PORTB.5 ;Uitgang kanaal 5
Symbol Kanaal6 = PORTB.6 ;Uitgang kanaal 6
Symbol Kanaal7 = PORTB.7 ;Uitgang kanaal 7
Symbol Servotijdhoog = 160 ;Alles boven dit signaal wordt gezien als hoog
Symbol Servotijdlaag = 140 ;Alles onder dit signaal wordt gezien als laag
Symbol Servotijdhoog1 = 161 ;170 en lager wordt gezien als midden
Symbol Servotijdlaag1 = 139 ;130 en hoger wordt gezien als midden
Symbol Servotijdmax = 250 ;alles boven de 220 wordt gezien als een fout signaal
Symbol Servotijdmin = 50 ;alles onder de 80 wordt gezien als een fout signaal
Symbol Delay = 200
S1_uit_laag = 0
S1_uit_neutraal = 0
S1_uit_hoog = 0
S2_uit_laag = 0
S2_uit_neutraal = 0
S2_uit_hoog = 0
S1hoog = 0
S1neutraal = 0
S1laag = 0
S2hoog = 0
S2neutraal = 0
S2laag = 0
Errorteller = 0 ;Errorteller resetten
PORTB = 0
High Errorled ;Startup bevestiging
DelayMS 500 ;Korte vertraging om te laten zien dat module opgestart is
Low Errorled
'******************************* Begin Programma Loop ***************************************'
While 1=1
Errorteller = 0 ;Als we hier terug zijn gekomen is de loop goed doorlopen zonder errors
Signaal1in = PulsIn Puls1 , 1 ;Sla gemeten tijd op in kanaal1
If Signaal1in > Servotijdmax Or Signaal1in < Servotijdmin Then ;Bepaal of signaal fout is
GoSub Errorprogram ;Zo ja ga naar de errorloop om de teller te verhogen
ElseIf Signaal1in < Servotijdhoog1 And Signaal1in > Servotijdlaag1 Then ;Bepaal of signaal neutraal is
S1_uit_laag = 0
S1_uit_neutraal = 1
S1_uit_hoog = 0
ElseIf Signaal1in > Servotijdhoog Then ;Bepaal of signaal hoog is
S1_uit_laag = 0
S1_uit_neutraal = 0
S1_uit_hoog = 1
ElseIf Signaal1in < Servotijdlaag Then ;Bepaal of signaal laag is
S1_uit_laag = 1
S1_uit_neutraal = 0
S1_uit_hoog = 0
EndIf
Signaal2in = PulsIn Puls2 , 1 ;Sla gemeten tijd op in kanaal2
If Signaal2in > Servotijdmax Or Signaal2in < Servotijdmin Then ;Bepaal of signaal fout is
GoSub Errorprogram ;Zo ja ga naar de error loop om de teller te verhogen
ElseIf Signaal2in < Servotijdhoog1 And Signaal2in > Servotijdlaag1 Then ;Bepaal of signaal neutraal is
S2_uit_laag = 0
S2_uit_neutraal = 1
S2_uit_hoog = 0
ElseIf Signaal2in > Servotijdhoog Then ;Bepaal of signaal hoog is
S2_uit_laag = 0
S2_uit_neutraal = 0
S2_uit_hoog = 1
ElseIf Signaal2in < Servotijdlaag Then ;Bepaal of signaal laag is
S2_uit_laag = 1
S2_uit_neutraal = 0
S2_uit_hoog = 0
EndIf
GoSub Signaalcontrole ;Signaal Controleprogramma starten
'************* Hier gaan we beginnen met de uitgangen aan te sturen ************
If S1laag > 3 Then ;Als signaal1 3x laag is geweest ga dan door
If S2laag > 3 Then ;Als signaal2 ook 3 laag is geweest voer programma uit
S1laag = 0 ;Reset alle metingen
S1neutraal = 0
S1hoog = 0
S2laag = 0
S2neutraal = 0
S2hoog = 0
Toggle Kanaal5 ;Toggle kanaal5
DelayMS 200 ;Even wachten
ElseIf S2neutraal > 3 Then ;Als signaal2 ook 3x neutraal is geweest voer programma uit
S1laag = 0 ;Reset alle metingen
S1neutraal = 0
S1hoog = 0
S2laag = 0
S2neutraal = 0
S2hoog = 0
High Errorled ;Indicatie voor het resetten van de module
DelayMS 200 ;Even wachten
Kanaal1 = 0 ;Zet alle kanalen uit
Kanaal2 = 0
Kanaal3 = 0
Kanaal4 = 0
Kanaal5 = 0
Kanaal6 = 0
Kanaal7 = 0
Errorled = 0
ElseIf S2hoog > 3 Then ;Als signal2 3x hoog is geweest voer programma uit
S1laag = 0 ;Reset alle metingen
S1neutraal = 0
S1hoog = 0
S2laag = 0
S2neutraal = 0
S2hoog = 0
Toggle Kanaal4 ;Toggle Kanaal 4
DelayMS 200 ;Even wachten
EndIf
ElseIf S1neutraal > 3 Then ;Als signaal1 3x neutraal is geweest ga dan verder
If S2laag > 3 Then ;Als signaal2 3x laag is geweest voer programma uit
S1laag = 0 ;Reset alle metingen
S1neutraal = 0
S1hoog = 0
S2laag = 0
S2neutraal = 0
S2hoog = 0
Toggle Kanaal6 ;Toggle Kanaal 6
DelayMS 200 ;Even wachten
ElseIf S2hoog > 3 Then ;Als signaal2 3x hoog is geweest voer programma uit
S1laag = 0 ;Reset alle metingen
S1neutraal = 0
S1hoog = 0
S2laag = 0
S2neutraal = 0
S2hoog = 0
Toggle Kanaal3 ;Toggle Kanaal 3
DelayMS 200 ;Even Wachten
EndIf
ElseIf S1hoog > 3 Then ;Als signaal1 3x hoog is geweest ga dan verder
If S2laag > 3 Then ;Als signaal2 3x laag is geweest voer programma uit
S1laag = 0 ;Reset alle metingen
S1neutraal = 0
S1hoog = 0
S2laag = 0
S2neutraal = 0
S2hoog = 0
Toggle Kanaal7 ;Toggle Kanaal 7
DelayMS 200 ;Even wachten
ElseIf S2neutraal > 3 Then ;Als signaal2 3x neutraal is geweest voer programma uit
S1laag = 0 ;Reset alle metingen
S1neutraal = 0
S1hoog = 0
S2laag = 0
S2neutraal = 0
S2hoog = 0
Toggle Kanaal1 ;Toggle Kanaal 1
DelayMS 200 ;Even wachten
ElseIf S2hoog > 3 Then ;Als signaal2 3x hoog is geweest voer programma uit
S1laag = 0 ;Reset alle metingen
S1neutraal = 0
S1hoog = 0
S2laag = 0
S2neutraal = 0
S2hoog = 0
Toggle Kanaal2 ;Toggle Kanaal 2
DelayMS 200 ;Even wachten
EndIf
EndIf
Wend ;Terug naar het begin
'******************************* Error / Failsave Controle ****************'
Errorprogram: ;Fout registratie programma
Inc Errorteller ;Verhoog bij elk bezoek de teller
If Errorteller > 5 Then ;5x op rij een error dan zetten we de failsave in
Errorled = 1
Kanaal1 = 0
Kanaal2 = 0
Kanaal3 = 0
Kanaal4 = 0
Kanaal5 = 0
Kanaal6 = 0
Kanaal7 = 0
DelayMS 500
Errorled = 0 ;Zet de errorled weer uit en herstart routine.
EndIf
Return
'******************************* Signaal Controle Programma ****************'
Signaalcontrole:
If S1_uit_laag = 1 Then ;Verhoog teller indien signaal hoog is
Inc S1laag
ElseIf S1_uit_laag = 0 Then ;Reset teller als signaal niet meer hoog is
S1laag = 0
EndIf
If S1_uit_neutraal = 1 Then ;Verhoog teller indien signaal hoog is
Inc S1neutraal
ElseIf S1_uit_neutraal = 0 Then ;Reset teller als signaal niet meer hoog is
S1neutraal = 0
EndIf
If S1_uit_hoog = 1 Then ;Verhoog teller indien signaal hoog is
Inc S1hoog
ElseIf S1_uit_hoog = 0 Then ;Reset teller als signaal niet meer hoog is
S1hoog = 0
EndIf
If S2_uit_laag = 1 Then ;Verhoog teller indien signaal hoog is
Inc S2laag
ElseIf S2_uit_laag = 0 Then ;Reset teller als signaal niet meer hoog is
S2laag = 0
EndIf
If S2_uit_neutraal = 1 Then ;Verhoog teller indien signaal hoog is
Inc S2neutraal
ElseIf S2_uit_neutraal = 0 Then ;Reset teller als signaal niet meer hoog is
S2neutraal = 0
EndIf
If S2_uit_hoog = 1 Then ;Verhoog teller indien signaal hoog is
Inc S2hoog
ElseIf S2_uit_hoog = 0 Then ;Reset teller als signaal niet meer hoog is
S2hoog = 0
EndIf
Return ;Terug naar main loopEDIT: foutjes gevonden wel opletten met welke variabele ik gebruik
TOM!:. Deze code werkt al beter als de eerste versie. Moet kennelijk alleen de failsave wat minder gevoelig zetten. Want af en toe grijpt die in. En soms wilt die een kanaal niet schakelen.
[Bericht gewijzigd door veenie op (24%)]
MGP
LDmicro user.
Oww 1 1 = middenstand, had mij verkeerd uitgedrukt.
Ik heb de laatste code niet gecheckt.
Wat er bij mij niet ingaat is dat je 3x de code moet gekregen hebben vooraleer je die aanvaard.
3 x 20 mS of als je een stand mist dan heb je 4x 20mS.
De snelheid van de µC zorgt ervoor dat je de verkeerde standen niet eens ziet.
Ik zou alles aan full speed runnen en eens zien wat er eventueel verkeerd kan gaan.
Misschien begrijp ik niet wat je eigenlijk wilt, maar een vertraagd inschakelen zoals een plc doet zul je anders moeten aanpakken.
wat ik nu aan het doen ben geweest is een soort checksum ingebouwd.
Pas als ik 3x een zelfde signaal heb ontvangen van de ontvanger mag er een kanaal geschakeld worden. Wat er in het verleden naar mijn mening gebeurde is dat de pic al signalen ging schakelen terwijl die in een overgang tussen twee signalen terecht kwam.
Aangezien ik geen data communicatie heb met de ontvanger kan ik niet inlezen welk signaal ik als eerste moet hebben.
Het gevaar met maar 1x inlezen is dus dat die een andere functie activeert dan bedoeld. De zogenoemde spook reacties die ik had.
Nu met deze nieuwe code heb ik dat 99% terug gebracht. Ik heb nu nog maar een paar vreemde bugs over. Maar geen spook reacties meer.
1 van de vreemde dingen is dat als ik alle 7 kanalen aanzet dan werkt mijn reset knop niet tot bijna niet meer.
Een ander vaag probleem is dat als ik de kanalen op volgorde activeer (1,2,3,4 etc) Dan weigert die regelmatig kanaal 5 te activeren.
Nu merkte ik wel dat mijn zender accu na 2 dagen toch echt wel leeg was dus die ligt nu aan de oplader, kan helaas ook niet meer verder testen op dit moment, wordt morgen pas weer.
overigens is snelheid hier totaal geen issue want het gaat om het aan en uit zetten van kanalen met druk knoppen. Dus 0,5 seconde vertraging is prima. In 0,5 seconde zou ik zelfs 25x een signaal kunnen inlezen.