PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 16F88 Problem mit nicht edendem Prog! easy.



stowoda
06.10.2006, 16:06
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



; 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

PicNick
06.10.2006, 18:18
Naja, wo ist "ende" ?

stowoda
06.10.2006, 18:35
Vor end.

Was ich nicht dargestellt hab ist die Verzögerungsschleife, die jedoch mit return endet..

Quasi so:




Hier das Hauptprog..

..hier ist die Schleife

ende


end


Seltsam ist, dass ich mit nem 16f84A und dem gleichen Code eine ähnliche Endlosschleife produziere..
Ich werd verrückt..

PicNick
06.10.2006, 18:40
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

stowoda
06.10.2006, 18:43
Er springt zu: ende und läuft weiter..Trifft auf end und sollte stehenbleiben..
Ich versteh nix mehr.

PicNick
06.10.2006, 18:53
"end" ist ein statement für den Compiler. das erzeugt keinen Code

stowoda
06.10.2006, 19:00
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..

PicNick
06.10.2006, 19:08
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

Mobius
06.10.2006, 23:40
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.

stowoda
07.10.2006, 10:22
Ja, klar! O:) ](*,) ](*,)

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