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%)]

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".

@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 Delay
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

Heb 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
Return

EDIT: code weer bijgewerkt 21:42.

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.

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:                                                        

....
Return

Direct 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:                                                        

....
Return

In 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

Wend

heb 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%)]


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.

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 loop

EDIT: foutjes gevonden wel opletten met welke variabele ik gebruik :STOM!:. 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%)]

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.