Sida 2 av 2

Postat: 28 februari 2006, 18:10:56
av sodjan
Det är bara att dra in koden lite "snyggt" t.ex :

Kod: Markera allt

;***Subroutine Hissa upp gafflarna och kontrollera att de är uppe***;
Upp
    BTFSC    PORTB,3     ;kolla om mikrobrytaren uppe=1
    goto     START       ;Om den är uppe behöver inget göras och vi testar igen
    movlw    b'00110'    ;skicka bitarna för att sätta igång RA1 och RA2
    movwf    PORTA       ;skicka de till PORTA
;    clrwdt              ;nollställ WDT
Check1
    BTFSS    PORTB,3     ;Kolla om mikrobrytaren uppe=1
    goto     Check1      ;om den inte är det kolla igen
    clrf     PORTA       ;Stäng av
    Return               ;annars gå tillbaka till huvudprogrammet 
Då försvinner varningarna. Och det *är* vid build man får dom, så jag
förstår inte dig riktigt där... De kommer i "output" fönstret.

> Jag får nog läsa lite till om µC innan jag börjar programmera nästa gång...

Bättre att läsa lite om MPASM, det är inte processoererna som klagar... :-)

Till sist, du har ett annat *MYCKET* allvarligt fel i din kod (som jag såg nu) !!
Du får ett par timmar på dig att fundera.
Det har med call/goto/return att göra, och felet ligger i den kod jag kopierade ovan... :-)

Postat: 1 mars 2006, 08:33:36
av bose
Får man inte ha goto kommandon i en subrutin? Jag har inte en aning :?

Postat: 1 mars 2006, 15:30:49
av gurgalof

Kod: Markera allt

Check1
    BTFSS    PORTB,3     ;Kolla om mikrobrytaren uppe=1
    goto     Check1      ;om den inte är det kolla igen
    clrf     PORTA       ;Stäng av
    Return               ;annars gå tillbaka till huvudprogrammet "MEN om inte micro brytaren har varit uppe så kör går den till Check1 igen och om du då tar return hoppar den bara tillbaks till check1"
Blir en evighets loop tror jag...
hoppas du förstår vad jag menar

Postat: 1 mars 2006, 15:52:28
av sodjan
> Får man inte ha goto kommandon i en subrutin?

Jo, men inte till lables som ligger *utanför* subrutinen !!
START ligger väl utanför subrutinen ?

En subrutin ska *alltid* avslutas via en RETURN, inget annat.

gurgalof> return hoppar den bara tillbaks till check1...

RETURN "hoppar" alltid tillbaks till den instruktion som ligger efter
senast utförda CALL, inget annat. Och det är inte Check1, så vitt jag kan se.

> Blir en evighets loop tror jag...

Bara om brytaren "uppe" *aldrig* blir = 1.
Det som saknas är någon slags "timeout", om man vill ha det...

Postat: 2 mars 2006, 08:19:01
av bose
Okej.
Men då kan jag skriva om det så att kompressorn pumpar i en förutbestämd tid och sedan kollar man igen om den är uppe och är den inte det pumpar den igen? Det borde fungera eftersom jag har en övertrycksventil med så det är ingen risk för för högt tryck..

Postat: 2 mars 2006, 08:58:57
av Icecap
Jag tror att du missuppfattar lite.

Vad sodjan menar är att om den ska pumpa i hur lång tid som helst utan att komma till ändläge får du inget larm om funktionsfel.

Vad du alltså kanske skulle ha med är en timer som ger larm om det tar för lång tid att komma till valda ändläge.

Postat: 2 mars 2006, 10:01:44
av bose
Okej. Kan någon ge ett programexempel på det? Kan inte klura ut hur jag ska skriva det, iaf inte när jag sitter i skolan :S

Postat: 2 mars 2006, 12:18:03
av sodjan
Om vi först tar problemet med call/goto/return, så ska t.ex "Upp" rutinen se ut så här :

Kod: Markera allt

;***Subroutine Hissa upp gafflarna och kontrollera att de är uppe***;
Upp
    BTFSC    PORTB,3     ;kolla om mikrobrytaren uppe=1
    goto     end_of_upp  ;Om den är uppe behöver inget göras och vi testar igen
    movlw    b'00110'    ;skicka bitarna för att sätta igång RA1 och RA2
    movwf    PORTA       ;skicka de till PORTA
;    clrwdt              ;nollställ WDT
Check1
    BTFSS    PORTB,3     ;Kolla om mikrobrytaren uppe=1
    goto     Check1      ;om den inte är det kolla igen
    clrf     PORTA       ;Stäng av
end_of_upp
    Return               ;annars gå tillbaka till huvudprogrammet
Notera ändringen där det stog "goto START" !
D.v.s att subrutinen "Upp" alltid avslutas via ett enda RETURN, oavsett vad som händer inne i "Upp".
Aldrig genom att man bara hoppar ur med en GOTO.

Sen, ner det gäller kontroller/timeouts, så är det svårt att ge något
generellt svar på det. Det beror mycket på *vilka* "onormala" lägen
man vill gardera sig mot. Men i allmänhet vill man väl inte att det ska
hända något "farligt" om någon del av ansluten utrustning lägger av.
T.ex genom att man sätter allt till ett "säkert" läge. Stänger av motorer,
stannar kolvar, stänger ventiler eller liknande.

T.ex, om man startar gaffeln uppåt, och man vet att det tar normalt
ca 1 sek, så kanske man vill ha ett larm om switchen "uppe" inte har
blivit "1" inom 5 sek (eller liknande).

På lite nyare processorer där man man både stänga på och av WDT
via applikationen (och dessutom programmera timeouten) kan WDT
användas som säkerhets timeout. Man sätter en variabel til något
känt värde, så vet processorn efter ett WDT-reset, vilken funktion som
gick fel.

Postat: 2 mars 2006, 13:56:17
av bose
Tack så mycket! :D

Jag ska försöka klura ut någon timeout eller så i helgen och se om det fungerar. Och lägga till en larmutgång så att man får upp ett larm på datorskärmen när nåt inte fungerar.

WDT har denna processorn men jag avaktiverade den under testningen för att jag ville se aå att själva programmet fungerade. Jag är ju som sagt inte så säker på programmering men ska försöka få igång wdt'n med i det slutgiltiga programmet.