Na wat prutsen met andere zaken, aankoop van proton ide en experimenteren, ben ik terug gekeerd nnar een eerder project (forum Velleman k8048 met pic 16f627).
Met het cursusboek proton ide, googelen en uw hints heb ik geprobeerd zelf iets te programeren in Proton ide om twee stappenmotoren tegelijkertijd te besturen.
Het komt overeen met twee looplichten van telkens 4 leds en vier drukknoppen. DK1 doet led 1-4 naar boven lopen, Dk2 naar beneden en
DK3 en DK4 hetzelfde voor led 5-8.
Mijn manier is waarschijnlijk niet de meest compacte of efficiente maar ik wou het voor mezelf zo duidelijk en eenvoudig maken.
Mijn eerder probleem blijft echter hetzelfde, ik kan geen twee drukknoppen samen bedienen, hij werkt eerst de subroutine af van de eerst gedrukte drukknop voordat hij aan de andere begint en gaat dat herhalen in dezelfde volgorde als de knoppen ingedrukt blijven.
Wat bijvoegen of wijzigen om de drukknoppen samen te gebruiken?
Ik heb het *bas-bestand in het uploadarchief geplaatst.
Ik denk dat dit niet gelukt is, daarom plaats ik het hier.

Mod-edit: Is wel gelukt, staat hier:
http://www.uploadarchief.net/files/download/stmb3.bas

[Bericht gewijzigd door Henry S. op (63%)]

Alle 'goto Menu' in deel 'Menu' vervangen door Goto Menu1
Alle 'goto Menu' in deel 'Menu1' vervangen door Goto Menu2
Alle 'goto Menu' in deel 'Menu2' vervangen door Goto Menu3

Sorry, het resultaat blijft hetzelfde.
Ik heb de aanpassing in het uploadarchief geplaatst.
Sw1-Sw2 en sw3-sw4 moeten tegelijk kunnen werken ( twee motoren).
Hij begint pas aan de andere loop als de vorige is afgewerkt.
Het is nu wel zo dat Sw1 en Sw2 niet samen mogen werken en hetzelfde voor Sw3 met Sw4 (geeft kortsluiting in de motor).
Opabob.

Als je beide motoren tegelijk wilt laten draaien, is het het simpelst om iets interrupt-gestuurds te maken.

je zou ook zoiets eens kunnen proberen

if sw1 = 1 then
portb = %00010001
delayms 500
portb = %00100010
delayms 500
enz

op deze manier is het gemakkelijk om twee motoren tegelijk te laten lopen
je kunt dan voor iedere situatie een aparte subroutine maken

kijk voor zeer duidelijke uitleg ook op de site van Frits
www.picbasic.nl bij cursus

groet Gerard

Hallo Opabob.

Heb het programma aangepast, probeer het nu eens. Het is getest en hier werkt het.


; Aangepast programma voor opa_bob.


Device 16F628A               ; processor type 16F628A

Config INTRC_OSC_NOCLKOUT,_  ; Interne oscillator geen clocksignaal naar buiten
       WDT_OFF,_             ; WatchDog Timer uitgeschakeld
       PWRTE_ON,_            ; Power-up Timer Enable ingeschakeld
       LVP_OFF,_             ; Low Voltage Programming uitgeschakeld
       MCLRE_OFF             ; Externe Master Reset Enable uitgeschakeld
                               
ALL_DIGITAL TRUE             ; Alle ingangen digitaal
 
Symbol On  = 1               ; On is hoog
Symbol off = 0               ; Off is laag                              
  
'Ingangen declareren

Symbol sw1      = PORTA.0
Symbol sw2      = PORTA.1
Symbol sw3      = PORTA.2
Symbol sw4      = PORTA.3
;Symbol sw5      = PORTA.4
;Symbol sw6      = PORTA.5
;Symbol sw7      = PORTA.6
;Symbol sw8      = PORTA.7

'Uitgangen declareren

Symbol led1     = PORTB.0
Symbol led2     = PORTB.1
Symbol led3     = PORTB.2
Symbol led4     = PORTB.3
Symbol led5     = PORTB.4
Symbol led6     = PORTB.5
Symbol led7     = PORTB.6
Symbol led8     = PORTB.7

Symbol tijd = 500            ; Waarde wachttijd

; Alleen de waarde achter tijd veranderen als het sneller of langzamer moet.

Clear                        ; Wis alle ram geheugen

DelayMS 1000                 ; Stabilisering
    
        ;76543210            ; Hulpregel poort_A
PORTA = %00000000            ; Alle niveaus van Poort_A eerst laag maken
TRISA = %11111111            ; PortA0 - PortA7 allemaal ingangen 
        ;76543210            ; Hulpregel poort_B
PORTB = %00000000            ; Alle niveaus van Po0rt_B eerst laag maken
TRISB = %00000000            ; PortB0 - PortB7 allemaal uitgangen 
                      
'****************************************************************    
'Decraraties voor programma:   
'****************************************************************

'Hoofdprogramma 

menu:

While On = On
    led1 = 0
    led2 = 0
    led3 = 0
    led4 = 0
     
If sw1 = On Then
    led1 = On
    DelayMS tijd
    led1 = off  
    led2 = On
    DelayMS tijd
    led2 = off  
    led3 = On
    DelayMS tijd
    led3 = off  
    led4 = On
    DelayMS tijd
    led4 = off
EndIf

Wend
  
End 

Hou ook rekening met de volgorde van opbouwen, zoals in het voorbeeld staat. nu kan je zelf proberen het uit te bouwen.

Als het sneller moet alleen de waarde achter tijd aan passen.

Dat is een stukje ASM_CODE.

Het is het op BIT niveau controleren van een Registerbit.

BT = Bitcheck
F = Register
S = Skip Next command if
S / C = Set (1) / Clear (0)

In het nederlands verteld het niets meer dan, Controleer op bitniveau het register en als die 'hoog' (1) is dan de eerstvolgende opdracht overslaan.

Bijv:


#DEFINE SW  PORTA,0   ; Registerbit toewijzen 

TESTH
; Het volgende is een soort van LOOP ... UNTIL
BTFSS SW     ; Check registerbit of deze HOOG is
GOTO TESTH   ; registerbit is nog niet HOOG, ga naar TESTH

TESTL
BTFSC SW     ; Check registerbit of deze LAAG is
GOTO TESTL   ; registerbit is nog niet LAAG, ga naar TESTL

END
 

Mijn eerder probleem blijft echter hetzelfde, ik kan geen twee drukknoppen samen bedienen

Als we het hebben over het programeren in BASIC, hebben we hiervoor de AND en de OR functie.

Met de AND-functie kijken we naar meerdere inputs en met de OR-functie kijken naar 1 input.
Het komt eigenlijk neer op een waarheidstabel:

AND:
A B = C
0 0 = 0
0 1 = 0
1 0 = 0
1 1 = 1

OR:
A B = C
0 0 = 0
0 1 = 1
1 0 = 1
1 1 = 1

Nu ben ik niet zo thuis over hoe en wat binnen Proton IDE, maar het zou er zo uit kunnen zien:

IF SW1 AND SW2 THEN  ; Beide switches moeten bediend zijn.
;Uitvoeren gewenste code
ENDIF

Weet niet of je hiermee geholpen bent.

Begreep wel dat het een stukje asm-code was... vroeg me alleen af waarom dat in zijn basic listing zat....

Tof voor al de reacties; Dank u.
De bovenstaande compilatie had ik samengesteld met gegevens uit Googelen,Picbasic.nl en vooral uit een vorige vraag aan circuits on line(Antwoorden Lambiek en hadv). De ASM code kan je ook gebruiken in het programma Proton IDE en ik heb dat dan ook gebruikt omdat het werkte.

Lambiek,
Ik heb uw compilatie getest en het werkt maar op identiek dezelfde wijze als mijn compilatie.
Ik heb mijn versie in het uploadarchief geplaats maar of het gelukt is weet ik niet.
Ik kan nog steeds geen twee toetsen samen bedienen.
Groetjes.
Opabob.

Dat weet ik, maar als je twee stappenmotoren onder een knop wil moet led_5 T/M led_7 nog toegevoegd worden.

BVB:


if sw1 = on then
led1 = on
led5 = on
delayms tijd
led1 = off
led5 = off
led2 = on
led6 = on
delayms tijd
led2 = off
led6 = off
led3 = on
led7 = on
delayms tijd
enz, enz.

