Goedendag,
Ik heb de volgende software zelfstandig werkend.
Nu wil ik met portb.6 selectie maken tussen 2 programmas om uit te voeren.
Echter onderstaand wilt niet lukken de pic gaat rare dingen uitvoeren.
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : Alwin Winius *
'* Notice : Copyright (c) 2011 Wetronic NL *
'* : All Rights Reserved *
'* Date : 8-11-2011 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
Device 16F690 ;We gebruiken een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, MCLRE_OFF, CP_OFF, CPD_OFF, BOR_OFF, IESO_OFF, FCMEN_OFF
All_Digital TRUE ;Alle ingangen digitaal
;76543210
ADCON0 = %00000000
ANSEL = %00000000
ANSELH = %00000000
WPUA = %00000000
IOCA = %00000000
;76543210
TRISA = %00000111
TRISB = %01010000
TRISC = %00000111
Dim Status1 As Byte
Dim Status2 As Byte
Dim Status3 As Byte
Dim Status4 As Byte
Dim Status5 As Byte
Dim Status6 As Byte
Dim Status7 As Byte
Dim Status8 As Byte
Dim Status9 As Byte
Dim Status10 As Byte
Dim Vertraging1 As Byte
Status1 = 0
Status2 = 0
Status3 = 0
Status4 = 0
Status5 = 0
Status6 = 0
Status7 = 0
Status8 = 0
Status9 = 0
Status10 = 0
Vertraging1 = 50
While 1 = 1
;/////////////////////////PROGRAM MAIN//////////////////////////////////////////
Programmain:
If PORTB.6 = 1 Then
GoTo Programladen
Else
GoTo Programlossen
EndIf
;/////////////////////////PROGRAM LADEN/////////////////////////////////////////
Programladen:
;Inladen pallets
If PORTA.0 = 1 And PORTA.2 = 0 Then ;Inladen starten
Low PORTA.4
DelayMS Vertraging1
Status3 = 0
;stoppen pallets bij rust positie na eerste lading.
ElseIf PORTA.1 = 1 And Status1 = 0 Then ;inladen stoppen bij rust positie
High PORTA.4
DelayMS Vertraging1
Status1 = 1
;stoppen pallets nadat 1 pallet reeds geladen is.
ElseIf PORTA.1 = 0 And Status1 = 1 And Status2 = 0 Then
Status2 = 1
DelayMS Vertraging1
ElseIf PORTA.1 = 1 And Status2 = 1 Then
Status2 = 0
Status3 = Status3 + 1
DelayMS Vertraging1
ElseIf Status3 = 3 Then
High PORTA.4
Status3 = 0
DelayMS Vertraging1
;stoppen lopende band bij band vol
ElseIf PORTA.2 = 1 Then
High PORTA.4
DelayMS Vertraging1
EndIf
;Inladen pallets
If PORTC.0 = 1 And PORTC.2 = 0 Then ;Inladen starten
Low PORTC.4
DelayMS Vertraging1
Status6 = 0
;stoppen pallets bij rust positie na eerste lading.
ElseIf PORTC.1 = 1 And Status4 = 0 Then ;inladen stoppen bij rust positie
High PORTC.4
DelayMS Vertraging1
Status4 = 1
;stoppen pallets nadat 1 pallet reeds geladen is.
ElseIf PORTC.1 = 0 And Status4 = 1 And Status5 = 0 Then
Status2 = 1
DelayMS Vertraging1
ElseIf PORTC.1 = 1 And Status5 = 1 Then
Status5 = 0
Status6 = Status6 + 1
DelayMS Vertraging1
ElseIf Status6 = 3 Then
High PORTC.4
Status6 = 0
DelayMS Vertraging1
;stoppen lopende band bij band vol
ElseIf PORTC.2 = 1 Then
High PORTC.4
DelayMS Vertraging1
EndIf
If PORTB.6 = 0 Then
GoTo Programlossen
EndIf
;////////////////////////PROGRAM LOSSEN/////////////////////////////////////////
Programlossen:
If PORTA.0 = 0 And Status7 = 0 Then
Low PORTA.5
Status7 = 1
DelayMS Vertraging1
ElseIf PORTA.0 = 1 And Status7 = 1 Then
Status7 = 0
Status8 = Status8 + 1
DelayMS Vertraging1
ElseIf Status8 = 2 Then
High PORTA.5
DelayMS Vertraging1
Status8 = 0
EndIf
If PORTC.0 = 0 And Status9 = 0 Then
Low PORTC.5
Status9 = 1
DelayMS Vertraging1
ElseIf PORTC.0 = 1 And Status9 = 1 Then
Status9 = 0
Status10 = Status10 + 1
DelayMS Vertraging1
ElseIf Status10 = 2 Then
High PORTC.5
DelayMS Vertraging1
Status10 = 0
EndIf
If PORTB.6 = 1 Then
GoTo Programladen
EndIf
Wend ;Einde programma
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
"De PIC gaat rare dingen uitvoeren" is nogal cryptisch.. WAT doet 'ie?
Test desnoods met hier en daar wat codedelen uit te commentarieren.
Er staan ook wat nuttelozen dingen in:
If PORTB.6 = 0 Then
GoTo Programlossen
EndIf
kun je weglaten want heeft geen nut...
Op 15 januari 2012 18:36:58 schreef Meerweten:
euhm ???
welke PIC is het nu?Device 16F690 ;We gebruiken een 16F628A type
16f690 idd vergeten commentaar aan te passen.
Op 15 januari 2012 18:34:33 schreef Arco:
"De PIC gaat rare dingen uitvoeren" is nogal cryptisch.. WAT doet 'ie?
Test desnoods met hier en daar wat codedelen uit te commentarieren.
Er staan ook wat nuttelozen dingen in:If PORTB.6 = 0 Then GoTo Programlossen EndIfkun je weglaten want heeft geen nut...
hij voert het programma lossen uit. echter de sensoren welke die daarvoor gebruikt worden door mekaar heen gemixt. En zijn niet meer zoals het was toen het programma los gebruikt werd.
Als ik die regel weg laat dan blijft die toch altijd in die loop zitten?
Beiden programma's los hieronder werken zelfstandig.
;Programma laden
If PORTA.0 = 1 And PORTA.2 = 0 Then ;Inladen starten
Low PORTA.4
DelayMS Vertraging1
Status3 = 0
;stoppen pallets bij rust positie na eerste lading.
ElseIf PORTA.1 = 1 And Status1 = 0 Then ;inladen stoppen bij rust positie
High PORTA.4
DelayMS Vertraging1
Status1 = 1
;stoppen pallets nadat 1 pallet reeds geladen is.
ElseIf PORTA.1 = 0 And Status1 = 1 And Status2 = 0 Then
Status2 = 1
DelayMS Vertraging1
ElseIf PORTA.1 = 1 And Status2 = 1 Then
Status2 = 0
Status3 = Status3 + 1
DelayMS Vertraging1
ElseIf Status3 = 3 Then
High PORTA.4
Status3 = 0
DelayMS Vertraging1
;stoppen lopende band bij band vol
ElseIf PORTA.2 = 1 Then
High PORTA.4
DelayMS Vertraging1
EndIf
;Inladen pallets
If PORTC.0 = 1 And PORTC.2 = 0 Then ;Inladen starten
Low PORTC.4
DelayMS Vertraging1
Status6 = 0
;stoppen pallets bij rust positie na eerste lading.
ElseIf PORTC.1 = 1 And Status4 = 0 Then ;inladen stoppen bij rust positie
High PORTC.4
DelayMS Vertraging1
Status4 = 1
;stoppen pallets nadat 1 pallet reeds geladen is.
ElseIf PORTC.1 = 0 And Status4 = 1 And Status5 = 0 Then
Status2 = 1
DelayMS Vertraging1
ElseIf PORTC.1 = 1 And Status5 = 1 Then
Status5 = 0
Status6 = Status6 + 1
DelayMS Vertraging1
ElseIf Status6 = 3 Then
High PORTC.4
Status6 = 0
DelayMS Vertraging1
;stoppen lopende band bij band vol
ElseIf PORTC.2 = 1 Then
High PORTC.4
DelayMS Vertraging1
EndIf
;Programma Lossen
If PORTA.0 = 0 And Status7 = 0 Then
Low PORTA.5
Status7 = 1
DelayMS Vertraging1
ElseIf PORTA.0 = 1 And Status7 = 1 Then
Status7 = 0
Status8 = Status8 + 1
DelayMS Vertraging1
ElseIf Status8 = 2 Then
High PORTA.5
DelayMS Vertraging1
Status8 = 0
EndIf
If PORTC.0 = 0 And Status9 = 0 Then
Low PORTC.5
Status9 = 1
DelayMS Vertraging1
ElseIf PORTC.0 = 1 And Status9 = 1 Then
Status9 = 0
Status10 = Status10 + 1
DelayMS Vertraging1
ElseIf Status10 = 2 Then
High PORTC.5
DelayMS Vertraging1
Status10 = 0
EndIf
[Bericht gewijzigd door Henry S. op (86%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Als de routine laden wordt uitgevoerd, dan wordt lossen dat ook altijd, is dat de bedoeling?
Dit wordt ALTIJD uitgevoerd:
If PORTB.6 = 0 Then
GoTo Programlossen
EndIf
;////////////////////////PROGRAM LOSSEN/////////////////////////////////////////
Programlossen:
[Bericht gewijzigd door Arco op (53%)]
Heb het programma wat aangepast.
Heb het met x if getracht op te lossen.
Zodat die het programma daaronder alleen uitvoert als de voorwaarde waar is. maar desondanks maakt de software er dan een zooitje van.
Hieronder een foto van het project welke ik voor een clublid aan het programmeren ben. Helaas nog niet mijn sterkste bezigheid.
Er zitten in totaal 6 schakelaars in het systeem *zijn 2 lopende banden met elk 3 schakelaars.
De kanaal portb.6 is met pull up aangesloten zodat die altijd 1 is behalve als ik hem aan ground trek. Het programma if portb.6 = 1 uitvoert is het standaard programma.
De onderste code heb ik zo gemaakt dat die iets alleen mag uitvoeren als het waar is. Je zou verwachten dat die dan gewoon het programma uitvoert daaronder. Echter waar het vermoedelijk misgaat is de loop die hij maakt in de software om te zorgen dat de band blijft draaien.
While 1 = 1
;/////////////////////////PROGRAM LADEN/////////////////////////////////////////
If PORTB.6 = 1 Then
;Inladen pallets
If PORTA.0 = 1 And PORTA.2 = 0 Then ;Inladen starten
Low PORTA.4
DelayMS Vertraging1
Status3 = 0
;stoppen pallets bij rust positie na eerste lading.
ElseIf PORTA.1 = 1 And Status1 = 0 Then ;inladen stoppen bij rust positie
High PORTA.4
DelayMS Vertraging1
Status1 = 1
;stoppen pallets nadat 1 pallet reeds geladen is.
ElseIf PORTA.1 = 0 And Status1 = 1 And Status2 = 0 Then
Status2 = 1
DelayMS Vertraging1
ElseIf PORTA.1 = 1 And Status2 = 1 Then
Status2 = 0
Status3 = Status3 + 1
DelayMS Vertraging1
ElseIf Status3 = 3 Then
High PORTA.4
Status3 = 0
DelayMS Vertraging1
;stoppen lopende band bij band vol
ElseIf PORTA.2 = 1 Then
High PORTA.4
DelayMS Vertraging1
EndIf
;Inladen pallets
If PORTC.0 = 1 And PORTC.2 = 0 Then ;Inladen starten
Low PORTC.4
DelayMS Vertraging1
Status6 = 0
;stoppen pallets bij rust positie na eerste lading.
ElseIf PORTC.1 = 1 And Status4 = 0 Then ;inladen stoppen bij rust positie
High PORTC.4
DelayMS Vertraging1
Status4 = 1
;stoppen pallets nadat 1 pallet reeds geladen is.
ElseIf PORTC.1 = 0 And Status4 = 1 And Status5 = 0 Then
Status2 = 1
DelayMS Vertraging1
ElseIf PORTC.1 = 1 And Status5 = 1 Then
Status5 = 0
Status6 = Status6 + 1
DelayMS Vertraging1
ElseIf Status6 = 3 Then
High PORTC.4
Status6 = 0
DelayMS Vertraging1
;stoppen lopende band bij band vol
ElseIf PORTC.2 = 1 Then
High PORTC.4
DelayMS Vertraging1
EndIf
EndIf
;////////////////////////PROGRAM LOSSEN/////////////////////////////////////////
If PORTB.6 = 0 Then
If PORTA.0 = 0 And Status7 = 0 Then
Low PORTA.5
Status7 = 1
DelayMS Vertraging1
ElseIf PORTA.0 = 1 And Status7 = 1 Then
Status7 = 0
Status8 = Status8 + 1
DelayMS Vertraging1
ElseIf Status8 = 2 Then
High PORTA.5
DelayMS Vertraging1
Status8 = 0
EndIf
If PORTC.0 = 0 And Status9 = 0 Then
Low PORTC.5
Status9 = 1
DelayMS Vertraging1
ElseIf PORTC.0 = 1 And Status9 = 1 Then
Status9 = 0
Status10 = Status10 + 1
DelayMS Vertraging1
ElseIf Status10 = 2 Then
High PORTC.5
DelayMS Vertraging1
Status10 = 0
EndIf
EndIf
Wend ;Einde programma
[Bericht gewijzigd door veenie op (69%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Ik denk dat het al een stuk overzichtelijker wordt als je de portpinnen en registers wat zinvolle namen geeft. Namen als Status1...Status10 maakt 't niet echt duidelijk. Als je bijv. Portb6 "switch_standaard" noemt o.i.d. dan is alles veel overzichtelijker...
hoi arco,
Ik snap dat het dat wat overzichtelijker maakt. Die statussen gebruik ik om dat ik soms pulsen moet negeren van de sensoren.
Ik zoek een manier zodat ik echt duidelijk tussen beide programma's kan schakelen. Als dat lukt is alles opgelost.
Beiden programma's los doen prima wat ze moeten doen. Alleen als ik ze samen zet en laat uitvoeren wanneer een bepaalde voorwaarde actief is dan gaat alles door elkaar heen. Daar loop ik tegen aan in dit geval.
Het komt er in feite op neer dat die dus niet het hele programma overslaat maar een deel ervan uitvoerd. Of dat die het programma niet als een lus behandeld wat die normaal wel doet.
Tommyboy
Zo goed als het vroeger was, is het nooit geweest.
Zonder je hele lap code door te spitten:
Gebruik je toevallig een bepaalde variabele in beide programma's, welke je vergeet opnieuw te initialiseren?
Op 15 januari 2012 19:33:18 schreef Tommyboy:
Zonder je hele lap code door te spitten:
Gebruik je toevallig een bepaalde variabele in beide programma's, welke je vergeet opnieuw te initialiseren?
Er wordt geen variabele dubbel gebruikt.
ik zal is zien of ik de code duidelijker kan maken.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
veenie, Ik zie een lap code, en dat werkt volgens de specificatie van de programmeertaal. Omdat je komt klagen dat het niet werkt, vermoed ik dat het niet doet wat JIJ wil. Maar ik heb snel door de thread gescrolled, maar ik kan geen stukje vinden waarin je in gewone taal uitlegt wat het had moeten doen.
Dus: Als een programma niet doet wat het moet doen, probeer eens in gewone taal uit te leggen wat het moet doen....
(Het kan zijn dat het kwartje dan al valt, zonder dat je het op CO hoeft te posten.... ).
Hoi rew.
Ik zal mijn best doen. de code opzich los zoals ik hierboven in 2 stukken heb geschreven doet wat het moet doen.
Eerst de hardware: 3 sensoren per band (zal zo even uit de software opzoeken welke sensor wat is)
-Sensor voorin
-Sensor Rust positie
-Sensor vol
Programma inladen:
Een pallet wordt op de lopende band gezet.
Sensor voorin wordt hierdoor bediend.
Deze geeft de opdracht om de band te laten draaien.
Zodra sensor rust positie bediend wordt stopt de band met draaien.(na de eerste pallet worden hierin altijd 2 pulsen overgeslagen zodat elke pallet in dezelfde positie stopt)
En zo gaat dit proces door totdat de band vol geladen is.
Programma uitladen:
In feite het omgekeerde van programma inladen.
Als sensor voorin niet bediend is en sensor rust positie wel dan wordt de band geactiveerd totdat de sensor voorin wel bediend wordt hier wordt 1 puls genegeerd zodat die helemaal voor aan de rand komt.
Zodra sensor rust positie niet bediend is dan gaat de band niet meer draaien.
Er zitten 2 banden in de laadvloer van deze schaal vrachtwagen.
Beiden banden werken onafhankelijk maar het programma laden / inladen is altijd gelijk op beide banden.
Wat ik nu dus wil is dat zodra ik een signaal geef op Portb.6 dat die wisselt tussen het programma laden en het programma lossen.
Echter blijkt dat die dan de sensoren door mekaar heen gooit en lijkt beiden programmas uit te voeren.
]ik ben in de achtergrond nog druk bezig geweest en wel een stuk verder gekomen maar blijf tegen vreemd gedrag aanlopen.
Zodra ik de programmer (icd2) los koppel dan wordt de pic instabiel. (ik ga nog een elco bijplaatsen op de pic zelf 100nf zit er al.
Er gebeuren dan allemaal vreemde dingen. (voert programma half uit, reageert niet of amper op schakelaars).
Het programma zelf heb ik deels herschreven en voert nu 95% uit van wat ik zou willen. Het switchen van programma laden naar lossen gaat prima. Echter als ik terug wil schakelen dan blijft die gewoon in het programma lossen hangen. Echter gaan de schakelaars random acties triggeren. Zelfs schakelaars die niet voorkomen in programma lossen worden uitgevoerd.
Heb alle functies binnen het programma beschreven met commentaar.
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : Alwin Winius *
'* Notice : Copyright (c) *
'* : All Rights Reserved *
'* Date : 8-11-2011 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
Device 16F690 ;We gebruiken een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, MCLRE_OFF, CP_OFF, CPD_OFF, BOR_OFF, IESO_OFF, FCMEN_OFF
All_Digital TRUE ;Alle ingangen digitaal
;76543210
ADCON0 = %00000000
ANSEL = %00000000
ANSELH = %00000000
WPUA = %00000000
IOCA = %00000000
;76543210
TRISA = %00000111
TRISB = %01010000
TRISC = %00000111
Dim Status1 As Byte
Dim Status2 As Byte
Dim Status3 As Byte
Dim Status4 As Byte
Dim Status5 As Byte
Dim Status6 As Byte
Dim Status7 As Byte
Dim Status8 As Byte
Dim Status9 As Byte
Dim Status10 As Byte
Dim Vertraging1 As Byte
Vertraging1 = 50
Symbol Pallet_detectie1 = PORTA.0
Symbol Pallet_rust1 = PORTA.1
Symbol Pallet_vol1 = PORTA.2
Symbol Inladen1 = PORTA.4
Symbol Uitladen1 = PORTA.5
Symbol Pallet_detectie2 = PORTC.0
Symbol Pallet_rust2 = PORTC.1
Symbol Pallet_vol2 = PORTC.2
Symbol Inladen2 = PORTC.4
Symbol Uitladen2 = PORTC.5
Symbol Programswitch = PORTB.6
While 1 = 1
;/////////////////////////PROGRAM MAIN//////////////////////////////////////////
Program_main:
If Programswitch = 1 Then ;Als programmaswitch hoog is da programma laden uitvoeren. (pull up weerstand)
GoTo Program_laden
EndIf
If Programswitch = 0 Then ;Als programmaswitch laag is dan programma lossen uitvoeren. (gebruikerinput)
GoTo Program_lossen
EndIf
;/////////////////////////PROGRAM LADEN BAND 1//////////////////////////////////
Program_laden:
Status1 = 0
Status2 = 0
Status3 = 0
Status4 = 0
Status5 = 0
Status6 = 0
If Programswitch = 0 Then ;Kijken of voorwaarde nog steeds actief is.
GoTo Program_main ;Indien voorwaarde veranderd is programma sluiten en terug naar programma lossen
EndIf
Repeat
If Pallet_detectie1 = 1 And Pallet_vol1 = 0 Then ;Inladen pallets starten
Low Inladen1
DelayMS Vertraging1
Status3 = 0
ElseIf Pallet_rust1 = 1 And Status1 = 0 Then ;stoppen pallets bij rust positie eerste pallet. (1 puls)
High Inladen1
DelayMS Vertraging1
Status1 = 1
ElseIf Pallet_rust1 = 0 And Status1 = 1 And Status2 = 0 Then ;puls 1 registreren.
Status2 = 1
DelayMS Vertraging1
ElseIf Pallet_rust1 = 1 And Status2 = 1 Then ;puls 2 registreren.
Status2 = 0
Status3 = Status3 + 1
DelayMS Vertraging1
ElseIf Status3 = 3 Then ;stoppen pallets nadat 1 pallet reeds geladen is. (3 pulsen)
High Inladen1
Status3 = 0
DelayMS Vertraging1
ElseIf Pallet_vol1 = 1 Then ;stoppen lopende band bij band vol
High Inladen1
DelayMS Vertraging1
EndIf
;/////////////////////////PROGRAM LADEN BAND 1//////////////////////////////////
If Pallet_detectie2 = 1 And Pallet_vol2 = 0 Then ;Inladen starten
Low Inladen2
DelayMS Vertraging1
Status6 = 0
ElseIf Pallet_rust2 = 1 And Status4 = 0 Then ;stoppen pallets bij rust positie eerste lading. (1 puls)
High Inladen2
DelayMS Vertraging1
Status4 = 1
ElseIf Pallet_rust2 = 0 And Status4 = 1 And Status5 = 0 Then ;puls 1 registrerem
Status2 = 1
DelayMS Vertraging1
ElseIf Pallet_rust2 = 1 And Status5 = 1 Then ;Puls 2 registreren
Status5 = 0
Status6 = Status6 + 1
DelayMS Vertraging1
ElseIf Status6 = 3 Then ;stoppen pallets nadat 1 pallet reeds geladen is. (3 pulsen)
High Inladen2
Status6 = 0
DelayMS Vertraging1
ElseIf Pallet_vol2 = 1 Then ;stoppen lopende band bij band vol
High Inladen2
DelayMS Vertraging1
EndIf
Until Programswitch = 0 ;Programma uitvoeren tot programswitch is veranderd
;////////////////////////PROGRAM LOSSEN/////////////////////////////////////////
Program_lossen:
Status7 = 0
Status8 = 0
Status9 = 0
Status10 = 0
If PORTB.6 = 1 Then ;Kijken of voorwaarde nog steeds actief is.
GoTo Program_main ;Indien voorwaarde veranderd is programma afsluiten en terug naar laden
EndIf
Repeat
If Pallet_detectie1 = 0 And Status7 = 0 Then ;Pallets uitladen band starten.
Low Uitladen1
Status7 = 1
DelayMS Vertraging1
ElseIf Pallet_detectie1 = 1 And Status7 = 1 Then ;1ste puls registeren
Status7 = 0
Status8 = Status8 + 1
DelayMS Vertraging1
ElseIf Status8 = 2 Then ;2de puls uitladen stoppen
High Uitladen1
DelayMS Vertraging1
Status8 = 0
EndIf
If Pallet_detectie2 = 0 And Status9 = 0 Then ;pallets uitladen, band starten.
Low Uitladen2
Status9 = 1
DelayMS Vertraging1
ElseIf Pallet_detectie2 = 1 And Status9 = 1 Then ;1ste puls registeren
Status9 = 0
Status10 = Status10 + 1
DelayMS Vertraging1
ElseIf Status10 = 2 Then ;2de puls uitladen stoppen
High Uitladen2
DelayMS Vertraging1
Status10 = 0
EndIf
Until Programswitch = 1 ;Programma uitvoeren totdat programmaswitch veranderd.
Wend ;Einde programma
End
Je gebruikt wel een latched switch op portb.6 ?
Ik zou om te beginnen de while-wend lus beperken tot het keuze menu.
Vandaaruit roep je dan met een gosub de laden / lossen routine aan.
Routines afsluiten met Return.
While 1 = 1
Program_main:
If Programswitch = 1 Then GoSUB Program_laden
EndIf
If Programswitch = 0 Then GoSUB Program_lossen
EndIf
WEND
Daarmee zorg je ervoor dat je programma altijd weer in de keuze terugkomt en dus op de juiste plaats aan de sub routines begint.
while / wend had ik zelf reeds aangepast maar maakt helaas geen verschil.
de switch die ik gebruik is een draadje dat met pull up is vastgemaakt aan de pin. en ik dus alleen naar gnd toe trek handmatig. Later gaat dit met een module gebeuren maar is een harde GND.
standaard is de switch dus altijd 1.
ik zie dat jij GoSUB gebruikt, ik gebruik GOTO ik weet niet of dit verschil invloed heeft op iets?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Heb je wel 'echte' pull-ups aan de pinnen?
(De interne pull-ups zijn meestal te zwak voor betrouwbaar schakelen)
Het grote voordeel is dat je aan het einde van je routine altijd weer terug komt waar je begonnen bent.
Zonder teveel naar je code te kijken zou ik zeggen dat je met het lusje zoals ik 'm voorstelde de orgineel werkende routines zou moeten kunnen uitvoeren als je een return aan het eind van de routines toevoegd.
Op 26 januari 2012 13:15:51 schreef Arco:
Heb je wel 'echte' pull-ups aan de pinnen?
(De interne pull-ups zijn meestal te zwak voor betrouwbaar schakelen)
ik heb 1k pull up weerstanden gemonteerd aan de 5V.
Op 26 januari 2012 14:01:29 schreef A vd Linden:
Het grote voordeel is dat je aan het einde van je routine altijd weer terug komt waar je begonnen bent.
Zonder teveel naar je code te kijken zou ik zeggen dat je met het lusje zoals ik 'm voorstelde de orgineel werkende routines zou moeten kunnen uitvoeren als je een return aan het eind van de routines toevoegd.
hoi a vd linden.
Ik had gisteravond zelf de while 1 = 1 en wend al verhuist naar binnen de routine program_main. Echter blijft de pic hangen zodra ik programswitch los koppel (pull up weerstand komt dan in dus poort wordt high).
Echter raakt de pic in een soort loop en voert niets meer uit. Of voert hele vage commando's uit. De vol schakelaar wordt de detectie_schakelaar. De rust schakelaar wordt buitenspel gezet.
Hij gaat dan een eigen leven lijden.
Ergens gaat er wat mis, de vraag is echter wat? Naar mijn idee zou de programma code moeten werken maar kennelijk zie ik iets over het hoofd.
EDIT: even de laatste stand van zaken in de software:
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : Alwin Winius *
'* Notice : Copyright (c) *
'* : All Rights Reserved *
'* Date : 8-11-2011 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
Device 16F690 ;We gebruiken een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, MCLRE_OFF, CP_OFF, CPD_OFF, BOR_OFF, IESO_OFF, FCMEN_OFF
All_Digital TRUE ;Alle ingangen digitaal
;76543210
ADCON0 = %00000000
ANSEL = %00000000
ANSELH = %00000000
WPUA = %00000000
IOCA = %00000000
;76543210
TRISA = %00000111
TRISB = %01010000
TRISC = %00000111
Dim Status1 As Byte
Dim Status2 As Byte
Dim Status3 As Byte
Dim Status4 As Byte
Dim Status5 As Byte
Dim Status6 As Byte
Dim Status7 As Byte
Dim Status8 As Byte
Dim Status9 As Byte
Dim Status10 As Byte
Dim Vertraging1 As Byte
Vertraging1 = 50
Symbol Pallet_detectie1 = PORTA.0
Symbol Pallet_rust1 = PORTA.1
Symbol Pallet_vol1 = PORTA.2
Symbol Inladen1 = PORTA.4
Symbol Uitladen1 = PORTA.5
Symbol Pallet_detectie2 = PORTC.0
Symbol Pallet_rust2 = PORTC.1
Symbol Pallet_vol2 = PORTC.2
Symbol Inladen2 = PORTC.4
Symbol Uitladen2 = PORTC.5
Symbol Programswitch = PORTB.6
;/////////////////////////PROGRAM MAIN//////////////////////////////////////////
Program_main:
While 1 = 1
High Inladen1
High Inladen2
High Uitladen1
High Uitladen1
DelayMS 500
If Programswitch = 1 Then ;Als programmaswitch hoog is da programma laden uitvoeren. (pull up weerstand)
GoTo Program_laden
EndIf
If Programswitch = 0 Then ;Als programmaswitch laag is dan programma lossen uitvoeren. (gebruikerinput)
GoTo Program_lossen
EndIf
Wend
;/////////////////////////PROGRAM LADEN BAND 1//////////////////////////////////
Program_laden:
Status1 = 0
Status2 = 0
Status3 = 0
Status4 = 0
Status5 = 0
Status6 = 0
If Programswitch = 0 Then ;Kijken of voorwaarde nog steeds actief is.
GoTo Program_main ;Indien voorwaarde veranderd is programma sluiten en terug naar programma lossen
EndIf
Repeat
If Pallet_detectie1 = 1 And Pallet_vol1 = 0 Then ;Inladen pallets starten
Low Inladen1
DelayMS Vertraging1
Status3 = 0
ElseIf Pallet_rust1 = 1 And Status1 = 0 Then ;stoppen pallets bij rust positie eerste pallet. (1 puls)
High Inladen1
DelayMS Vertraging1
Status1 = 1
ElseIf Pallet_rust1 = 0 And Status1 = 1 And Status2 = 0 Then ;puls 1 registreren.
Status2 = 1
DelayMS Vertraging1
ElseIf Pallet_rust1 = 1 And Status2 = 1 Then ;puls 2 registreren.
Status2 = 0
Status3 = Status3 + 1
DelayMS Vertraging1
ElseIf Status3 = 3 Then ;stoppen pallets nadat 1 pallet reeds geladen is. (3 pulsen)
High Inladen1
Status3 = 0
DelayMS Vertraging1
ElseIf Pallet_vol1 = 1 Then ;stoppen lopende band bij band vol
High Inladen1
DelayMS Vertraging1
EndIf
;/////////////////////////PROGRAM LADEN BAND 1//////////////////////////////////
If Pallet_detectie2 = 1 And Pallet_vol2 = 0 Then ;Inladen starten
Low Inladen2
DelayMS Vertraging1
Status6 = 0
ElseIf Pallet_rust2 = 1 And Status4 = 0 Then ;stoppen pallets bij rust positie eerste lading. (1 puls)
High Inladen2
DelayMS Vertraging1
Status4 = 1
ElseIf Pallet_rust2 = 0 And Status4 = 1 And Status5 = 0 Then ;puls 1 registrerem
Status2 = 1
DelayMS Vertraging1
ElseIf Pallet_rust2 = 1 And Status5 = 1 Then ;Puls 2 registreren
Status5 = 0
Status6 = Status6 + 1
DelayMS Vertraging1
ElseIf Status6 = 3 Then ;stoppen pallets nadat 1 pallet reeds geladen is. (3 pulsen)
High Inladen2
Status6 = 0
DelayMS Vertraging1
ElseIf Pallet_vol2 = 1 Then ;stoppen lopende band bij band vol
High Inladen2
DelayMS Vertraging1
EndIf
Until Programswitch = 0 ;Programma uitvoeren tot programswitch is veranderd
;////////////////////////PROGRAM LOSSEN/////////////////////////////////////////
Program_lossen:
If PORTB.6 = 1 Then ;Kijken of voorwaarde nog steeds actief is.
GoTo Program_main
EndIf
Status7 = 0
Status8 = 0
Status9 = 0
Status10 = 0
Repeat ;Indien voorwaarde veranderd is programma afsluiten en terug naar laden
If Pallet_detectie1 = 0 And Status7 = 0 Then ;Pallets uitladen band starten.
Low Uitladen1
Status7 = 1
DelayMS Vertraging1
ElseIf Pallet_detectie1 = 1 And Status7 = 1 Then ;1ste puls registeren
Status7 = 0
Status8 = Status8 + 1
DelayMS Vertraging1
ElseIf Status8 = 2 Then ;2de puls uitladen stoppen
High Uitladen1
DelayMS Vertraging1
Status8 = 0
EndIf
If Pallet_detectie2 = 0 And Status9 = 0 Then ;pallets uitladen, band starten.
Low Uitladen2
Status9 = 1
DelayMS Vertraging1
ElseIf Pallet_detectie2 = 1 And Status9 = 1 Then ;1ste puls registeren
Status9 = 0
Status10 = Status10 + 1
DelayMS Vertraging1
ElseIf Status10 = 2 Then ;2de puls uitladen stoppen
High Uitladen2
DelayMS Vertraging1
Status10 = 0
EndIf
Until Programswitch = 1 ;Programma uitvoeren totdat programmaswitch veranderd.
End ;Einde programma[Bericht gewijzigd door Henry S. op (94%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Teken eens een flow diagram en vergelijk of de code klopt.
(Voor een buitenstaander is er aan de code niet veel te volgen)
En haal de onnodige dingen zoals de onderste If loop er uit.
Je springt naar Program_Laden als switch 1 is, en test dan meteen of 'ie ' 0 ' is. (In 1uS verandert er echt niks...)
If Programswitch = 1 Then ;Als programmaswitch hoog is da programma laden uitvoeren. (pull up weerstand)
GoTo Program_laden
EndIf
If Programswitch = 0 Then ;Als programmaswitch laag is dan programma lossen uitvoeren. (gebruikerinput)
GoTo Program_lossen
EndIf
Wend
;/////////////////////////PROGRAM LADEN BAND 1//////////////////////////////////
Program_laden:
Status1 = 0
Status2 = 0
Status3 = 0
Status4 = 0
Status5 = 0
Status6 = 0
If Programswitch = 0 Then ;Kijken of voorwaarde nog steeds actief is.
GoTo Program_main ;Indien voorwaarde veranderd is programma sluiten en terug naar programma lossen
EndIf
Aan het eind (bij het END directive) loopt de PIC vast, omdat je nergens heen gaat.
Op zijn minst altijd iets opnemen als een:
LOOP GOTO LOOP
END
Ten eerste dit, waarom zet je dit neer je gebruikt dit nergens.
;76543210
ADCON0 = %00000000
ANSEL = %00000000
ANSELH = %00000000
WPUA = %00000000
IOCA = %00000000
Dat kan je dus weg laten.
Wat heb je gedaan met je MCLRE_PIN, hangt die via een pullup aan de 5VDC, met een condensator naar de gnd. (weerstan 10K, en condensator 100nF)
En plaats eens een schema, als je dat hebt. Het kan zomaar een hardware probleem zijn.
EDIT:
En wat is dit.
[Bericht gewijzigd door Lambiek op (13%)]
Zorg eerst wat anderen al aangaven voor een goed verloop, je zen, je flow, dan is het voor je zelf ook duidelijker.
Anderen gaven voorbeelden, op een ( 1 ) plek duidelijk wat er gebeurt kwa programma keuze, en niet onnodige verstopte testen en dan maar springen.
Program_main:
While 1=1
If Programswitch = 1 Then
GoSUB Program_laden
Else
GoSUB Program_lossen
EndIf
WEND
Program_laden:
....... Je laden code , zonder je portb.6 nog eens te checken
Return
Program_lossen:
....... Je lossen code, zonder je portb.6 , je ProgramSwitch nog eens te checken.
Return
Wat ik ook zie dat je eigenlijk geen stop of pauze hebt. Dat ding blijft eeuwig laden en lossen. Of zie ik dat verkeerd? Heeft het eindschakelaars? Test je op deze ook?
Program_main:
While 1=1
If StopRunSwitch = 1 then ; 1 = run 0 = uit. Zorg er wel voor dat als deze kapot gaat, het geheel stopt!
If Programswitch = 1 Then
GoSUB Program_laden
Else
GoSUB Program_lossen
EndIf
Endif
WEND
Wat betreft veiligheid, Zorg er wel voor dat als deze stop run schakelaar kapot gaat, het geheel stopt, en niet als de bv de kabe of aansluitingl kapot gaat het juist begint te werken.
Hoe visualiseer je de situatie, gebruik je bv ledjes om aan te duiden of je in run mode staat en in welk programma je bezig bent?
Over lossen
Wat bedoel je met 'pallet-detectieX = 0'? Betekent dit er is een pallet of juist niet?
Wat als pallet-detectie=1 en je status7 = 0 ? Bv na even een stroom uitval of whatever?
Of, status8 wordt opgehoogd in een loop, dus kan makkelijk hoger worden dan 2, rekening mee gehouden?
Op 29 januari 2012 09:42:48 schreef Lord Anubis:
Wat ik ook zie dat je eigenlijk geen stop of pauze hebt. Dat ding blijft eeuwig laden en lossen. Of zie ik dat verkeerd? Heeft het eindschakelaars? Test je op deze ook?
Zitten eind schakelaars in (vol detectie is eind schakelaar)net als dat pallet_detectie ook als eind schakelaar kan fungeren.[...]
Wat betreft veiligheid, Zorg er wel voor dat als deze stop run schakelaar kapot gaat, het geheel stopt, en niet als de bv de kabe of aansluitingl kapot gaat het juist begint te werken.
dit is voor een modelbouw projectje niet van toepassing. Als er wat kapot gaat dan komt er in het ergste geval een pallet met piepschuim (30g) naar buiten vallen. of loopt het tegen de achterwand aan. Een stekker los trekken op dat moment lost het probleem voor dan op en zet de installatie buiten werking.
Hoe visualiseer je de situatie, gebruik je bv ledjes om aan te duiden of je in run mode staat en in welk programma je bezig bent?
de programma status wordt niet gevisuleerd met ledjes. aleen met de motor regeling print die gaat draaien of niet.
Over lossen
Wat bedoel je met 'pallet-detectieX = 0'? Betekent dit er is een pallet of juist niet?
Wat als pallet-detectie=1 en je status7 = 0 ? Bv na even een stroom uitval of whatever?
Of, status8 wordt opgehoogd in een loop, dus kan makkelijk hoger worden dan 2, rekening mee gehouden?met een stroom onderbreking herstart de pic, en worden alle statussen gereset.
ik heb mijn antwoorden in je tekst geplaatst.
Op 28 januari 2012 16:04:57 schreef Lambiek:
Ten eerste dit, waarom zet je dit neer je gebruikt dit nergens.;76543210 ADCON0 = %00000000 ANSEL = %00000000 ANSELH = %00000000 WPUA = %00000000 IOCA = %00000000Dat kan je dus weg laten.
Wat heb je gedaan met je MCLRE_PIN, hangt die via een pullup aan de 5VDC, met een condensator naar de gnd. (weerstan 10K, en condensator 100nF)
En plaats eens een schema, als je dat hebt. Het kan zomaar een hardware probleem zijn.EDIT:
En wat is dit.While 1 = 1 High Inladen1 High Inladen2 High Uitladen1 High Uitladen1 [code][/quote] de configuratie die daar staat is nodig om de AD registers uit te schakelen. Weghalen resulteert in een niet werkende pic / poorten. er hangt een 4k7 weerstand als pull up en 100nf over de +/- van de pic. verder zitten de schakelaars op de betreffende poorten aangesloten en aan de andere kant 5v. Er zitten pull down weerstanden 1k op de ingangen van de pic. [quote][message=1350144,quote][b]Op 28 januari 2012 15:45:58 schreef Arco[/b][/message]: Teken eens een flow diagram en vergelijk of de code klopt. (Voor een buitenstaander is er aan de code niet veel te volgen) En haal de onnodige dingen zoals de onderste If loop er uit. Je springt naar Program_Laden als switch 1 is, en test dan meteen of 'ie ' 0 ' is. (In 1uS verandert er echt niks...) [code=picbasic] If Programswitch = 1 Then ;Als programmaswitch hoog is da programma laden uitvoeren. (pull up weerstand) GoTo Program_laden EndIf If Programswitch = 0 Then ;Als programmaswitch laag is dan programma lossen uitvoeren. (gebruikerinput) GoTo Program_lossen EndIf Wend ;/////////////////////////PROGRAM LADEN BAND 1////////////////////////////////// Program_laden: Status1 = 0 Status2 = 0 Status3 = 0 Status4 = 0 Status5 = 0 Status6 = 0 If Programswitch = 0 Then ;Kijken of voorwaarde nog steeds actief is. GoTo Program_main ;Indien voorwaarde veranderd is programma sluiten en terug naar programma lossen EndIfAan het eind (bij het END directive) loopt de PIC vast, omdat je nergens heen gaat.
Op zijn minst altijd iets opnemen als een:LOOP GOTO LOOP END
ik ga hier even mee aan de gang. zal vanavond worden.
[Bericht gewijzigd door Henry S. op (22%)]
Bij deze de volledig werkende code:
Het probleem is opgelost!
Lag toch in dat de loop aan het einde ontbrak en vermoedelijk de dubbele controle / check die ik deed om te zien of het programma nog uitgevoerd mocht worden.
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : Alwin Winius *
'* Notice : Copyright (c) *
'* : All Rights Reserved *
'* Date : 8-11-2011 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
Device 16F690 ;We gebruiken een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, MCLRE_OFF, CP_OFF, CPD_OFF, BOR_OFF, IESO_OFF, FCMEN_OFF
All_Digital TRUE ;Alle ingangen digitaal
;76543210
ADCON0 = %00000000
ANSEL = %00000000
ANSELH = %00000000
WPUA = %00000000
IOCA = %00000000
;76543210
TRISA = %00000111
TRISB = %01010000
TRISC = %00000111
Dim Status1 As Byte
Dim Status2 As Byte
Dim Status3 As Byte
Dim Status4 As Byte
Dim Status5 As Byte
Dim Status6 As Byte
Dim Status7 As Byte
Dim Status8 As Byte
Dim Status9 As Byte
Dim Status10 As Byte
Dim Vertraging1 As Byte
Vertraging1 = 50
Symbol Pallet_detectie1 = PORTA.0
Symbol Pallet_rust1 = PORTA.1
Symbol Pallet_vol1 = PORTA.2
Symbol Inladen1 = PORTA.4
Symbol Uitladen1 = PORTA.5
Symbol Pallet_detectie2 = PORTC.0
Symbol Pallet_rust2 = PORTC.1
Symbol Pallet_vol2 = PORTC.2
Symbol Inladen2 = PORTC.4
Symbol Uitladen2 = PORTC.5
Symbol Programswitch = PORTB.6
;/////////////////////////PROGRAM MAIN//////////////////////////////////////////
Program_main:
While 1 = 1
High Inladen1
High Inladen2
High Uitladen1
High Uitladen1
DelayMS 500
If Programswitch = 1 Then ;Als programmaswitch hoog is da programma laden uitvoeren. (pull up weerstand)
GoTo Program_laden
EndIf
If Programswitch = 0 Then ;Als programmaswitch laag is dan programma lossen uitvoeren. (gebruikerinput)
GoTo Program_lossen
EndIf
;/////////////////////////PROGRAM LADEN BAND 1//////////////////////////////////
Program_laden:
Status1 = 0
Status2 = 0
Status3 = 0
Status4 = 0
Status5 = 0
Status6 = 0
Repeat
If Pallet_detectie1 = 1 And Pallet_vol1 = 0 Then ;Inladen pallets starten
Low Inladen1
DelayMS Vertraging1
Status3 = 0
ElseIf Pallet_rust1 = 1 And Status1 = 0 Then ;stoppen pallets bij rust positie eerste pallet. (1 puls)
High Inladen1
DelayMS Vertraging1
Status1 = 1
ElseIf Pallet_rust1 = 0 And Status1 = 1 And Status2 = 0 Then ;puls 1 registreren.
Status2 = 1
DelayMS Vertraging1
ElseIf Pallet_rust1 = 1 And Status2 = 1 Then ;puls 2 registreren.
Status2 = 0
Status3 = Status3 + 1
DelayMS Vertraging1
ElseIf Status3 = 3 Then ;stoppen pallets nadat 1 pallet reeds geladen is. (3 pulsen)
High Inladen1
Status3 = 0
DelayMS Vertraging1
ElseIf Pallet_vol1 = 1 Then ;stoppen lopende band bij band vol
High Inladen1
DelayMS Vertraging1
EndIf
;/////////////////////////PROGRAM LADEN BAND 1//////////////////////////////////
If Pallet_detectie2 = 1 And Pallet_vol2 = 0 Then ;Inladen starten
Low Inladen2
DelayMS Vertraging1
Status6 = 0
ElseIf Pallet_rust2 = 1 And Status4 = 0 Then ;stoppen pallets bij rust positie eerste lading. (1 puls)
High Inladen2
DelayMS Vertraging1
Status4 = 1
ElseIf Pallet_rust2 = 0 And Status4 = 1 And Status5 = 0 Then ;puls 1 registrerem
Status2 = 1
DelayMS Vertraging1
ElseIf Pallet_rust2 = 1 And Status5 = 1 Then ;Puls 2 registreren
Status5 = 0
Status6 = Status6 + 1
DelayMS Vertraging1
ElseIf Status6 = 3 Then ;stoppen pallets nadat 1 pallet reeds geladen is. (3 pulsen)
High Inladen2
Status6 = 0
DelayMS Vertraging1
ElseIf Pallet_vol2 = 1 Then ;stoppen lopende band bij band vol
High Inladen2
DelayMS Vertraging1
EndIf
Until Programswitch = 0 ;Programma uitvoeren tot programswitch is veranderd
;////////////////////////PROGRAM LOSSEN/////////////////////////////////////////
Program_lossen:
Status7 = 0
Status8 = 0
Status9 = 0
Status10 = 0
Repeat ;Indien voorwaarde veranderd is programma afsluiten en terug naar laden
If Pallet_detectie1 = 0 And Status7 = 0 Then ;Pallets uitladen band starten.
Low Uitladen1
Status7 = 1
DelayMS Vertraging1
ElseIf Pallet_detectie1 = 1 And Status7 = 1 Then ;1ste puls registeren
Status7 = 0
Status8 = Status8 + 1
DelayMS Vertraging1
ElseIf Status8 = 2 Then ;2de puls uitladen stoppen
High Uitladen1
DelayMS 5000
Status8 = 0
EndIf
If Pallet_detectie2 = 0 And Status9 = 0 Then ;pallets uitladen, band starten.
Low Uitladen2
Status9 = 1
DelayMS Vertraging1
ElseIf Pallet_detectie2 = 1 And Status9 = 1 Then ;1ste puls registeren
Status9 = 0
Status10 = Status10 + 1
DelayMS Vertraging1
ElseIf Status10 = 2 Then ;2de puls uitladen stoppen
High Uitladen2
Status10 = 0
DelayMS 5000
EndIf
Until Programswitch = 1 ;Programma uitvoeren totdat programmaswitch veranderd.
GoTo Program_main
Wend
End ;Einde programma