Forum: Mikrocontroller und Digitale Elektronik LED leuchten lassen mit pic (Assembler)


von Johannes (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

ich will meine LED zum Leuchten bringen bekomme es aber
nicht hin.Weis jemand vill warum?

von ich (Gast)


Lesenswert?

du setzt mit 0xFF alle bits vom TRISB-Register auf 1 -> Eingänge. 
Versuch mal 0x00 zu schreiben und somit die Pins auf Ausgang zu schalten

von ich (Gast)


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).

von Johannes (Gast)


Lesenswert?

Habe ich schon ausporbiert geht immer noch nichts.
Kann es sein das der pin vom uC dafür nicht geeignet ist
das ich ein anderen nehmen muss ?

von Karl H. (kbuchegg)


Lesenswert?

Kann es sein, dass du den Pin auf 0 schalten musst (also jetzt nicht das 
TRISB Register, sondern den PORTB-Pin selber), damit die LED leuchtet?

von Johannes (Gast)


Lesenswert?

Könnte sein wie
geht das ?

von ich (Gast)


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.

von Maik W. (werner01)


Lesenswert?

Hast du den Controller richtig konfiguriert? Und zum Schluss würde ich 
noch
schreiben GOTO $-2. Sonst läuft nämlich der Programmcounter über und 
macht reset. Ja und wie schon geschrieben TRISB muß mit 0x00 gefüllt 
werden.

von Johannes (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


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.

von Johannes (Gast)


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.

von ich (Gast)


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.

von Wilfried D. (wilfried_d)


Lesenswert?

Folgende Website hat ein super Tutorial/Einführung, allerdings wird mit 
einem Atmega gearbeitet, für die Grundlagen trotzdem bestens geeignet, 
Schleifen etc sind auch ausführlich erklärt und alles in Assembler.

von ich (Gast)


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

von Johannes (Gast)


Angehängte Dateien:

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

von ich (Gast)


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.

von Johannes (Gast)


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.

von usuru (Gast)


Lesenswert?

Schau Dich doch mal bei www.sprut.de um, da gibt es all das was Du 
brauchst, auch fertige Routinen für Schleifen, z.B. bei 
http://sprut.de/electronic/pic/programm/lauflicht/lauflich.htm

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.