Hjälp med enkel krets (PIC16f84A)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
bose
Inlägg: 241
Blev medlem: 20 oktober 2005, 20:48:10
Ort: Blekinge

Hjälp med enkel krets (PIC16f84A)

Inlägg av bose »

Jag har skrivit en kod som ska kontrollera gafflarna på vår lilla truck. Det ska finnas två lägen på dem, uppe och nere. Jag har mikrobrytare för att kontrollera om de är det, en uppe och en nere. Sen har jag en 5V signal som ska berätta för µC om gafflarna ska vara uppe eller nere.
Jag har den kopplad med en 4MHz kristall och så enligt de enklaste tutorialsen. Mikrobrytarna har jag kopplat så de bara kortsluter +5V med respektive pinne. Utgångarna har jag indikerat mha lysdioder nu. Jag använder vanliga tangentbordsströmställare just nu istället för mikrobrytarna för att enklare experimentera.
Nu till problemet: Programmet verkar fungera bra, ända tills jag kommer för nära sladdarna med mina händer, då börjar lysdioderna blinka osv.. Hur ska jag koppla det för att komma bort från detta problem eller ska jag skriva nåt i koden?

Här är koden lite grejer är utkommentera och så men det är denna jag laddade microprocessorn med. (.asm)

Kod: Markera allt

;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;
;             bose              ;
;     Säkerhetsprogram för      ;
;         styrning av           ;
;       Pneumatisk lyft         ;
;      till projektarbetet      ;
;       Datorstyrd truck        ;
;                               ;
;       --- TE3    ;
;     Furulundsskolan 2006      ;
;     ------------          ;
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;

;Made for PICmicro 16F84A
;RB1 (pin7)=Input 1 (Signal från kortet. 1=Uppe  0=Nere)
;RB2 (pin8)=Input 2 Microbrytare nere (1=nere 0=?)
;RB3 (pin9)=Input 3 Mikrobrytare uppe (1=uppe 0=?)
;RA0 (pin17)=Output 1 Magnetventil ner
;RA1 (pin18)=Output 2 Magnetventil upp
;RA2 (pin1)=Output 3 Kompressor på

;PORTA =Outputs
;PORTB =Inputs


;******Konstanterna*******;
STATUS equ 03H
OPT equ 81H
TRISB equ 86H
PORTB equ 06H
TRISA equ 85H
PORTA equ 05H
COUNT1 equ 08H
COUNT2 equ 09H

;***Konfigurera portarna***;
BSF STATUS,5       ;gå till bank 1
movlw b'11111111'  ;ställ in portarna
movwf TRISB        ;flytta W till TRISB registret
movlw b'00000'     ;ställ in outputarna
movwf TRISA        ;flytta till trisa registret
;BCF OPT,7          ;Pull-Up på portb
BCF STATUS,5       ;Tillbaka till bank 0

;****Watch Dog Timer****;
;bcf STATUS,0      ;Bank 0
;clrf 01h          ;address of the other timer  TMR0
;bsf STATUS,0      ;switch to bank 1
;clrwdt            ;reset the WDT and prescaler
;movlw b'1111'     ;Select the new prescaler value and assign 2,3s
;movwf OPT         ;it to WDT
;bcf STATUS,0      ;come back to bank 0

;*****Programmet*****;
START
BTFSC PORTB,1     ;kolla om RB1=1 i så fall gå till subr Upp
Call Upp          ;om RB1=0 testa igen
BTFSS PORTB,1     ;kolla om RB1=0 i så fall gå till subr Ner
Call Ner          ;om den inte är det börja om från början
goto START        ;Gå tillbaka till början av programmet

;***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


;***Subroutine Hissa ner gafflarna och kontrollera att de är nere***;
Ner
BTFSC PORTB,2     ;Kolla om mikrobrytaren nere=1
goto START        ;Om den är nere behöver inget göras och vi testar igen
movlw b'00101'    ;skicka bitarna för att sätta igång RA0 och RA2
movwf PORTA       ;Skicka de till PORTA
;clrwdt            ;nollställ WDT
Check2
BTFSS PORTB,2     ;Kolla om mikrobrytaren nere=1
goto Check2       ;om den inte är det kolla igen
clrf PORTB        ;Stäng av
Return            ;annars gå tillbaka till huvudprogrammet


;***Subroutine delay räkna ner 255-->0 255ggr***;
;Delay
;Loop1
;decfsz COUNT1,1
;goto Loop1
;clrwdt            ;nollställ WDT
;decfsz COUNT2,1
;goto Loop1
;clrwdt            ;nollställ WDT
;Return

end
Senast redigerad av bose 15 juli 2011, 20:45:49, redigerad totalt 1 gång.
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Det enklaste är att du slår på pullup för port B (ta bort kommentaren i koden bara). Kopplar mikrobrytarna så att dom jordar istället. Och sedan ändrar testet för om en brytare är aktiv så att btfss blir btfsc och vice versa eftersom du får ju aktiv=0 och inaktiv=1 nu.