En als alles de andere kant op moet lopen precies het tegenovergestelde neerzetten. Zo kan je met zes knoppen de twee motoren bedienen.

BVB:
knop_1, motor_1, linksom.
knop_2, motor_1, rechtsom.
knop_3, motor_2, linknsom.
knop_4, motor_2, rechtsom.
knop_5, motor_1 en motor_2, linksom.
knop_5, motor_1 en motor_2, rechtsom.

Dat was toch de bedoeling van uw vraag.

Lambiek,
Verkeerd uitgelegd of verkeerd begrepen.
Mijn bedoeling was om met 4 knoppen( vb joystick) de twee motoren te sturen.
Knop_1, motor_1,linksom
Knop_2, motor_1,rechtsom
Knop_3, motor_2,linksom
Knop_4, motor_2,rechtsom

De twee motoren moeten onahankelijk van elkaar maar volgens input knop 1_2 en knop 3_4 tegelijkertijd kunnen werken (vb voor_links of achter_rechts)met de beperking dat een motor slechts in één richting mag kunnen draaien (vb als knop_1 ingedrukt is mag knop_2 geen effect hebben en hetzelfde voor knoppen 3_4).
Groetjes
Opabob

@OPABOB.

Hier een ander progje. Je kan nog een paar combinaties maken zo, dus even uitproberen deze combinaties werken.


'*  Name    : STMB3_[1].                                     
'*  Author  : H.van Zwieten.                                    
'*  Notice  : Copyright (c) 2010 H.v.Z.                         
'*          : All Rights Reserved.                               
'*  Date    : 14-2-2010.                                         
'*  Version : 1.0.                                               
'*  Notes   : Twee stappen motoren met joystick aansturen.                                                  
'*          : Aangepast programma voor OPA_BOB.                                                  



Device 16F628A               ; processor type 16F628A

Config INTRC_OSC_NOCLKOUT,_  ; Interne oscillator geen clocksignaal naar buiten
       WDT_OFF,_             ; WatchDog Timer uitgeschakeld
       PWRTE_ON,_            ; Power-up Timer Enable ingeschakeld
       LVP_OFF,_             ; Low Voltage Programming uitgeschakeld
       MCLRE_OFF             ; Externe Master Reset Enable uitgeschakeld
                               
ALL_DIGITAL TRUE             ; Alle ingangen digitaal
 
Symbol On  = 1               ; On is hoog
Symbol off = 0               ; Off is laag                              
  
'Ingangen declareren

Symbol sw1      = PORTA.0
Symbol sw2      = PORTA.1
Symbol sw3      = PORTA.2
Symbol sw4      = PORTA.3

'Uitgangen declareren

Symbol led1     = PORTB.0
Symbol led2     = PORTB.1
Symbol led3     = PORTB.2
Symbol led4     = PORTB.3
Symbol led5     = PORTB.4
Symbol led6     = PORTB.5
Symbol led7     = PORTB.6
Symbol led8     = PORTB.7

Symbol tijd = 100            ; Waarde wachttijd

; Alleen de waarde achter tijd veranderen als het sneller of langzamer moet.

Clear                        ; Wis alle ram geheugen

DelayMS 1000                 ; Stabilisering
    
        ;76543210            ; Hulpregel poort_A
PORTA = %00000000            ; Alle niveaus van Poort_A eerst laag maken
TRISA = %11111111            ; PortA0 - PortA7 allemaal ingangen 
        ;76543210            ; Hulpregel poort_B
PORTB = %00000000            ; Alle niveaus van Po0rt_B eerst laag maken
TRISB = %00000000            ; PortB0 - PortB7 allemaal uitgangen 
                      
'****************************************************************    
'Decraraties voor programma:   
'****************************************************************

'Hoofdprogramma 

start:

    led1 = 0
    led2 = 0
    led3 = 0
    led4 = 0   
    If sw1 = On Then GoTo M1_Rechtsom
    If sw2 = On Then GoTo M1_Linksom
    If sw3 = On Then GoTo M2_Rechtsom
    If sw4 = On Then GoTo M2_Linksom
    If sw1 = On And sw3 = On Then GoTo M1_M2_Rehtsom
    If sw2 = On And sw4 = On Then GoTo M1_M2_Linksom
GoTo start

M1_Rechtsom:

    If sw1 = On And sw3 = On Then GoTo M1_M2_Rehtsom
    If sw2 = On And sw4 = On Then GoTo M1_M2_Linksom
    led1 = On
    DelayMS tijd
    led1 = off  
    led2 = On
    DelayMS tijd
    led2 = off  
    led3 = On
    DelayMS tijd
    led3 = off  
    led4 = On
    DelayMS tijd
    led4 = off
GoTo start

M1_Linksom:

    If sw1 = On And sw3 = On Then GoTo M1_M2_Rehtsom
    If sw2 = On And sw4 = On Then GoTo M1_M2_Linksom
    led4 = On
    DelayMS tijd
    led4 = off
    led3 = On
    DelayMS tijd
    led3 = off
    led2 = On
    DelayMS tijd
    led2 = off
    led1 = On
    DelayMS tijd
    led1 = off
GoTo start

M2_Rechtsom:

    If sw1 = On And sw3 = On Then GoTo M1_M2_Rehtsom
    If sw2 = On And sw4 = On Then GoTo M1_M2_Linksom
    led5 = On
    DelayMS tijd
    led5 = off
    led6 = On
    DelayMS tijd
    led6 = off
    led7 = On
    DelayMS tijd
    led7 = off
    led8 = On
    DelayMS tijd
    led8 = off
GoTo start

M2_Linksom:

    If sw1 = On And sw3 = On Then GoTo M1_M2_Rehtsom
    If sw2 = On And sw4 = On Then GoTo M1_M2_Linksom
    led8 = On
    DelayMS tijd
    led8 = off
    led7 = On
    DelayMS tijd
    led7 = off
    led6 = On
    DelayMS tijd
    led6 = off
    led5 = On
    DelayMS tijd
    led5 = off
GoTo start

M1_M2_Rehtsom:

    led1 = On
    led5 = On
    DelayMS tijd
    led1 = off
    led5 = off
    led2 = On
    led6 = On
    DelayMS tijd
    led2 = off
    led6 = off
    led3 = On
    led7 = On
    DelayMS tijd
    led3 = off
    led7 = off
    led4 = On
    led8 = On
    DelayMS tijd
    led4 = off
    led8 = off
GoTo start

M1_M2_Linksom:

    led8 = On
    led4 = On
    DelayMS tijd
    led8 = off
    led4 = off
    led7 = On
    led3 = On
    DelayMS tijd
    led7 = off
    led3 = off
    led6 = On
    led2 = On
    DelayMS tijd
    led6 = off
    led2 = off
    led5 = On
    led1 = On
    DelayMS tijd
    led5 = off
    led1 = off
GoTo start
        
End  

Is dit de bedoeling zo. :)

Lambiek,
Dit is inderdaad de bedoeling.
Ik ga er wel nog aan toe voegen:
M1 links_M2 rechts, M1 rechts_M2_links.
M1 Links_rechhts en M2 Links_rechts mag niet kunnen dus uitschakelen.
Sw1+Sw2, Leds 1tot 4 allemaal 0 ( uit)
Sw3+Sw4, Leds 5 tot 8 allemaal 0 ( Uit).
Met de vier overige Porta ingangen kan ik eventueel nog een gewone motor met een H-brug links en rechts laten draaien of (in weet wel aan de jijste poort een PWM sinaal maken voor servomotor of snelheidsregelinn.
Ik weet mij weer bezig te houden.
Alleszinds hartelijk dank
Opabob.

Voor een servo heb je geen pwm nodig, voor een modelbouw servo zet je bvb.


Symbol servo_motor = portB.0

Dim positie

servo servo_motor,positie

Zie les_8 voor servo's en les_7 voor pwm en h_pwm.
http://www.picbasic.nl/index_picbasic.htm

En als het om een echte servo regeling gaat heb je aan een duty_cycle
signaal genoeg, met een variabele frequentie kan je dan het toerental regelen.

Maar als je dat allemaal in een processor wil dan moet je een ander type nemen, want deze zit vol, qua in en uitgangen dan hé.

En geen dank Opabob, we zijn er om elkaar te helpen :)

Ik heb mijn aangepaste versie op het forum gezet.

http://www.uploadarchief.net/files/download/stml2h.bas

