Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zum Programmieren im Assembler
Hallo
Ich habe folgendes Problem. Ich bin Anfänger und habe mit dem Programm
Mplab im Assembler folgenden Code geschrieben (siehe unten). Ich habe
folgende Idee. Ich habe ein LED-Feld von 3x3 LED`s. Beim Betätigen eines
Tasters leuchten die LED`s durcheinander auf, wie bei einem
Zufallsgenerator. Und wenn ich den Taster wieder drücke bleibt es bei
einem LED stehen und das leuchtet dann. Aber irgendwie funktioniert es
nicht so wie ich will. Könnt ihr mir Helfen?
Gruss und Danke
Toni
#include<p18F452.inc>
org 0x20
movlw B'00000000'
movwf TRISA
movlw B'00000000'
movwf TRISB
movlw B'00010000'
movwf TRISC
Schleife
movlw B'00001000' ;LED 1
movwf PORTA
btfss PORTC, 4
goto Variante_0
goto Variante_1
Variante_0
movlw B'10000000' ;LED 2
movwf PORTA
btfss PORTC, 4
goto Variante_2
goto Variante_3
Variante_2
movlw B'00000001' ;LED 3
movwf PORTA
btfss PORTC, 4
goto Variante_4
goto Variante_5
Variante_4
movlw B'00000100' ;LED 4
movwf PORTA
btfss PORTC, 4
goto Variante_6
goto Variante_7
Variante_6
movlw B'01000000' ;LED 5
movwf PORTA
btfss PORTC, 4
goto Variante_8
goto Variante_9
Variante_8
movlw B'00000100' ;LED 6
movwf PORTB
btfss PORTC, 4
goto Variante_10
goto Variante_11
Variante_10
movlw B'00000010' ;LED 7
movwf PORTB
btfss PORTC, 4
goto Variante_10
goto Variante_11
Variante_12
movlw B'00001000' ;LED 8
movwf PORTB
btfss PORTC, 4
goto Variante_14
goto Variante_15
Variante_14
movlw B'10000000' ;LED 9
movwf PORTB
btfss PORTC, 4
goto Variante_16
goto Variante_17
goto Schleife
Variante_1
movlw B'00001000' ;LED 1
movwf PORTC
goto Schleife
Variante_3
movlw B'01110111' ;LED 2
movwf PORTC
goto Schleife
Variante_5
movlw B'01000001' ;LED 3
movwf PORTC
goto Schleife
Variante_7
movlw B'01100101' ;LED 4
movwf PORTB
goto Schleife
Variante_9
movlw B'01001001' ;LED 5
movwf PORTC
goto Schleife
Variante_11
movlw B'01101101' ;LED 6
movwf PORTC
goto Schleife
Variante_13
movlw B'01101101' ;LED 7
movwf PORTC
goto Schleife
Variante_15
movlw B'01101101' ;LED 8
movwf PORTC
goto Schleife
Variante_17
movlw B'01101101' ;LED 8
movwf PORTC
goto Schleife
end
Code-Tags eingefügt (PicNick)
Hallo Tini224,
Der erste Fehler : ORG 0x20
der Prozessor startet (RESET Vector) bei 0x0000
Das wäre aber nicht so tragisch, er kommt nach 16 Zyklen auch an der Speicherstelle bei 0x0020 vorbei, dann geht dein eigentliches Programm los.
Wenn der PIC ordnungsgemäß gelöscht ist, würde er also 16 "NOP" Befehle ausführen,
bevor er in deinem Programm landet.
Der eigentliche Programmablauf ist nicht eindeutig festgelegt.
Dein Programm springt ständig von einer Variante zur nächsten.
Das ändert sich zwar wenn man die Taste drückt, aber ich vermute mal,
daß entweder die LED 1 oder bei Tastendruck die LED 7 leuchten wird.
Je nachdem ob Du die Taste nach Masse oder Plus schaltest.
Ich weis ja nicht wie schnell dein Prozessor taktet, aber mit Sicherheit so schnell,
daß selbst bei dem kürzesten Tastendruck dein Programm in einer Endlosschleife landet.
Ich habe es mal simuliert.
Denke daran, die Befehle werden extrem schnell abgearbeitet,
wenn Du den PIN RC4 abfragst und dann verzweigst und dann erneut wieder abfragst und wieder
verzeigst usw. sind das nur einige Mikrosekunden bis dahin. So schnell kanst Du die Taste garnicht
wieder loslassen....
Hier must Du den Ablauf wohl noch etwas abändern.
Mit MPLAB kann man das sehr schön simulieren, was passiert.
Dazu must Du zunächst den Simulator aktivieren.
Oben im Menü: "Debugger" "Select Tool" "MPLAB Sim"
Wenn Du dann deinen "ORG 0x0000" geändert hast und auf Quickbuild gehst,
dann erscheint ein grüner Pfeil links in deinem Fenster. Hier wird die momentane Position angezeigt,
wo sich das Programm grade befindet.
Mit der Taste F7 kannst Du nun Schrittweise dein Programm abarbeiten.
Probier das zunächst mal aus.
Nun kannst Du dein Taste simulieren, daß macht man wie folgt:
Im Menü auswählen: "Debugger" "Stimulus" "New Workbook"
Jetzt geht ein Fenster auf.
Nun klickst Du auf das Feld "Pin/FSR" Dann erscheint ein Pfeil nach unten in dem darunter liegendem Feld.
Hier wählst Du deinen Pin aus, den Du simuliere willst. Also "RC4"
In dem Feld daneben "Action" wählst Du "Set HIGH" oder "Set LOW" aus. Jenachdem welchen Pegel Du grade
simulieren willst. Nun klickst Du das Text-Fenster wo dein Progammcode steht wieder an.
Mit F7 kannst Du Schritt für Schritt das Programm verfolgen. Du kannst nun zu jederzeit in dem
"Stimulus" Fenster die linke graue Taste unter Fire betätigen um deinem Portpin zu simulieren.
Dann klickst Du zurück in dein Programm Fenster und arbeitest weiter mit der F7 Taste deine Befehle ab.
Musst Du mal ein bischen rumprobieren, das kriegst Du schon hin.
ich hoffe ich konnte Dir etwas weiterhelfen.
mfg. Siro
Hallo Siro
Vielen Dank für deine Tipps. Haben mir sehr geholfen.
Nur habe ich das Problem das immer eine Fehlermeldung beim Kompilieren kommt.
Und zwar erkennt es die befehle org, movlw, movwf, btfss u.s.w. nicht..
Es steht immer das mein Projekt "out of date" ist...und dann kommt eine lange Liste mit den Befehlen die es nicht erkennt :-s
Unten habe ich meine aktuellste Version hinzugefügt. Mein Ziel ist es ja, etwas ähnliches wie einen Zufallsgenerator zu Programmieren nur das ich halt jedes LED einzeln aufrufe und nun neu eine kurze wartezeit eingebaut habe so das jedes LED einzeln nacheinander aufleuchtet...und ich das ganze mit einem Taster starte und dann mit dem selben Taster unterbreche und es bei einem LED stehen bleibt...
#include <p18F4520.inc>
org 0x0000
movlw B'00000000'
movwf TRISA
movlw B'00000000'
movwf TRISB
movlw B'00010000'
movwf TRISC
Schleife
movlw B'00000010' ;LED 1
movwf PORTA
btfss PORTC, 4
goto Variante_0
goto Variante_1
call zeit_kurz
Variante_0
movlw B'00100000' ;LED 2
movwf PORTA
btfss PORTC, 4
goto Variante_2
goto Variante_3
call zeit_kurz
Variante_2
movlw B'00000001' ;LED 3
movwf PORTA
btfss PORTC, 4
goto Variante_4
goto Variante_5
call zeit_kurz
Variante_4
movlw B'00000100' ;LED 4
movwf PORTA
btfss PORTC, 4
goto Variante_6
goto Variante_7
call zeit_kurz
Variante_6
movlw B'01000000' ;LED 5
movwf PORTA
btfss PORTC, 4
goto Variante_8
goto Variante_9
call zeit_kurz
Variante_8
movlw B'00000100' ;LED 6
movwf PORTA
btfss PORTC, 4
goto Variante_10
goto Variante_11
call zeit_kurz
Variante_10
movlw B'00000100' ;LED 7
movwf PORTA
btfss PORTC, 4
goto Variante_10
goto Variante_11
call zeit_kurz
Variante_12
movlw B'00001000' ;LED 8
movwf PORTA
btfss PORTC, 4
goto Variante_14
goto Variante_15
call zeit_kurz
Variante_14
movlw B'10000000' ;LED 9
movwf PORTB
btfss PORTC, 4
goto Variante_16
goto Variante_17
call zeit_kurz
goto Schleife
Variante_1
movlw B'00001000' ;LED 1
movwf PORTC
goto Schleife
Variante_3
movlw B'01110111' ;LED 2
movwf PORTC
goto Schleife
Variante_5
movlw B'01000001' ;LED 3
movwf PORTC
goto Schleife
Variante_7
movlw B'01100101' ;LED 4
movwf PORTB
goto Schleife
Variante_9
movlw B'01001001' ;LED 5
movwf PORTC
goto Schleife
Variante_11
movlw B'01101101' ;LED 6
movwf PORTC
goto Schleife
Variante_13
movlw B'01101101' ;LED 7
movwf PORTC
goto Schleife
Variante_15
movlw B'01101101' ;LED 8
movwf PORTC
goto Schleife
Variante_17
movlw B'01101101' ;LED 8
movwf PORTC
goto Schleife
zeit_kurz
movlw D'1'
movwf i
Cycle_kurz nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
decfsz i,F
goto Cycle_kurz
return
end
Hallo,
arbeitest Du mit einem richtigem Projekt, mit Linkerscript usw. oder nur mit einer "ASM" Datei und dann "Quickbuild" ?
Das klingt so, als ob dein Projekt einen "Schuss" hat. Das ist mir auch schon mal passiert und ich muste es
komplett neu anlegen. Hatte deswegen auch Rücksprache mit Microchip. Die meinten einfach das Projekt neu anlegen,
kann schon mal vorkommen. Das tat ich dann und alles war wieder in Ordnung. Da Du aber anscheinend am Anfang
mit der PIC Programmierung stehst, vermute ich mal, daß hier ein anderes Problem vorliegt.
Ich habe mir deinen Code mal rauskopiert und Compiliert.
ich bekomme bei deinem jetzigen Programm folgende Fehlermeldungen:
Symbol not previously defined (Variante_16)
Symbol not previously defined (i)
Symbol not previously defined (i)
Das ist auch richtig so, da der Sprunglabel Variante_16 garnicht in deinem Program existiert, hast Du anscheinend vergessen, weggelöscht oder was auch immer.
Das "i" soll sicherlich eine Variable sein, die must Du vorher irgendwo definieren, wo sie im Speicher (RAM) stehen soll.
zum Beispiel:
i EQU 0x20 ; hier wird die Variable i an der Speicherstelle 20 Hex im RAM abgelegt
; diese Zeile schreibst Du am besten noch vor deinem ORG
wenn Du folgende Fehlermeldung bekommst:
Found directive in column 1. (org)
dann fehlt ein Leerzeichen vorn in der Zeile, das ORG darf nicht ganz links am Rand der Zeile stehen
ebenso wenn Du folgende Meldung bekommst:
Found opcode in column 1. (movlw)
auch hier fehlt vorn mindestens ein Leerzeichen.
Wäre aber gut, wenn Du deine Fehlermeldungen exakt beschreibst, dann kann man besser Rückschlüsse ziehen.
Dein "zeit_kurz" Unterprogramm ist auch ganz niedlich..., die Schleife ist wirklich sehr kurz.
Du setzt den Wert i auf 1 und zählst ihn dann solange herunter bis 0 herauskommt.
Das passiert aber sofort, beim ersten Durchlauf. Gibt nicht so wirklich einen Sinn.
Das Prinzip ist aber so richtig.
mfg. Siro
Hey Siro...
Ich arbeite eigentlich nur mit ASM Dateien...
Hmm das mit dem formatieren ist schon etwas unpraktisch :-s
Aber dank dir vielmals...Habe praktisch alle fehler beheben können...
Es lag wirklich nur an dem das ich keine Leerzeichen hatte...
Nun kan ich den Code Kompilieren und es kommen keine Fehlermeldungen...ausser das noch eine Warnung steht:
Found label after column 1. (i)...was könnte das sein?
Ich habe jetzt bei der Schleife denn Wert auf 100 gesetzt...jetzt sollten die Wartezeiten zwischen dem Auflechten der LED`s etwas länger sein...oder?
Denkst du mein Programm sollte jetz so funktionieren wie ich mir das vorgestellt habe?
Gruss und danke nochmals für deine Hilfe =D>
oberallgeier
23.01.2010, 15:14
... Da kannst Du aber nicht für, da müsste man den Webdesigner mal etwas was auf die Finger klopfen ...Müsste man nicht, denn der hat genau für solche Zwecke vorgesorgt und im Fenster "Antwort schreiben" etliche Buttons eingerichtet. Einer davon heißt [ Code ] - draufklicken, dann kommt das Tag in das Schreibfenster - Code mit c&p ins Schreibfenster - nochmal auf den Button (dort steht jetzt [ Code* ] ) - und schon ist der Code 1:1 im Posting - komplett mit der Formatierung. MIT ALLEN TABS oder ausgefüllten Abständen. Das sieht dann so aus:
// Beispiel zum Umgang mit dem Codebutton
#define rLED 3 // Rote LED auf PB3
#define TAU 1 // Taster "Aufwärts", PB1
#define TAB 2 // Taster "Abwärts", PB2 = "Start"Taste
// Beispiel zum Umgang mit dem Codebutton
#define rLED 3 // Rote LED auf PB3
#define TAU 1 // Taster "Aufwärts", PB1
#define TAB 2 // Taster "Abwärts", PB2 = "Start"Taste
// Beispiel zum Umgang mit dem Codebutton
#define rLED 3 // Rote LED auf PB3
#define TAU 1 // Taster "Aufwärts", PB1
#define TAB 2 // Taster "Abwärts", PB2 = "Start"Taste
// Beispiel zum Umgang mit dem Codebutton
#define rLED 3 // Rote LED auf PB3
#define TAU 1 // Taster "Aufwärts", PB1
#define TAB 2 // Taster "Abwärts", PB2 = "Start"Taste
Hallo Toni224,
das i EQU 0x20 muss "ausnahmsweise, wie die Sprungmarken" ganz links stehen, da dürfen keine Leerzeichen sein. Daher kommt der Fehler.
Mir ist noch nicht ganz klar, was Du mit dem PORTC machst.
Kannst Du ein Schaltbild reinstellen ?
Soll das ein elektronischer Würfel sein ?
Sollen nach dem Tastendruck mehrere oder nur eine Led leuchten ?
Mit welcher Frequenz läuft denn dein PIC (Quarz) oder interner Oszillator.
Die Warteschleife wird wohl immer noch viel zu kurz sein.
Ich würde auch warten, bis die Taste wieder losgelassen wird, also
ein Endlosschlöeife solange die Taste noch gedrückt ist.
mfg. Siro
Hallo oberallgeier,
habe ich etwas übersehen ?, dann bitte ich um Entschuldigung.
Ich befinde mich gerade, wo ich diesen Text Schreibe, im "Kurz Antwort" Fenster. Wo sind denn hier die Buttons ?
Ich habe nur unter dem Fenster 4 Schaltflächen mit
"Smiles" "Auswahl quoten" "Vorschau" und "Absenden"
Upps, jetzt sehe ich es grad , ich muss auf Vorschau gehen, dann hab ich die Auswahlfelder. Da muss man aber erstmal drauf kommen. Wer guckt sich denn die Vorschau an und fängt dann an Formatierungen vorzunehmen. Egal, es geht und ich bitte um Vergebung, das hatte ich bisher noch nicht gesehen.
mfg. Siro
oberallgeier
23.01.2010, 16:46
Du musst Dich nicht entschuldigen, vor allem nicht sooo groß - man lernt nicht aus - wenn man nicht will . . . *ggg*. Du hast ja recht - das ist das Kurz Antwort Fenster (da bin ich gerade). Bei mir gibts links, gaaaanz unten, zwei Buttons: (neues thema) und (antwort erstellen). Dieses (antwort erstellen) ist deswegen so pfiffig, weil es diese ganze Buttonauswahl gibt mit der man zum Beispiel dieses da machen kann, aber eben nicht in der "Kurz Antwort" (jetzt Umschalten zu "Antwort schreiben"):
Bei mir gibts links, gaaaanz unten, zwei Buttons: https://www.roboternetz.de/phpBB2/templates/fisubsilversh/images/lang_german/post.gif und https://www.roboternetz.de/phpBB2/templates/fisubsilversh/images/lang_german/reply.gif.
Und so was ist doch wirklich pfiffig ! ?
PS: so grosse Schriften sind nicht soooo sehr gern gesehen - und bitte nicht böse wegen der Kritk
Also im PORTC ist der Taster den ich ansteuere...ich könnte den auch ins PORTB machen aber hab es halt so angefangen und halt nicht mehr geändert O:)
Ja die Funktion ist wie bei einem elektronischem Würfel nur das ich ein Feld von 3x3 LED`s habe und einen Taster für den Start und das Stopp...
Beim ersten Drücken des Tasters leuchten die LED`s durcheinander auf und beim zweitem Drücken bleibt es bei einem LED stehen und das bleibt dann leuchten...
Habe leider keine Ahnung mit welcher Frequenz 8-[
und wie soll ich die Warteschleife am besten Einstellen?
Habe halt keine Ahnung wie ich das mit dem Taster am besten machen soll...
Hallo!
Wenn du PIC Programmierung in Assembler lernen willst, würde ich dir anfangs das Lesen von https://www.roboternetz.de/wissen/index.php/PIC_Assembler empfehlen. :)
MfG
Hallo, schnell ne Frage...
Ich will innerhalb von einer Schleife von PORTB zum PORTC Springen.
Kann ich das so machen? ich habe das Problem das mir so das LED von Variante 8 und 9 gleichzeitig aufleuchten.
;Variante 7
movlw B'00010000'
btfss taster
movwf PORTB
call Warteschleife
;Variante 8
movlw B'01000000'
btfss taster
movwf PORTB
call Warteschleife
;Variante 9
movlw B'00000001'
btfss taster
movwf PORTC
call Warteschleife
btfss taster ; Taster immernoch gedrückt?
goto Schlaufe ; ja=Endlosschleife
goto main ; nein= main
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.