-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Frage zum Programmieren im Assembler

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    20.01.2010
    Beiträge
    5

    Frage zum Programmieren im Assembler

    Anzeige

    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

    Code:
    #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)

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    526
    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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    20.01.2010
    Beiträge
    5
    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

    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...

    Code:
    #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

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    526
    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

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    20.01.2010
    Beiträge
    5
    Hey Siro...


    Ich arbeite eigentlich nur mit ASM Dateien...
    Hmm das mit dem formatieren ist schon etwas unpraktisch

    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>
    Angehängte Dateien Angehängte Dateien

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    Zitat Zitat von Siro
    ... 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:

    Code:
    // 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
    Ciao sagt der JoeamBerg

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    526
    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

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    526
    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 [flash width=100 height=100]bitte um Vergebung[/flash], das hatte ich bisher noch nicht gesehen.
    mfg. Siro

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    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: und .

    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
    Ciao sagt der JoeamBerg

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    20.01.2010
    Beiträge
    5
    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

    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
    und wie soll ich die Warteschleife am besten Einstellen?

    Habe halt keine Ahnung wie ich das mit dem Taster am besten machen soll...

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •