Hallo ich will meine LED zum Leuchten bringen bekomme es aber nicht hin.Weis jemand vill warum?
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
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).
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?
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.
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.
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.
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.
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.
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 |
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.