PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PORTD,4 wird nicht auf HIGH gesetzt



Pitt1986
27.12.2005, 00:32
hi,

hab ein kleines problem in meinem programm und weiss nicht warum das so ist.
also ich setz den PORTD,4 PIN auf HIGH und fang dann mit der main schleife an, aber der RD4 wird nicht auf high gesetz.
woran kann dass liegen.


list p=18f452
#include <P18f452.INC>

__config _CONFIG2L, _PWRT_ON_2L
__config _CONFIG2H, _WDT_OFF_2H
__config _CONFIG1H, _HS_OSC_1H
__config _CONFIG4L, _LVP_OFF_4L


movlw B'00011100'
movwf TRISB
movlw B'10001000'
movwf TRISD
clrf PORTB
clrf LATB
clrf PORTD
clrf LATD


bsf PORTD,4


main
btfsc PORTD,7
goto setone ------ wenn ich diesen sprungbefehl weglasse dann ist RD4 auf high ,ansonsten ist er auf low
bsf PORTD,6
goto main
setone
bcf PORTD,6
goto main
end


falls der takt von interesse ist, ich benutze einen 10 mhz quarzoszillator.

wäre sehr dankbar für hilfreiche antworten

mfg
pitt

stegr
27.12.2005, 00:52
Ist der PORTD,4 ganz kurz mal auf High, wenn du den Sprungbefehl drinnen hast?

Wenn du anstelle vom bedingten Sprung einfach mal versuchst immer zu springen, ist der Pin dann auf High oder nicht?

Die Antworten würden helfen...
so direkt fällt mir kein Fehler auf...

MfG
Stefan

Pitt1986
27.12.2005, 01:06
hi,

also ich hab jetzt die bedingung rausgemacht aber es geht immer noch nicht.



list p=18f452
#include <P18f452.INC>

__config _CONFIG2L, _PWRT_ON_2L
__config _CONFIG2H, _WDT_OFF_2H
__config _CONFIG1H, _HS_OSC_1H
__config _CONFIG4L, _LVP_OFF_4L


movlw B'00011100'
movwf TRISB
movlw B'10001000'
movwf TRISD
clrf PORTB
clrf LATB
clrf PORTD
clrf LATD


bsf PORTD,4


main
goto setone
bcf PORTD,6
goto main
setone
bsf PORTD,6
goto main
end

stegr
27.12.2005, 01:17
Ich weiss, es klingt komisch, aber dreh mal die Reihenfolge bei der Initialisierung um: erst clrf, dann tris laden.



EXAMPLE 9-4: INITIALIZING PORTD

CLRF PORTD ; Initialize PORTD by clearing output data latches
CLRF LATD ; Alternate method to clear output data latches
MOVLW 0xCF ; Value used to initialize data direction
MOVWF TRISD ; Set RD<3:0> as inputs, RD<5:4> as outputs, RD<7:6> as inputs


Und mach mal nach dem ersten setzen von dem PinD4 ne lange Warteschleife rein (also solang, dass du siehst, ob der Pin mal high wird oder nicht)

Pitt1986
27.12.2005, 01:35
also hab des jetzt mit der initialisierung gemacht nix gebracht.
und ich hab jetzt ne ca. 10 sek schleife zwischen bsf PORTD,4 und main-schleife gemacht und dann wird RD4 auf high gesetzt und bleibt auch auf high. also dann funktioniert es.

nur das muss auch ohne die schleife gehen weil in meinem vollständigen programm springt er auch gleich nach bsf PORTD,4 in die main schleife nur dass da kein sprung befehl ist und da geht es auch.

stegr
27.12.2005, 01:53
eine idee hätte ich heute abend noch: versuchs doch mal mit dem simulator und/oder (wenn vorhanden) mit dem debugger (ICD2).

Das ganze ist schon massiv komisch - irgendwas passt da nicht...

noch was zum ausprobieren: einfach mal ein nop nach dem bsf PORTD,4

Alles weitere dann morgen ;)

MfG
Stefan

Pitt1986
27.12.2005, 01:58
also mit dem debugger bzw simulator komm ich irgendwie nicht zu recht ich hab mich auch noch nicht richtig damit beschäftigt. bei mir funzt des net so richtig.

des mit dem nop geht auch net. hab ich schon mit fünf nop's probiert.

Posti
27.12.2005, 16:50
*grummel*

Das Du das schon mit den NOP's probiert hast, hatte ich überlesen.
Aber vll hilft Dir SPRUT da doch weiter, obwohl, glaube beim I/O-Fehler, die Lösung NOP heißt.
Erklärt wird das so, daß der Pin zwar auf 1 gesetzt wird, aber beim Auslesen noch kein High anliegt, somit Low interpretiert wird.
Setzen am Ende eines Taktzyklus, Auslesen am Anfang eines Taktzyklus.
Glaube 5µs werden dort genannt.

