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 :p
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"

hmm oke ,

die i is dat dan een variable ?
jha he? maar welke hoeveelheid moet die dan hebben?

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

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.

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

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

@Shiptronic : pff zo duur :p
@ Lord Anubis : hhe das al een heel stuk eraf :p dankje

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

Er zijn genoeg alternatieven: Swordfish, JAL, Amicus etc...

Henry , ik vraag toch niet voor een crack of dergelijke?

Je vroeg naar de bekende weg...
Dit had je waarschijnlijk al gelezen.

Op 6 augustus 2012 20:46:58 schreef Kjell95:
@Shiptronic : pff zo duur :p

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

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.