Naja, wo ist "ende" ?
Hallo!
Wollte mich mal am 16F88 versuchen und als einstieg eine LED blinken lassen.
Die LED blinkt an RB0.
Das Problem ist nun, dass das Program nicht zu enden scheint.
Zumindest blinkt die LED endlos, sollte aber nach 2 mal Aufleuchten aus bleiben.
Die LED hängt mit Plus an RB0 und mit minus an Masse.
Gruß
stowoda
Code:; PIC initialization ;******************************************* ;------------------------------------------- org 0x00 bsf STATUS, RP0 movlw .0 ; for LCD movwf TRISB ; PORTB --> OUTPUT bcf STATUS, RP0 clrf PORTB movlw B'00000001' movwf PORTB movlw .255 call WAIT movlw B'00000000' movwf PORTB movlw .255 call WAIT movlw B'00000001' movwf PORTB movlw .255 call WAIT movlw B'00000000' movwf PORTB goto ende
Naja, wo ist "ende" ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Vor end.
Was ich nicht dargestellt hab ist die Verzögerungsschleife, die jedoch mit return endet..
Quasi so:
Seltsam ist, dass ich mit nem 16f84A und dem gleichen Code eine ähnliche Endlosschleife produziere..
Hier das Hauptprog..
..hier ist die Schleife
ende
end
Ich werd verrückt..
Nur weil's "ende" heißt, bleibt ja der Rechner nicht stehen. er läuft durch den kompletten Programmspeicher und fängt dann von vorn wieder an.
So sollte ein "ende" aussehen: (eine dauerschleife)
Ende:
goto ende
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Er springt zu: ende und läuft weiter..Trifft auf end und sollte stehenbleiben..
Ich versteh nix mehr.
"end" ist ein statement für den Compiler. das erzeugt keinen Code
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Irgendwie missverstehen wir uns..
Nach jedem Programm sollte ein "end" kommen.
Nun, diese Regel befolge ich.
Könntest Du mir ein Hexfile schicken für einen 16F88 oder 16F84a?
Lass die LED an RBA1 zweimal aufblinken..
Tut mir leid, ich heiß' zwar PICnick, bin aber auf AVR umgestiegen.
Aber schau dich dort um, das ist speziell für PIC
www.sprut.de
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Also PicNick hat recht. Das Befehl "end" hat keinen direkten Einfluss auf dein Programm, sie dient dem Compiler nur als Information, dass der Sourcecode beendet ist und er alles nach diesem Schlüsselwort geflissen ignorieren soll. Und ja, nach jedem Programm kommt ein "end", aber in einen PIC kannst du nur ein Programm hineinbrennen, d.h. hast du nur ein "end" in einer Assembler-Datei.
Dein Problem, dass der PIC in einer "Unendlichschleife" gerät, in welchem das LED gleichmäßig blinkt kommt daher, dass der PIC sich immer wieder resetet. Man muss einige Dinge bei der Erstellung eines Programmes beachten udn eine ist es, IMMER eine Unendlichschleife zu haben, die verhindert, dass die Hauptroute nicht einfach bis zum Ende des Speicherplatzes durchläuft und dann wieder von vorne beginnt.
In deinem Fall ist es, dass du statt der Zeile "goto ende" den Schleifen-forschlag von PicNick Einfügst, die dann nicht mehr verlassen wird. Wenn dann deine Verzögerungsfunktion langsam/groß genug ist, dass das Blinken mit dem Auge zu erkennen ist, wirst du sehen, dass der PIC genau das macht, was du von ihm willst .
Wenn du einmal sehen willst, was passiert, wenn du keine Unendlich-Schleife in einem Program hast, dann stell mal den Simulator ein und lass den Zeiger über die letzte Befehlszeile laufen und schaue anschließend, wo er wieder anfängt, also bei "org 0x00" (bzw. einen Befehl darunter ).
MfG
Mobius
€dit: Ich schreib dir mal ein Programmgerüst morgen (technisch gesehen heute) aber jetzt grad bin ich zu müde dazu.
Ja, klar!
Danke Mobius, ich habs endlich kapiert.. Mach Dir nicht mehr die Mühe mit dem Programmgerüst.
Hab lange nichts mehr mit den PIC´s gemacht und hielt daran fest, dass der PIC nach der end direktive irgendwie anhält..
Vielen Dank nochmal..
Gruß
stowoda
Lesezeichen