MfG
Posti

Pitt1986
28.12.2005, 18:08
hi,

also ich bin jetzt draufgekommen, dass es nicht am prog oder µc liegt, sondern an einem gerät was an dem ganzen angeschloßen war und der RD,4 war die Stromzufuhr für das gerät. und irgendwas muss da immer passieren dass es nicht auf high geht, aber des hat sich jetzt eigentlich erledigt, weil ich halt jetzt weiss dass das gerät den fehler verursacht hat.

also wie gesagt wenn das gerät nicht angeschlossen ist dann geht es und wenn es angeschlossen ist dann geht es nicht, außer ich streif an dem RD,4 PIN kurz mit dem draht vorbei, an dem 5V Spannung sind, dann geht der pin auch auf HIGH und bleibt.

trotzdem danke.

mfg
pitt

Posti
28.12.2005, 18:15
Hi

Kann es vll sein, daß das 'Gerät' mehr als die möglichen 25mA saugt, und somit der Pin nicht auf High gesetzt werden kann?
KA, denke mir, daß der PIC dann vll aus 'Selbstschutz' das High sein lässt, oder, wie hier und da schon gelesen, powert, was das Zeughergibt und sich dabei (irgendwann) erwärmt.

MfG
Posti

Pitt1986
28.12.2005, 20:19
hi,

ja könnte sein, dass das Gerät mehr als 25ma verbraucht aber warum wird dann RD,4 auf high gesetz wenn ich den sprung befehl weglasse.

mal angenommen es wäre so dass der pin immer voll ausgelastet ist weil er immer die volle leistung, also 25ma herbringt, ist es dann besser 2 pins für die strom versorgung zu nehmen um den RD,4 bisschen zu entlasten???

mfg
pitt

Pitt1986
28.12.2005, 20:29
ach ja und warum ist dann das so, wenn der sprung befehl im prog drin ist der RD,4 auf LOW ist, obwohl er auf HIGH sein sollte und wenn ich dann mit nem kabel was 5V Spannung hat, kurz den RD,4 pin streife, der Pin dann auf die ganze Zeit auf HIGH bleibt?

Posti
28.12.2005, 21:13
Hi

Denke, daß dein angeschlossenes Gerät (was ist das eigendlich?) einen kurzen hohen Strom-Impuls braucht, und sich dann mit der anliegenden Spannung zufrieden gibt.
Beim Streifen mit +5V kann ein wesendlich höherer Strom als vom PIC fließen.
Dieser Stromimpuls könnte ausreichen, daß Dein Gerät durchschaltet und danach dich mit einem wesendlich geringerem Strom zufrieden gibt.

Wäre zumindest eine Erklärung :)

... was Besseres fällt mir allerdings nicht ein.

MfG
Posti

Pitt1986
28.12.2005, 21:22
hi,

des is so ein 5 in 1 cardreader.
ja gut, aber dann müsstest es noch eine erklärung dafür geben, dass wenn ich den sprungbefehl im prog weglasse, dass es dann geht umd wenn der sprungbefehl drin bleibt nicht.

aber ich glaub des was ich jetzt weiss des stellt mich schon zufrieden. :D

mfg
pitt

Posti
28.12.2005, 22:13
Hmm

Das mit dem Sprungbefehl ist nicht nett, lässt meine Theorie voll im Regen stehen :)

KA ...

Denke mir aber, daß das Verhalten des PIC völlig Logisch ist ... naja, wie so nen PIC halt denkt.

Und wieder sehen wir, wenn ein Problem sich partou nicht lösen lässt, muß es halt umgangen werden *g*

Netter Nebeneffekt: Man lernt beim Umstricken der Routiene bestimmt wieder was.

MfG
Posti

BigWumpus
25.02.2006, 19:23
Kann man auch bei www.sprut.de nachlesen...!

Setzt man ein Port-Bit auf High, zieht die angeschlossene Schaltung aber so viel Strom, daß der Port nicht wirklich eine Spannung erreicht, die als "High" gelesen wird, so führt ein Setzen oder Löschen eines anderen Bits am gleichen Port dazu, daß das ursprüngliche Bit wieder auf 0 gesetzt wird, der Ausgang wird abgeschaltet.

Grund: Ein PIC ändert ein Bit, indem er das ganze Byte liest, das Bit ändert und alles wieder zurückschreibt. Dabei wird der belastete Ausgang als 0 gelesen und darum abgeschaltet.

Bei den PIC18ern wurde das Register LAT.. eingeführt, daß dieses Problem umgeht !