PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zum Programmieren im Assembler



Toni224
20.01.2010, 08:24
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)

Siro
22.01.2010, 16:33
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

Toni224
23.01.2010, 13:01
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

Siro
23.01.2010, 14:00
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

Toni224
23.01.2010, 14:40
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

Siro
23.01.2010, 15:15
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

Siro
23.01.2010, 15:39
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

Toni224
23.01.2010, 17:56
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...

PICture
23.01.2010, 18:07
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

Toni224
12.02.2010, 19:13
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