Behöver hjälp med min kod!
Re: Behöver hjälp med min kod!
Det där är alldels för lite kod för att få något alls att fungera.
Har du ens lyckats testköra det där ??
Ta några dagar eller en vecka (beroende på hur mycket
tid du behöver) och skriv lite testkod. Sedan får vi se.
Läs på om timers. Kolla upp "debounce". Skriv en timerstyrd interrupt-rutin
och få *det* att fungera först. o.s.v. Början sedan med *en* knapp först.
Du har massor att fundera på innan du ens kommer i närheten av specen
som du skrev i första inlägget. Du går för snabbt framåt. Glöm tillsvidare
helt det du faktiskt vill göra och koncentrera dig på att lära dig
grundtekniken först instället.
Har du ens lyckats testköra det där ??
Ta några dagar eller en vecka (beroende på hur mycket
tid du behöver) och skriv lite testkod. Sedan får vi se.
Läs på om timers. Kolla upp "debounce". Skriv en timerstyrd interrupt-rutin
och få *det* att fungera först. o.s.v. Början sedan med *en* knapp först.
Du har massor att fundera på innan du ens kommer i närheten av specen
som du skrev i första inlägget. Du går för snabbt framåt. Glöm tillsvidare
helt det du faktiskt vill göra och koncentrera dig på att lära dig
grundtekniken först instället.
Re: Behöver hjälp med min kod!
Som jag skrev var det ett exempel på hur koden kan se ut BITVIS alltså inte en hel kod det kommer jag inte skriva utan det får du göra på egen hand. Se det som vägledning helt enkelt 

Re: Behöver hjälp med min kod!
I digitala sammanhang är "delvis" kanske ett bättre uttryck en "bitvis"...



Re: Behöver hjälp med min kod!
sodjan:
Helt rätt särskit med stora bokstäver kan det bli förvirrande 


Re: Behöver hjälp med min kod!
Hehe. Bitvis är väl en jättebra beskrivning. Då får man ju två syftningar "for the price of one".



Re: Behöver hjälp med min kod!
Du har ganska många "kanaler" till en massa lampor... men du skriver att "alla ska blinka" eller "alla är avstängda" typ.
Menar du att alla ska blinka samtidigt, eller har du tänkt dig olika mönster som rinnande ljus eller växlande ...?
Ett sätt att lösa problemet på är att du har ett timerstyrt interrupt som går igång lagom ofta
och som sköter själva blinkandet med hjälp av dels indata som säger vilket program du kör för tillfället, dels räknare som håller reda på tiden. Då blir processorn fri och ledig att i huvudprogrammet bara känna av knapparna och ändra programnummer.
t.ex.
knapp 1 intryckt --> PROGNR = 1
knapp 2 intryckt --> PROGNR = 2
interruptrutinen kollar sedan av PROGNR och gör oluka saker beroende på vilket nr det står.
tips när det gäller den där tredje knappen som ska "bara tryckas in en kort stund":
Du måste få processorn att minnas om knappen var nedtryckt eller inte förra gången du kollade. (det gör du genom att spara det avlästa värdet efteråt i en annan variabel). Om den inte var nedtryckt innan, men är det nu, då har du precis tryckt ner den, och du ska göra något (byta program)
sen gör du inget alls oavsett om knappen är nedtryckt eller inte , förrän samma vilkor uppstår igen, dvs. först var den inte nedtryckt, sedan var den nedtryckt. eh..något oklart förklarat , men fundera lite bara... rita nåt slags dagram eller nåt med en tidslinje och vad som händer...
Menar du att alla ska blinka samtidigt, eller har du tänkt dig olika mönster som rinnande ljus eller växlande ...?
Ett sätt att lösa problemet på är att du har ett timerstyrt interrupt som går igång lagom ofta

t.ex.
knapp 1 intryckt --> PROGNR = 1
knapp 2 intryckt --> PROGNR = 2
interruptrutinen kollar sedan av PROGNR och gör oluka saker beroende på vilket nr det står.
tips när det gäller den där tredje knappen som ska "bara tryckas in en kort stund":
Du måste få processorn att minnas om knappen var nedtryckt eller inte förra gången du kollade. (det gör du genom att spara det avlästa värdet efteråt i en annan variabel). Om den inte var nedtryckt innan, men är det nu, då har du precis tryckt ner den, och du ska göra något (byta program)
sen gör du inget alls oavsett om knappen är nedtryckt eller inte , förrän samma vilkor uppstår igen, dvs. först var den inte nedtryckt, sedan var den nedtryckt. eh..något oklart förklarat , men fundera lite bara... rita nåt slags dagram eller nåt med en tidslinje och vad som händer...
Re: Behöver hjälp med min kod!
Jag har ändrat mig lite för att få mer I/O fria
Jag tänkte istället att jag sätter strömbrytarna till blinkersen såhär:
Processor->Blinkers->Strömbrytare->Jord
Så har jag ett "program" för blinkersen som gör så att dom blinkar växelvis (när vänstra blinkersen är släckt så är högra blinkersen tänd, men eftersom jag har strömbrytare mellan blinkersen och jorden så fungerar dom endast när jag slår på vänster/höger strömbrytare).
Jesse: jag tänkte ha som "rinnande ljus" och andra saker under mopeden
Men här är hur jag har tänkt!
Varje program loopar hela tiden tills man trycker till på tryckströmbrytaren, för då hoppar den till nästa program som loopar hela tiden tills jag trycker igen osv.

Så kommer programmen se ut.
Men jag undrar om man inte kan göra så att processorn kollar efter varje gång den har gjort ett "program" om man trycker in en strömbrytare, om det inte trycks in en strömbrytare så gör den om programmet en gång till för att kolla igen sen. Sedan om det trycks in en strömbrytare så kommer man vidare till ett "mellanläge" och stannar där tills man har släppt knappen och då går den vidare till nästa program.
Edit: Jag har nu hittat en kod som fungerar men jag behöver någon lektion i hur man öppnar inportar, jag har letat men jag kan inte hitta någon bra
Var lärde ni er dessa grunder?

Jag tänkte istället att jag sätter strömbrytarna till blinkersen såhär:
Processor->Blinkers->Strömbrytare->Jord
Så har jag ett "program" för blinkersen som gör så att dom blinkar växelvis (när vänstra blinkersen är släckt så är högra blinkersen tänd, men eftersom jag har strömbrytare mellan blinkersen och jorden så fungerar dom endast när jag slår på vänster/höger strömbrytare).
Jesse: jag tänkte ha som "rinnande ljus" och andra saker under mopeden

Men här är hur jag har tänkt!
Varje program loopar hela tiden tills man trycker till på tryckströmbrytaren, för då hoppar den till nästa program som loopar hela tiden tills jag trycker igen osv.

Så kommer programmen se ut.
Men jag undrar om man inte kan göra så att processorn kollar efter varje gång den har gjort ett "program" om man trycker in en strömbrytare, om det inte trycks in en strömbrytare så gör den om programmet en gång till för att kolla igen sen. Sedan om det trycks in en strömbrytare så kommer man vidare till ett "mellanläge" och stannar där tills man har släppt knappen och då går den vidare till nästa program.
Edit: Jag har nu hittat en kod som fungerar men jag behöver någon lektion i hur man öppnar inportar, jag har letat men jag kan inte hitta någon bra

Re: Behöver hjälp med min kod!
Databladet. Det är TRISx (x=A, B, C, D osv beroende på vilken port) som bestämmer, men allt står i databladet i I/O-sektionen.
exempelvis kan man skriva såhär i C för att sätta RA1 och RA3 som input och resten ut:
TRISA = 0b00001010;
exempelvis kan man skriva såhär i C för att sätta RA1 och RA3 som input och resten ut:
TRISA = 0b00001010;
Re: Behöver hjälp med min kod!
Men vad jag har förstått så är det bara RA3 som endast kan användas som input? Eller finns det fler som endast kan vara input?
För jag vill ha så få input som möjligt eftersom jag vill ha så många output till lysdioderna som möjligt.
Men jag hade hittat att man skrev
I register page 1 för att göra alla RA till input men jag vill som sagt bara ha 1 input, hur gör jag då?
För jag vill ha så få input som möjligt eftersom jag vill ha så många output till lysdioderna som möjligt.
Men jag hade hittat att man skrev
Kod: Markera allt
movwf TRISA
Re: Behöver hjälp med min kod!
> Varje program loopar...... nästa program som.....
Notera att en PIC bara kan köra *ETT* program. D.v.s att allt som
du vill att din PIC ska göra måste finnas i *ETT* program. Detta program
kan sedan ha olika delar som körs under vissa förrutsättningar. Men jag
tror att det blir lättare för sig att förstå det hela om du slutar tala
om olika/flera program.
Dessutom så kommer en ganska stor del av ditt program att vara gemensam
kod som körs oavsett i vilket "läge" det hela befinner sig i. T.ex avkänningen av
knapparna kommer ju säkert att vara gemensam, d.v.s finns bara en gång och
det finns ingen bra anledning att kopiera den delen av koden flera gånger.
> men jag behöver någon lektion i hur man öppnar inportar,
Om det är det jag tror att du undrar över så är det kapitlet "I/O PORTS"
i databladet. Har du ens *försökt* kolla ??
> Men vad jag har förstått så är det bara RA3 som endast kan användas som input? Eller finns det fler som endast kan vara input?
Jag är fullständigt övertygat att det framgår klart och tydligt av databladet.
Ett hett tips är också att låta bli RA3 tillsvidare. Att förklara varför blir nog lite
överkurs just nu, du kommer att förstå det senare. Låt bara bli RA3. Jag minns inte
vilken processor du använder, men jag utgår från att RA3 också är MCLR, eller hur ?
Låt den vara MCLR tillsvidare.
> Men jag hade hittat att man skrev "movwf TRISA" för att göra alla RA till input...
Det där överför bara W till TRISA. Vad som händer i TRISA beror helt på vilket
värde du har laddad W med innan...
Notera att en PIC bara kan köra *ETT* program. D.v.s att allt som
du vill att din PIC ska göra måste finnas i *ETT* program. Detta program
kan sedan ha olika delar som körs under vissa förrutsättningar. Men jag
tror att det blir lättare för sig att förstå det hela om du slutar tala
om olika/flera program.
Dessutom så kommer en ganska stor del av ditt program att vara gemensam
kod som körs oavsett i vilket "läge" det hela befinner sig i. T.ex avkänningen av
knapparna kommer ju säkert att vara gemensam, d.v.s finns bara en gång och
det finns ingen bra anledning att kopiera den delen av koden flera gånger.
> men jag behöver någon lektion i hur man öppnar inportar,
Om det är det jag tror att du undrar över så är det kapitlet "I/O PORTS"
i databladet. Har du ens *försökt* kolla ??
> Men vad jag har förstått så är det bara RA3 som endast kan användas som input? Eller finns det fler som endast kan vara input?
Jag är fullständigt övertygat att det framgår klart och tydligt av databladet.
Ett hett tips är också att låta bli RA3 tillsvidare. Att förklara varför blir nog lite
överkurs just nu, du kommer att förstå det senare. Låt bara bli RA3. Jag minns inte
vilken processor du använder, men jag utgår från att RA3 också är MCLR, eller hur ?
Låt den vara MCLR tillsvidare.
> Men jag hade hittat att man skrev "movwf TRISA" för att göra alla RA till input...
Det där överför bara W till TRISA. Vad som händer i TRISA beror helt på vilket
värde du har laddad W med innan...
Re: Behöver hjälp med min kod!
Crille93 skrev:I register page 1 för att göra alla RA till input men jag vill som sagt bara ha 1 input, hur gör jag då?
Kod: Markera allt
movlw b'00000001'
movwf TRISA
Kod: Markera allt
movlw b'00000010'
movwf TRISA
Kod: Markera allt
movlw b'00000100'
movwf TRISA
Kod: Markera allt
movlw b'00001000'
movwf TRISA
Kod: Markera allt
movlw b'00010000'
movwf TRISA
Kod: Markera allt
movlw b'00100000'
movwf TRISA
Kod: Markera allt
movlw b'01000000'
movwf TRISA
Kod: Markera allt
movlw b'10000000'
movwf TRISA
Re: Behöver hjälp med min kod!
I övrigt rekommenderar jag att du köper den här boken. Läs den pärm till pärm.
Re: Behöver hjälp med min kod!
Tack! Jag får nog köpa den där boken när jag får pengar
Men jag testade att öppna alla I/O så testade jag en I/O i taget med en lysdiod (var för att testa om jag visste hur man öppnade alla I/O). Men det var bara 3-5 I/O som lysdioden lös på medans dom andra I/O så såg man väldigt lite hur bara tråden inne i lysdioden blinkade. Vad var det som var fel? Är det vissa I/O som bara skickar ut väldigt svag ström eller är det något annat? Jag kollade på vad picens olika I/O gör på http://ww1.microchip.com/downloads/en/D ... 41262C.pdf men jag såg inte något som kunde betyda att den skickade ut svagare ström från något I/O
.
Jag har en PIC16F690.

Men jag testade att öppna alla I/O så testade jag en I/O i taget med en lysdiod (var för att testa om jag visste hur man öppnade alla I/O). Men det var bara 3-5 I/O som lysdioden lös på medans dom andra I/O så såg man väldigt lite hur bara tråden inne i lysdioden blinkade. Vad var det som var fel? Är det vissa I/O som bara skickar ut väldigt svag ström eller är det något annat? Jag kollade på vad picens olika I/O gör på http://ww1.microchip.com/downloads/en/D ... 41262C.pdf men jag såg inte något som kunde betyda att den skickade ut svagare ström från något I/O

