Hallo iedereen,
ik ben onlangs begonnen met pic te programeren
maar nu ik al de oefeningen van pic basic gemaakt had wou ik beginnen met iets van mezelf
ik wou een bedieningspaneeltje maken met een Lc-Display en knopjes
nu had ik een programma en dit werkt nog maar half 
maar ik zit een beetje vast in dit stukje :
Test:
repeat
Print at 1,3, "Kleine PCB ?"
delayms tijd2
cls
Print at 1,4, "Grote PCB ?"
delayms tijd2
cls
until restart = uit
if restart = uit then goto test1
test1:
print at 1,1, "TEST"
nu pinkt hij de hele tijd tussen "Kleine PCB?" en " Grote PCB?"
en als ik 1 keer op de knop doet doet hij niets
als ik de knop inhoud als er "Kleine PCB?" staat gebeurt er niets pas als "Grote PCB?" zijn tijd heeft uitgedaan komt er "Test" te staan
het zou dus als volgt moeten zijn:
hij pinkt tussen "Kleine PCB?" en " Grote PCB?" en vanaf ik 1 keer op de knop duw moet hij TEST laten verschijnen
Alvast bedankt voor jullie reacties!
Steeds als het programma bij de "until restart" komt kijkt hij pas naar de status van je ingang, niet gedurende je programma. Als je kort drukt mist hij hem dus.
Je kunt nu twee dingen doen. De eerste optie is je delay door deze constructie vervangen:
FOR i = 1 TO 100
DELAYMS tijd2 / 100
IF restart = uit THEN GOTO test1
NEXT i
Je breekt je delay dus eigenlijk op in 100 stukjes, waarbij er tussendoor steeds even gekeken wordt of de knop niet ingedrukt wordt.
Je tweede optie is gebruik maken van interrupts. Je PIC kan dan zijn normale programma onderbreken als er op de knop gedrukt wordt en naar een speciale subroutine springen. Ontzettend interessante materie, maar ik zou daar later pas naar kijken.
Hmm dat eerste ziet er het duidelijkste uit 
dus dan zou ik eigenlijk het zo moeten maken :
Test:
For i=1 to 100
Print at 1,3, "Kleine PCB ?"
delayms tijd2/100
cls
Print at 1,4, "Grote PCB ?"
delayms tijd2/100
cls
if restart = uit then goto test1
next i
test1:
print at 1,1, "TEST"
of ben ik totaal fout ?
Bijna. Bij jou gaat nu het knipperen 100 keer te snel. Je moet alleen de delays in stukjes hakken.
Je code wordt dus (met wat andere kleine aanpassingen):
DIM i as BYTE
WHILE 1 = 1
CLS
PRINT AT 1,3, "Kleine PCB ?"
FOR i = 1 TO 100
DELAYMS tijd2 / 100
IF restart = uit THEN GOTO einde
NEXT i
CLS
PRINT AT 1,4, "Grote PCB ?"
FOR i = 1 TO 100
DELAYMS tijd2 / 100
IF restart = uit THEN GOTO einde
NEXT i
WEND
einde:
PRINT AT 1,1, "TEST"
Oh je bent nog niet bij de for lussen. Een for lus herhaalt een stukje code een aantal keer.
De code:
FOR i = 1 TO 100
;iets
NEXT i
is equivalent aan:
DIM i as BYTE
i = 0
loop:
i = i + 1
;iets
IF i < 100 THEN GOTO loop
Zie ook: http://www.picbasic.nl/beginners6.htm#FORNEXT
Ik was nog wel vergeten i te declareren, dat voeg ik gelijk toe.
Jawel hoor
maar had het gewoon verkeerd verwoord
het enige dat er nog bij moest was als de restart knop werd ingeduwd er eerst een CLS gebeurt anders krijg je vieze dingens hha ^^
Bedankt !
Nog enkele mogelijkheden
DIM i as BYTE
WHILE 1 = 1
FOR i = 1 TO (tijd2 * 2)
IF i = 1
CLS
PRINT AT 1,3, "Kleine PCB ?"
ELSE IF i = (tijd2 +1)
CLS
PRINT AT 1,3, "Grote PCB ?"
ELSE
DELAYMS 1
ENDIF
IF restart = uit THEN GOTO einde
NEXT i
WEND
einde:
PRINT AT 1,1, "TEST"
DIM i as BYTE
WHILE 1 = 1
FOR i = 1 TO (tijd2 * 2)
SELECT i
CASE 1
CLS
PRINT AT 1,3, "Kleine PCB ?"
CASE (tijd2 + 1)
CLS
PRINT AT 1,3, "Grote PCB ?"
CASE ELSE ;Anders...
DELAYMS 1
ENDSELECT
IF restart = uit THEN GOTO einde
NEXT i
WEND
einde:
PRINT AT 1,1, "TEST"
Of als je drie vragen wilt
DIM i as BYTE
aantVragen = 3
WHILE 1 = 1
FOR j = 1 TO aantVragen
FOR i = 0 TO tijd2
Q = i * j
SELECT Q
CASE (1 * tijd2) ; 1* is alleen voor de gedachte erachter. Tijd2 is voldoende.
CLS
PRINT AT 1,3, "Kleine PCB ?"
CASE (2 * tijd2)
CLS
PRINT AT 1,3, "Middel grote PCB ?"
CASE (3 * tijd2)
CLS
PRINT AT 1,3, "Grote PCB ?"
CASE ELSE ;Anders...
DELAYMS 1
ENDSELECT
IF restart = uit THEN GOTO einde
NEXT i
NEXT j
WEND
einde:
PRINT AT 1,1, "TEST"
Aanvulling: Q als float, gaat denk ik niet werken omdat select case een integral value nodig heeft. zie opmerking post van loopycoaster hier op volgend.
DIM i as BYTE
Dim Q as FLOAT
aantVragen = 3
WHILE 1 = 1
FOR j = 1 TO aantVragen
FOR i = 1 TO tijd2 +1
Q = (i * j)/tijd2. ; Q als float, kan niet Q als byte rond het af.
SELECT Q
CASE 1
CLS
PRINT AT 1,3, "Kleine PCB ?"
CASE 2
CLS
PRINT AT 1,3, "Middel grote PCB ?"
CASE 3
CLS
PRINT AT 1,3, "Grote PCB ?"
CASE ELSE ;Anders...
DELAYMS 1
ENDSELECT
IF restart = uit THEN GOTO einde
NEXT i
NEXT j
WEND
einde:
PRINT AT 1,1, "TEST"
En Kjell gebruik code tags om een mooiere layout te krijgen.
Succes
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
Leuk gevonden oplossingen Lord Anubis, ik denk een beetje te gevorderd voor de TS, maar toch interessant.
Als je Q declareert als byte wordt een deling afgerond als integer (3.8 wordt 3).
Het laatste voorbeeld is Denk ik fout omdat Select case een integral value nodig heeft. Bedankt loopy.coaster.
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
Okay maar als ik me nu niet vergis, moet Q nu exact gelijk aan 1.000 zijn om 'kleine display' te showen, 1.1 is niet goed genoeg.
En ik denk met het gebruik van floats valt de snelle/geheugen sparende eigenschap van deze code eigenlijk weg.
Keuze 1 en 2 zijn dan beter en duidelijker vind ik.
@Lord Anubis
ik ga het toch maar bij het voorstel van Pientertje houden
vind ik persoonlijk gemakkelijker 
maar toch ik weet al wat meer door dat van jou 
Dankuwel !
Tips voor in de toekomst!
In de loop van de tijd ga je herkenen dat je eigenlijk dubbele code hebt, en ook, en dat is nog het belangrijste, dubbel werk hebt om het te onderhouden.
Tevens, en in dit geval zal het niet zeveel uitmaken, maar als je programma flink wat groter wordt, zal je code met de dubbele code, meer geheugen in beslag nemen.
Stel je zelf vragen. .Wat ga je doen als er de volgende keer je drie, vijf of tien vragen over je PCB krijgt?
Of je maakt een vooruit/ achteruit knoppen om tussen je 3 of meer keuzen heen weer wilt lopen. Denk maar aan tijd instelling of op je printer.
Ik bedoel, als je iets maakt, probeer het op verschillende manieren te benaderen. Zal je heel veel van leren.
Succes.
Zal ik zeker onthouden !
Dankuwel iedereen voor jullie hulp
nu loop ik weer op iets ..
WHILE 1 = 1
PRINT AT 1,3, "Kleine PCB ?"
Print at 2,3, "Druk op 1"
FOR i = 1 TO 100
DELAYMS tijd2 / 100
IF Knop1 = uit THEN GOTO Klein
If Knop2 = uit then goto groot
NEXT i
CLS
PRINT AT 1,4, "Grote PCB ?"
Print at 2,4, "Druk op 2"
FOR i = 1 TO 100
DELAYMS tijd2 / 100
IF Knop1 = uit THEN GOTO klein
If Knop2 = uit then goto groot
NEXT i
WEND
klein:
CLS
PRINT AT 1,1, "Tijd.."
Print at 2,1, "Doorgaan?"
groot:
CLS
print at 1,1, "hallo"
dus nu zou ik 2 verschillende knoppen willen maar hij kiest altijd voor "groot"
[Bericht gewijzigd door Henry S. op (85%)]
Je code sprint nu netjes naar klein, maar gaat vervolgens gewoon vrolijk verder bij groot. Je tekst "Tijd..." wordt zo snel weer overschreven dat je hem niet ziet. De oplossing is om op het einde een label te plaatsten en daar heen te springen:
klein:
CLS
PRINT AT 1,1, "Tijd.."
Print at 2,1, "Doorgaan?"
GOTO einde
groot:
CLS
print at 1,1, "hallo"
einde:
DANKU !!!
idd hij leesde dus gewoon het programma van kop tot teen en voerde het gewoon uit
had dit ook al gelezen op picbasic maar heb er gewoon niet aan gedacht
Nogmaals Danku 
Weet er perongeluk iemand de volledige versie van Proton IDE ? want heb nu de Lite versie en kan maar maximum 50 regeltjes schrijven 
[Bericht gewijzigd door Henry S. op (27%)]
Die zul je moeten kopen ! http://www.crownhill.co.uk/level3.php?cat=1
of : http://www.voti.nl/winkel/p/PIC-ProtonPlus.html
[Bericht gewijzigd door Shiptronic op (19%)]
Op 5 augustus 2012 22:28:18 schreef Kjell95:
en kan maar maximum 50 regeltjes schrijven
Misschien kan dit je een dag verder helpen, wat dubbele code eruit. Code schrijven is een uitdaging en zeker met een max van 50 regels. 
DIM i as BYTE
aantVragen = 2
start:
WHILE knop1 = knop2
FOR i = 1 TO tijd2 * aantVragen
SELECT i
CASE tijd2
PRINT AT 1,3, "Kleine PCB ?"
Print at 2,3, "Druk op 1"
CASE (2 * tijd2)
PRINT AT 1,4, "Grote PCB ?"
Print at 2,4, "Druk op 2"
CASE ELSE
DELAYMS 1
ENDSELECT
NEXT i
WEND
CLS
IF Knop1 = uit THEN
PRINT AT 1,1, "Tijd.."
Print at 2,1, "Doorgaan?"
else if Knop2 = uit
print at 1,1, "hallo"
else GOTO Start
endif
Op 5 augustus 2012 22:20:31 schreef Kjell95:
Weet er perongeluk iemand de volledige versie van Proton IDE ?
Lees dit eens!
Op 6 augustus 2012 20:46:58 schreef Kjell95:
@Shiptronic : pff zo duur
Er zijn genoeg alternatieven: Swordfish, JAL, Amicus etc...
Je vroeg naar de bekende weg...
Dit had je waarschijnlijk al gelezen.
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Op 6 augustus 2012 20:46:58 schreef Kjell95:
@Shiptronic : pff zo duur
Af en toe goedkoper bij Vraag en Aanbod. Je kunt ook voor zo'n myamicus bordje gaan (of dezelfde PIC gebruiken als die daar op zit), dat is flink goedkoper.
BASIC is wel goed om mee te leren programmeren omdat het zo makkelijk is. Later kun je alsnog overgaan op een andere taal, basisprincipes zijn toch gelijk (hoe maak je lussen?, wat is nette code en wat absoluut niet? Hoe werkt de hardware van mijn microcontroller? Dat soort dingen zijn taalonafhankelijk)
Voila heb het aangeschaft 
nu had ik nog een vraag
weet iemand of je 2 pic16F628A 's kan linken met elkaar zodat ze al 1 werken?
of mss een alternatief dat ik zelf ook nog kan programeren?
ik heb namelijk ingangen te weinig .. 
Alvast bedankt
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Als 1 zullen ze nooit gaan werken, je kunt ze wel serieel koppelen, zodat de ene weet wat de andere doet...
Je kunt er ook een i/o extender (bijv. MCP23017) aan hangen, of nog beter, een geschikte pic met meer i/o kiezen.