LED leuchten lassen mit pic (Assembler)

Gast #1910946
Lesenswert?

Als kleine eselsbrücke: das Bit auf Low setzen -> auf 0 setzen. Die Null 
sieht aus wie ein großes O und das steht für Output (Ausgang). Andersrum 
auf High -> auf 1 setzen, die Eins sieht aus wie ein großes I und somit 
steht I für Input (Eingang).
Gast #1911016
Lesenswert?

Dazu musst du bsf PORTB,4 in bcf PORTB,4 ändern.

Wenn es immernoch nicht geht, änder es wieder auf bsf und Mess mal mit 
nem Multimeter am Ausgang, ob da 5V anliegen. Wenn ja, mess nochmal, 
wenn die LED (Ich hoffe mit Vorwiderstand) angeschlossen ist. Wenn die 
5V immernoch anliegen und die LED nicht leuchtet ist der Widerstand oder 
die LED kaputt.

Sind von vornherein keine 5V anliegen, ist entweder der Ausgang kaputt, 
der ganze PIC, oder der PIC bzw. das Programm läuft nicht, der Takt 
kommt nicht an etc.
#1913328
Lesenswert?

Johannes schrieb:
> das waren meine 2 Pobleme jetzt geht alles danke.
> nun muss meine LED blinken lassen.
> also eine Zeitschleife erstellen.
> Ich habe nur keine Ahnung wie das geht könntest du mir vill dabei
> helfen?

Du kennst mitlerweile eine Schleife.
Du kennst vielleicht auch einen Befehl, der nichts tut (NOP - no 
operation).
In einer Schleife wird der wiederholt, wobei man mitzählen muss wie oft 
die Schleife schon wiederholt wurde, denn man möchte eine bestimmte 
Anzahl Wiederholungen.

Der Rest ist dann rechnen und Datenblattstudium
Alle Taktzyklen eines Schleifendurchlaufs zusammenzählen, damit weiß man 
wieviele Taktzyklen ein kompletter Schleifendruchlauf dauert. Bei n 
Durchläufen durch die Schleife laufen dann in Summe n mal soviele 
Taktzyklen auf. Und da man weiß, wie lange ein Taktzyklus dauert 
(Betriebsfrequenz des Controllers), kennt man daher die Gesamtzeit.
Wenn das nicht reicht, dann legt man um die innere Schleife mit ihrem 8 
BIit Zähler eben noch eine Schleife drüber, wieder mit einem eigenen 8 
Bit Zähler. Und um die kann man dann wieder eine drüber legen.

So nach dem Muster: Wer 60 mal 1 Sekunde wartet, hat in Summe auch 1 
Minute gewartet.

Aber ein bischen was musst du schon auch selber tun. Schlieslich 'musst' 
ja 'du' die Aufgabe lösen.
Gast #1913338
Lesenswert?

Ich weis was eine Schleife ist aber wie
ich sie schreiben muss damit sie funktioniert weis ich nicht.
Ich hab mir schon ein paar befehle heruas gesucht nur mit der
Umsetzung klappt es noch nicht so ganz.

PORTB,4
call schleife

schleife


movlw .250
movwf  ?


decfsz ....
retlw .0


irgendwie so glaub ich mal aber wie bekomm ich die dnan wieder aus und
das die Led auch eine bestimmte weile aus bleibt und dann wieder 
vorallem
wie mach ich des wie lang es aus bleibt.
Gast #1913378
Lesenswert?

Also das mit dem "?" und dem "...." ist meines Wissens keine gültige 
ASM-Schreibweise. Oder war das nur ein Platzhalter.

Erstmal muss man den decfsz Befehl verstehen. Der bewirkt, dass er von 
einem File-Register "1" abzieht und überprüft, ob das Ergebniss Null 
ist. Wenn es das ist, überspringt er den nächsten Befehl. Das kann man 
so verwenden, dass nach decfsz ein goto zu der vorletzten Zeile macht. 
die Aktuelle Zeile ist $, somit ist die vorletzte Zeile $-2.
1
schleife  movlw .165     // 165 ins Work-Register schreiben
2
          movwf 0x20     // die Zahl wird in das File-Register mit der Adresse 20h geschrieben
3
          decfsz 0x20, 1 // die Zahl um eins verringern, ins file-register speichern
4
          goto $-2       // wenn das Ergebnis nicht Null ist, 2 Zeilen zurückspringen
5
          retlw .0       // wenn das Ergebnis Null ist, Schleife beenden und das Work-Register leeren

Das Blinken kannst du z.B. so machen:
1
main      bsf PORTB,4
2
          call schleife
3
          bcf PORTB,4
4
          call schleife
5
          goto main

Sollte es zu schnell Blinken, kannst du mehrere schleifen hintereinander 
setzen, eine zweite Funktion machen, die die schleife mehrmals aufruft 
oder, was du sowieso bald machen solltest, dich mit dem Timer0 
auseinander setzen.

Im Datenblatt vom PIC steht, wieviele Cycles, also Durchläufe, ein 
Befehl braucht. movlw und movwf brauchen jeweils 1 Durchgang. retlw und 
goto brauchen 2. decfsz braucht einen, außer wenn das Ergebnis Null ist, 
dann 2.
Also 2 Cycles am Anfang, dann 165*3 (1 decfzs, 2 goto) und dann 3 zum 
Schluss (1 zusätzlich von decfst und 2 von retlw). Zusammen sind das 
dann 500 Cycles.

Ein Durchgang ist 1/4 der Zeit von der Betriebsfrequenz. Also bei einem 
4MHz Quartz -> 1MHz Durchlauffrequenz -> 1µs.

Also macht das Programm eine Pause von 500 µs, 0.5ms. Damit kann man gut 
rechnen.
Als zweite Funktion kann man die gleiche nehmen und vor dem decfsz den 
"call schleife" aufruf setzen. Dann gibt die Zahl, die man davor in das 
Fileregister schreibt, die Anzahl der 0,5ms Aufrufe an. Also 
beispielsweise .100 sind 50ms oder .200 wären 100ms.
Dabei sollte man bedenken, dass der Funktionsname anders ist, "$-2" auf 
"$-3" ändert und eine andere Adresse für das Fileregister nimmt. 
Natürlich muss man dann die neue Funktion dann im Hauptprogramm 
aufrufen. Ich weiß nicht, ob es zwingend notwenidig ist, wie bei C, aber 
ich hab vorsichtshalber die Funktionen immer über das Hauptprogramm 
geschrieben.

Nach dem Muster:
Einstellungen und Config (inkl. goto main)
Funktionen
Hauptprogramm
Nebenprogramme

Welche Hilfe nimmst du denn zum ASM-Programmieren. Ein Buch oder eine 
Website?? Kann nur sprut.de empfehlen.

PS: Mit einem Timer geht das etwas eleganter, aber alles zu seiner Zeit.
Gast #1913390
Lesenswert?

Oh gott.. Tut mir leid. Er muss in der Schleife natürlich nur in die 
letzte Zeile, also $-1.
1
...
2
($-1)   decfsz 0x20,1
3
( $ )   goto $-1

In der zweiten Zeile dann $-2:
1
...
2
($-2)   call schleife
3
($-1)   decfsz 0x21,1
4
( $ )   goto $-2
Gast #1913404
Lesenswert?

Ich habe nun mein Programm geschrieben und
teste das Programm mit einzel schirtte durch
das Problem ist das der DECFSZ nicht runter zählt und irgendwann
auf retlw springt er bleibt hängen find aber das pbroblem nicht
Angehängte Dateien:
Gast #1913428
Lesenswert?

Ansich sieht das nicht schlecht aus, das mit dem:
cblock  0x000
zeit
endc
kenn ich jetzt nicht aber beim Compilern wird er ja kein fehler haben.

Allerdings ist deine Schleife nicht 1000ms sondern ca 10µs ;) Außer du 
lässt den PIC mit 40 Herz laufen, aber das glaub ich nich.
Gast #1913433
Lesenswert?

Meine schleife funktioniert jetzt musste nur meine sprungmarke m2
runter setzen.

nun muss ich nur noch die zeit hoch schruaben im moment blinkt meine led
im µs sollte aber in sekunden  1,2 oder 3 abwechseln.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren