Hjälp med enkel krets (PIC16f84A)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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... :-)
Användarvisningsbild
bose
Inlägg: 241
Blev medlem: 20 oktober 2005, 20:48:10
Ort: Blekinge

Inlägg av bose »

Får man inte ha goto kommandon i en subrutin? Jag har inte en aning :?
Användarvisningsbild
gurgalof
EF Sponsor
Inlägg: 1311
Blev medlem: 18 februari 2004, 22:15:06
Ort: Göteborg
Kontakt:

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Användarvisningsbild
bose
Inlägg: 241
Blev medlem: 20 oktober 2005, 20:48:10
Ort: Blekinge

Inlägg 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..
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
Användarvisningsbild
bose
Inlägg: 241
Blev medlem: 20 oktober 2005, 20:48:10
Ort: Blekinge

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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.
Användarvisningsbild
bose
Inlägg: 241
Blev medlem: 20 oktober 2005, 20:48:10
Ort: Blekinge

Inlägg 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.
Skriv svar