Gast
#1910939
Hallo ich will meine LED zum Leuchten bringen bekomme es aber nicht hin.Weis jemand vill warum?
|
Anzeige
|
LED leuchten lassen mit pic (Assembler)
Gast
#1910939
Hallo ich will meine LED zum Leuchten bringen bekomme es aber nicht hin.Weis jemand vill warum?
Gast
#1910942
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
Gast
#1910946
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
#1910986
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 ? 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?
Gast
#1910998
Könnte sein wie geht das ?
Gast
#1911016
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. 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.
Gast
#1913298
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? 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
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
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.
Das Blinken kannst du z.B. so machen:
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. 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.
Gast
#1913390
Oh gott.. Tut mir leid. Er muss in der Schleife natürlich nur in die letzte Zeile, also $-1.
In der zweiten Zeile dann $-2:
Gast
#1913404
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
Gast
#1913428
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
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.
Gast
#1913964
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 Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|