Jag har en PIC16F690.
Re: Behöver hjälp med min kod!
Det är bättre att visa vad du har gjort (alltså *koden*) än att försöka beskriva
det i ord, det blir bara rörigt. Du *säger* att du har gjort en massa saker men
betyder inte mycket. Du måste också *visa* vad du faktiskt har gjort. Så visa
en bit kod som inte gör det du tror så kan vi säkert förklara varför.
Det är inte heller helt tydligt om du har läst "I/O PORTS" kapitlet för
den aktuella porten och *förstått* vad som står där. Har du det ?
Det saknas även annan information som t.ex *hur* du kopplade in lysdioden.
Det är lika bra att du skärper upp dig direkt och ser till att skriva kompletta frågor
med all rellevant information, det blir annars bara en massa motfrågor och i värsta
fall helt felaktiga svar p.g.a missförstånd.
> ...41262C.pdf
Märkligt, jag har revision "E" av databladet (DS41262E). Hur hittade du det där ?
Databladet som länkas från sidan för PIC16F690 är "E". Det finns i princip aldrig
någon anledning att inte använda det senaste.
det i ord, det blir bara rörigt. Du *säger* att du har gjort en massa saker men
betyder inte mycket. Du måste också *visa* vad du faktiskt har gjort. Så visa
en bit kod som inte gör det du tror så kan vi säkert förklara varför.
Det är inte heller helt tydligt om du har läst "I/O PORTS" kapitlet för
den aktuella porten och *förstått* vad som står där. Har du det ?
Det saknas även annan information som t.ex *hur* du kopplade in lysdioden.
Det är lika bra att du skärper upp dig direkt och ser till att skriva kompletta frågor
med all rellevant information, det blir annars bara en massa motfrågor och i värsta
fall helt felaktiga svar p.g.a missförstånd.
> ...41262C.pdf
Märkligt, jag har revision "E" av databladet (DS41262E). Hur hittade du det där ?
Databladet som länkas från sidan för PIC16F690 är "E". Det finns i princip aldrig
någon anledning att inte använda det senaste.
Re: Behöver hjälp med min kod!
Såhär har jag gjort:
Så först så har jag RC,2 tänd och så byter jag till nästa del med hjälp av tryckströmbrytaren och i den delen så är alla I/O "öppna". Sedan så sätter jag lysdiodens katod på "GND" och lysdiodens anod på alla I/O (förutom RA3 som är input), en i taget. Och på vissa så lyser den som den ska medans på andra så kan man precis se att det lyser svagt om tråden i lysdioden.
Det databladet jag länkade till är ett som någon annan på det här forumet har länkat till.
Kod: Markera allt
#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
cblock 0x20
Delay1 ; Define two file registers for the
Delay2 ; delay loop
endc
org 0
Start:
bsf STATUS,RP0
clrf TRISC
clrf TRISB
clrf TRISA
movlw b'00001000'
movwf TRISA ;Alla I/O är output förutom RA3 som är input
bcf STATUS,RP0
MainLoop:
bsf PORTC,2 ;RC2 tänds
InnerLoop1:
decfsz Delay1,f
goto InnerLoop1
decfsz Delay2,f
goto InnerLoop1
btfss PORTA,3 ;Får RA3 signaler? Ja=Hoppa över nästa. Nej=Fortsätt till "goto MainLoop".
goto MainLoop
Wait1:
btfsc PORTA,3 ;Får RA3 signaler? Ja=Fortsätt till "goto Wait". Nej=Hoppa över nästa.
goto Wait1
;****************************HÄR ÄR FELET NÅGONSTANS*******************************
Loop:
;****Alla RC****
bsf PORTC,0
bsf PORTC,1
bsf PORTC,2
bsf PORTC,3
bsf PORTC,4
bsf PORTC,5
bsf PORTC,6
bsf PORTC,7
;****Alla RB****
bsf PORTB,4
bsf PORTB,5
bsf PORTB,6
bsf PORTB,7
;****Alla RA****
bsf PORTA,0
bsf PORTA,1
bsf PORTA,2
bsf PORTA,4
bsf PORTA,5
InnerLoop2:
decfsz Delay1,f
goto InnerLoop2
decfsz Delay2,f
goto InnerLoop2
btfss PORTA,3 ;Får RA3 signaler? Ja=Hoppa över nästa. Nej=Fortsätt till "goto Loop".
goto Loop
Wait2:
btfsc PORTA,3 ;Får RA3 signaler? Ja=Fortsätt till "goto Wait2". Nej=Hoppa över nästa.
goto Wait2
goto MainLoop
end
Det databladet jag länkade till är ett som någon annan på det här forumet har länkat till.