Alternativt kan du koppla in pullner-motstånd (motstånd ner mot jord alltså) på typ 10 Kohm på dina inportar.
Användarvisningsbild
bose
Inlägg: 241
Blev medlem: 20 oktober 2005, 20:48:10
Ort: Blekinge

Inlägg av bose »

Okej tack för det snabba svaret :D
Jag kopplade motstånd på 4,7kOhm mellan jord och ingångarna men hade fortfarande samma problem. Det ligger antagligen i att jag har långa ledningar kors och tvärs på experimentplattan som tar upp störningar. Men jag ska testa med de interna pull up motstånden imorgon.
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Då är det förmodligen nån annan ingång som är störkänslig. Hur har du kopplat resetpinnen?
Användarvisningsbild
bose
Inlägg: 241
Blev medlem: 20 oktober 2005, 20:48:10
Ort: Blekinge

Inlägg av bose »

Okej. Den är kopplad till jord med ett 4,7kOhms motstånd..
Frasse
Inlägg: 136
Blev medlem: 29 januari 2005, 10:30:42

Inlägg av Frasse »

Se till att alla oanvända ingångar är kopplade till 5V eller jord, eller enklare, sätt dom till utgångar! Jag har hört att det kan orsaka skumma fel om det finns oanslutna pinnar!
Användarvisningsbild
bose
Inlägg: 241
Blev medlem: 20 oktober 2005, 20:48:10
Ort: Blekinge

Inlägg av bose »

Okej jag kan konfigurera dom som utgångar då och testa :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Hej !
Ett par saker...

Vad använder ni för utvecklingsverktyg ? Koden är lite "konstig", t.ex :
- Egna definitioner av FSRs (TRISA, PORTA os.v.). Använd include filen.
- Både Labels och instruktioner i pos 1. Fungerar inte i MPLAB/MPASM.

Några andra saker...

> movlw b'00110'

Sätt gärna alla *8* bitarna så det inte blir några missförstånd.
Det fylls säker på med nollor från ett visst håll, men det är onödigt att
man ska behöva slå upp vilket...

Sen har ni ett problem om t.ex mikrobrytare "uppe" har kontaktstudsar, då
kommer RA1 och RA2 också att "studsa" mellan 1 och 0 i takt med
mokrobrytaren. Det behövs antingen en RC-länk på brytaren, eller lite
fördröjning i koden. Det beror också på vad som sitter anslutet till
RA1 och RA2, om det gör något att det slås av och på flera gånger snabbt
efter varandra. Detta under förutsättning att man håller knappen "upp"
intryckt hela tiden. Detsamma gäller för "ner"/"nere", så klart.

Hur har ni tänkt med "nödstopp" ? D.v.s om gaffeln skulle behöva
stoppas mellan de två ändlägena ? Det är ju i alla fall ett "Säkerhetsprogram"... ;-)

Problemet med att det "fladdrar" när handen kommer i närheten beror
säkert på "öppna" ingångar och det har ni fått svar på redan.

Slutligen, det här är något skolprojekt, eller hur ?
Det verker konstigt att köra projekt *idag* med en gammal
och helt "död" processor. Var det ingen diskussion kring processorvalet ?
Användarvisningsbild
bose
Inlägg: 241
Blev medlem: 20 oktober 2005, 20:48:10
Ort: Blekinge

Inlägg av bose »

Hej!
Jag skriver .asm i mblab och har följt en tutorial på nätet där de satte upp egna konstanter.. Jag kan tillägga att detta är mitt första program någonsin (aldrig programmerat C eller VB eller nåt sånt) förutom att jag fått en lysdiod att blinka.
Labels och instruktioner i pos 1? Jag förstår inte?? :?
Okej jag ska börja skriva ut alla bitarna =)

Studsarna har jag tänkt på.. Ska man koppla en kondensator med en serieresistor i serie över brytaren? Ungefär vilka värden ska det vara på komponenterna?
Japp upp/ner hålls i hela tiden gafflarna ska vara i respektive läge..

Nödstopp?? Äh det behövs väl inte :P Kolven jag änvänder tillsammans med kompressorn gör att den når maxläge på nån sekund och ska inte gå att stoppa däremellan. Det är allt eller inget som gäller.

Jag använder PIC16F84A för att det fanns en bra tutorial. Denna µP ska inte styra något annat än gafflarna och då behövs inget mer avancerat.. och då jag hade två liggande hemma blev valet självklart. Resten av "trucken" styrs av ett experiment kort Velleman K8055 och det är inte jag som programmerar detta.. I framtiden kanske jag byter ut detta kort mot en kraftfull mikroprocessor som ska sköta allt med trådlös styrning. Men projektarbetet ska vara klart om några veckor så det hinns inte med innan. :)
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Resetpinnen till jord via en 4,7K?

