Behöver hjälp med min kod!

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

Re: Behöver hjälp med min kod!

Inlägg av sodjan »

Frågan är om du fortfarande har läst PORT kapitlen eller inte.
Speciellt kodexemplen som finns där.

Frågan är också om du har förstått att din LED inte *lyser* svagt,
utan att den faktiskt blinkar (med samma starka sken som de andra
när den lyser). Är du helt med på det ?
Crille93
Inlägg: 96
Blev medlem: 2 maj 2009, 19:40:12

Re: Behöver hjälp med min kod!

Inlägg av Crille93 »

Jag läste igenom allt en gång till och nu har jag gjort rätt :roll:
Får nog läsa igenom allt om portar några gånger till så jag verkligen har läst ALLT :mrgreen:

> Frågan är också om du har förstått att din LED inte *lyser* svagt,
utan att den faktiskt blinkar

Det visste jag faktiskt inte, trodde att den lös svagare.

Men nu fungerar alla portar som dom ska :happy:

Den fungerande koden ser ut såhär:

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:
;RA_______________________________
bcf STATUS,RP0           ;Bank 0
bcf STATUS,RP1
clrf PORTA               ;Init PORTA
bsf STATUS,RP1           ;Bank 2
clrf ANSEL               ;digital I/O
clrf ANSELH
bsf STATUS,RP0           ;Bank 1
bcf STATUS,RP1
movlw 00010000           ;Gör RA3 input
movwf TRISA 
;RB_______________________________
clrf PORTB
;RC_______________________________
clrf PORTC
bcf STATUS,RP0           ;Bank 0



;START__________________________________________________
Borjan
;LED1___________________________________________________
LED1
;RA_____________________________________________________
     bsf     PORTA,0
     bsf     PORTA,1
     bsf     PORTA,2
     bsf     PORTA,4
     bsf     PORTA,5
;RB_____________________________________________________
     bsf     PORTB,4
     bsf     PORTB,5
     bsf     PORTB,6
     bsf     PORTB,7
;RC_____________________________________________________
     bsf     PORTC,0          ; turn on LED C0 (DS1)
     bsf     PORTC,1
     bsf     PORTC,2
     bsf     PORTC,3
     bsf     PORTC,4
     bsf     PORTC,5
     bsf     PORTC,6
     bsf     PORTC,7

;LED2___________________________________________________
goto Borjan
     end
Men som sagt. Jag ska nog läsa igenom det om portarna några gånger till innan jag fortsätter.
Tack så mycket för hjälpen!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Behöver hjälp med min kod!

Inlägg av sodjan »

> Det visste jag faktiskt inte, trodde att den lös svagare.

Jo det *ser ut* så, eftersom man inte hinner se blinkningarna.
Men det absolut viktigaste är om du förstår *varför* de blinkade ?
Annars kan jag beskriva det, det är igentligen ganska enkelt... :-)

Nyckeln till att förstå det är det som jag tidigare citerade från databladet :
" I/O pins configured as analog input always read ‘0’."

Samt att man förstår att en BCF/BSF instruktion först *läser* alla *8* bitarna från
porten, sedan ändrar den aktuella biten och till slut skriver tillbaka alla *8*
bitarna tillbaka till porten. Att förså detta är ganska centralt när det gäller PIC
programmering...
Crille93
Inlägg: 96
Blev medlem: 2 maj 2009, 19:40:12

Re: Behöver hjälp med min kod!

Inlägg av Crille93 »

Så den blinkar för att den får ström endast när processorn läser just den kodraden, sedan så får den ingen ström förns processorn läser den kodraden igen?
Medans dom andra portarna får ström hela tiden så fort jag sätter dom på hög och det håller på tills jag ger kommandot "sätt låg".
Har jag rätt? :roll:
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Behöver hjälp med min kod!

Inlägg av sodjan »

Ja, du har rätt, du bara uttrycker dig lite konstigt/annorlunda... :-)

En pinne med de analoga funktionerna *påslaget* (viket ju var alla pinnarna
utom en, RA5, eller hur), kommer att sättas till "1" i den instruktionen som sätter
just *den* pinnen, men till "0" när du sätter alla andra pinnar på samma port.

T.ex om vi antar att hela PORTA är "0" från början :

bsf PORTA,0 ; PORTA = "00000001"
bsf PORTA,1 ; PORTA = "00000010"
bsf PORTA,2 ; PORTA = "00000100"
bsf PORTA,4 ; PORTA = "00001000"
bsf PORTA,5 ; PORTA = "00010000"

Vid nästa loop blir det :

bsf PORTA,0 ; PORTA = "00010001"
bsf PORTA,1 ; PORTA = "00010010"
bsf PORTA,2 ; PORTA = "00010100"
bsf PORTA,4 ; PORTA = "00011000"
bsf PORTA,5 ; PORTA = "00010000"

Notera att RA5 behåller sin "1" eftersom den inte har några analoga funktioner
och alltså läses som just "1" av BSF instruktionen. Därför lyste lysdioden
på RA5 normalt.

Om du hade läst databladet ordentligt och slagit av de analoga funktioner hade det blivit :

bsf PORTA,0 ; PORTA = "00000001"
bsf PORTA,1 ; PORTA = "00000011"
bsf PORTA,2 ; PORTA = "00000111"
bsf PORTA,4 ; PORTA = "00001111"
bsf PORTA,5 ; PORTA = "00011111"

Och det var väl det du ville ha, eller ur ?

Sen, sluta omedelbart med det där "får ström" och "ger ström", du gör
det bara svårare för sig själv att förstå med sådana där konstigheter.

> endast när processorn läser just den kodraden,

"Läser* låter lite konstigt. "Utför" eller "exekverar" är vanligare. I nödfall "kör".
Men det var nog det du menade... :-)

Några andra kommenterarer kring din kod...

Jag vet inte, men det verkar inte som du har gjort speciellt mycket för
att felsöka ? Du har gjort det svårare än nödvändigt för dig genom att skriva
en kod som gör för mycket på en gång. Du skulle kunna ha satt enbart en pinne
åt gången t.ex. Det är också onödigt att loopa tillbaka till starten och köra om
allt hela tiden. Om du inte hade gjort det så hade du märkt att alla pinnar utom RA5
hade varit "0" (helt "släckt"). Du lurades du att tro att de lyste svagt istället, vilket
de alltså inte gjorde, de lyste helt normalt men blinkande.

Så vad du borde ha gjort var att felsaka bättre genom att ändra din kod (skära ner)
tills du hade hittat felet. Det tillsammans med mindre slarv vid läsningen av
databladet hade hjälpt mycket. Det är inte för skojs skull som Microchip har lagt ner
massor av tid på att skriva datablad...

Slutligen så hade det gått mycket snabbare att få rätsida på detta om du hade
haft med beskrivning av felet och *koden* som gav felet lite tidigare.

Det är även väldigt viktigt att faktiskt läsa vad andra skriver i tråden och inte bara
snöa in på sina egna inlägg. Redan den 21-aug skrev E85 :

> Det verkar som att du inte har stängt av dom analoga ingångarna.
> Kolla upp ANSEL- och ANSELH-registren i databladet.

Vilket ju visade sig vara precis det som var problemet. Hade du gjort som
E85 skrev så hade detta varit löst för över en vecka sedan. Eftersom du inte
kommenterade det vidare så kan *vi* bara anta att du faktiskt gjorde det.

Man kan summera det hela med att genom slarv och att stressa fram något
så får man problem... :-)
Användarvisningsbild
Lonius
Inlägg: 238
Blev medlem: 10 juli 2005, 01:38:58
Ort: Sollentuna

Re: Behöver hjälp med min kod!

Inlägg av Lonius »

Denna tråd är riktigt härlig :)
Skriv svar