M1 en M2 doen alles wat gevraagd wordt echter hij werkt eerst zijn eerste loop af voordat hij aan de andere begint.Dus ik wou bekomen dat hij in de loop stopt wanneer de desbetreffende knop wordt losgelaten. Dit werkt perfect voor motor 1( sw1 en sw2).
Maar als ik sw3 of sw4 indruk( motor 2)doen zij hun betreffende loop maar als ik de terug los reageert er niets meer ook niet sw1 en sw2. Ik moet de pic uitschakelen( spanning inderbreken)voordat hij terug werkt.
Heb je enig idee wat ik verkeerd doe?
Groetjes.
Opabob.

Volgens mij gaat het hier fout:

    
M2_LR:

    led5 = off
    led6 = off
    led7 = off
    led8 = off 
        
END  

Er mist een:

GOTO start

nadat M2_LR is uitgevoerd.
De PIC heeft gewoon geen programma meer om uit te voeren ... hij is klaar.

END

Ook nog even dit, je maakt veelvuldig gebruik van jumps naar stukjes sub-programma. In mijn ogen zou het dan netter lijken als je gebruik maakt van

GOSUB  ;GOSUB Call BASIC subroutine at specified label.
; hier je uit te voeren code binnen de SUB.
RETURN  ;RETURN Continue at statement following last GOSUB.

[Bericht gewijzigd door DDSFM op (34%)]

Die goto start was inderdaad de reden.
Nu nog aanpassen als de motoren tegelijk moeten draaien in dezelfde richting of in de tegengestelde. Hij doet dat ook pas als de vorige loop is afgewerkt.
Het werken met Gosub en return bekijk ik later nog eens.
Ik kan terug even verder.
Dank u.
Opabob.

@Opabob.

Dat is normaal dat eerst de lus afgemaakt wordt, als je er uit wil stappen zal je tussen iedere regel moeten zetten:



IF sw1 = off Then........
IF sw2 = off Then........
IF sw3 = off Then........
IF sw4 = off Then........
enz, enz.

Ik denk als je hier met gosub en return gaat werken dat het niet helemaal goed gaat, dan moet het anders opgebouwd worden.

Hello, hier zijn we terug.
Het project werkt tot nu toe prima.
Het stoppen van de loop wanneer de tweede motor wordt aangeschakeld heb ik ondervonden dat dit niet nodig is, hij start een fractie van een seconde later dan het commando.
Doordat ik nog 4 portA poorten over had om de looptijd( motorsnelheid) te wijzigen maar ik krijg compilatie-errors. Bijgevoegd op het uploadarchief hoever ik zit en paar zaken die ik geprobeerd heb na een punt-komma.
http://www.uploadarchief.net/files/download/stml3b.bas
Compileerfouten:
Label 'TIJD2' not found
cannot assign a variable to a numeric constant.
Nog een paar die gecompileerd worden zonder fouten maar niet werken.
Graag wat hints of tips.
Dank bij voorbaat
(Nonke) Opabob.

Is er een reden waarom ik geen antwoord krijg op deze vraag??

Nou vooruit, omdat je zo aandringt:

Dit:


SYMBOL tijd = 50  ; Waarde wachttijd, hogere waarde, agere tijd.
                  ; Alleen de waarde achter tijd veranderen ....
;SYMBOL tijd2 = 500

In combinatie met dit:

;if sw5 = on then goto tijd2
    ;if sw5 = off then call tijd1
    ;IF sw5 = ON THEN CALL tijd2
    ;if sw5 = on then gosub tijd2

Of dit:

;dim tijd2 as word

Werkt dus niet.

Wat wil je nu doen, een symbol aanmaken met de naam tijd2, een functie maken met de naam tijd2 of een variabele declareren met de naam tijd2?

De bedoeling is een X-Y as te maken.
Normaal draaien de motoren(looplicht) op volle(ingesteld 'tijd1') snelheid maar dan wil ik een fijnafstelling doen door toets sw5 in te drukken('tijd2).
U ziet in mijn programma dat ik als beginneling alles zo duidelijk en eenvoudig wil maken dus de manier waarop of waarom 'tijd' wijzigen is van geen belang(duidelijk en eenvoudig).
In een later stadium(meer ervaring) bekijk ik nog wel om het volledige programma te perfectioneren.
Graag een Proton IDE voorbeeld.
Groetjes
Opabob.