Nu ids jag inte slå upp 'F84A men _alla_ PIC har väl en reset som triggas av GND? Och därför ska motståndet sitta mellan VCC och Reset....?
Användarvisningsbild
bose
Inlägg: 241
Blev medlem: 20 oktober 2005, 20:48:10
Ort: Blekinge

Inlägg av bose »

Oj jag skrev fel.. Är van vid att man kopplar ner till jord men den är självklart kopplad med en resistor till +5V
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> och har följt en tutorial på nätet där de satte upp egna konstanter..

Jo, det finns tyvärr *mycket* helt katastrofal skit-kod "out there"... :-)
Använd INC filen som kommer med MPLAB istället...

> Jag använder PIC16F84A för att det fanns en bra tutorial.

Tja, jag skulle säga att det var en *dålig* turorial just därför
att den bygger på F84A... :-)

Men, nog om det...

MPLAB vill ha bl.a labels (t.ex START, Upp, Check1 o.s.v) i pos 1.
Vanliga instruktioner skall stå i (minst) pos 2, helst lite längre in
så att det bli "snyggt" och lättläst. Får du verkligen inga fel
eller varningar ?

> Kolven jag änvänder tillsammans med kompressorn gör att den når
> maxläge på nån sekund och ska inte gå att stoppa däremellan.

Är det tryckluft ? Ja då har väl kolven ett naturligt stopp någonstans... :-)

En annan sak är att du kanske skulle tänka på vad som händer när
processorn sätts på. T.ex om ingen av ändlägesbryterna skulle vara "till".
Då kanske du skall köra gaffeln till det ena eller det andra läget, eller
göra ingenting och tända en "larm-LED" istället och så får användaren
välja vart gaffeln ska köras.
Användarvisningsbild
bose
Inlägg: 241
Blev medlem: 20 oktober 2005, 20:48:10
Ort: Blekinge

Inlägg av bose »

Okej. Vilken µC rekommenderar du? Jag tar gärna någon som är overkill för detta projekt så att jag kan lära programmera den att styra resten av truken. Gärna med 2 pwm kanaler m.m. :)

Nej jag får inte några varningar alls.. Den enda varningen jag fick var när jag valde att sätta upp OPTION som konstant men ändrade sedan denna till OPT så fungerade det.. Men jag ska göra som du säger nästa gång :D så ser det lite snyggare ut.

Japp det är där ändlägesbrytaren ska sitta.. när kolven är i sitt maxläge. Bara för att veta att den är uppe så att kompressorn inte står och pumpar hela tiden. Detta skulle lätt kunnat lösas med vanliga kopplingar men det är häftigare och jag får antagligen högre betyg om jag använder en µC :D

Är inte någon av ändlägesbrytarna till så kommer den att hissa ner gafflarna tills den slår till för programmet är skrivet så att man antingen kan mata in en 1 eller 0. Noll betyder att gafflarna ska vara nere och 1 uppe. Och när jag slår igång elen kommer det att vara en nolla där och alltså hissar den ner gafflarna..
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Microchip har bra online verktyg för att välja pocessor utifrån önskade egenskaper.

Laddade din kod i MPLAB 7.30.
Fick massor av "Warning [203].... opcode found in column 1....".
Vilket är normalt och förväntat så som den är formatterad.
Jag vet inte vad du har lyckats göra för att undvika det...

Sen bör du ha med "#include <p16f84a.inc>" och plocka bort dina egna
definitioner av PORTA o.s.v.
Finns ingen anledning att göra om samma job som Microchip redan har gjort.

Sedan bör ni har med en __CONFIG med lämpliga inställningar.
Se slutet av INC filen ovan (och databladet) för beskrivning av parametrarna.
Det går att "ställa in" direkt i MPLAB också, men det är en lite sämre metod,
bl.a p.g.a att det inte syns i källkoden vilka CONFIG inställningar som används.

Istället för "bcf/bsf status,5", kolla upp BANKSEL i MPASM hjälpen.
Användarvisningsbild
bose
Inlägg: 241
Blev medlem: 20 oktober 2005, 20:48:10
Ort: Blekinge

Inlägg av bose »

Jaha nu fattar jag vilka varningar du menade.. Jag trodde du menade sånå som poppade upp när man körde en build på den.. Jo de varningarna fick jag med men förstod inte vad de handlade om så jag testade och det fungerade.. Jag får nog läsa lite till om µC innan jag börjar programmera nästa gång :D

Okej jag ska leta upp filen och inkludera den istället.

Configen kör jag genom programmet som jag bränner in i picen med.. Men det kan ju vara bra att ha med dom med..

Tack =)
Skriv svar