www.mikrocontroller.net

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


Autor: Johannes (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

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

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte sein wie
geht das ?

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Maik Werner (werner01)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
schleife  movlw .165     // 165 ins Work-Register schreiben
          movwf 0x20     // die Zahl wird in das File-Register mit der Adresse 20h geschrieben
          decfsz 0x20, 1 // die Zahl um eins verringern, ins file-register speichern
          goto $-2       // wenn das Ergebnis nicht Null ist, 2 Zeilen zurückspringen
          retlw .0       // wenn das Ergebnis Null ist, Schleife beenden und das Work-Register leeren

Das Blinken kannst du z.B. so machen:
main      bsf PORTB,4
          call schleife
          bcf PORTB,4
          call schleife
          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.

Autor: Wilfried D. (wilfried_d)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ich (Gast)
Datum:

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

In der zweiten Zeile dann $-2:
...
($-2)   call schleife
($-1)   decfsz 0x21,1
( $ )   goto $-2

Autor: Johannes (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: usuru (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.