[Assembler] Lauflicht mit rotate und define byte

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Targa, 10. Januar 2009 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 10. Januar 2009
    Lauflicht mit rotate und define byte

    Ich hab ein schwerwiegendes Problem. Und zwar muss ich ein Referat halten über ein Lauflicht mit rotate und eins mit define byte.

    Davon dann eben den Code + pap erstellen und vergleichen.

    Beide Lauflichter sollen 2mal hin und 2 mal zurück laufen.

    Mein Problem ist


    Wir haben den Mikrocontroller 8051.

    Bisherigen Code:
    Lauflicht mit define byte; 2-mal hin und 2-mal zurück laufen (sollte es zumindest)

    PHP:

     code at 0
     
    include  c51rd2 . inc
     

    mov a
    #0
    mov dptr , #lauflicht


    start : push acc ;        
            
    movc a ,@ a + dptr ;        
            
    mov P0 , a ;         
            
    call Zeit ;            
            
    pop acc ;            
            
    inc a ;            
            
    cjne a , #29,start            


    lauflicht DB 00000001b , 00000010b , 00000100b , 00001000b , 00010000b , 00100000b , 01000000b , 10000000b , 01000000b , 00100000b , 00010000b , 00001000b , 00000100b , 00000010b , 00000001b , 00000010b , 00000100b , 00001000b , 00010000b , 00100000b , 01000000b , 10000000b , 01000000b , 00100000b , 00010000b , 00001000b , 00000100b , 00000010b , 00000001b

    zeit
    : mov r6 #255
    loopz1 : mov r7 #255
    loopz2 : djnz r7 loopz2
    djnz r6
    loopz1
    ret 


    Lauflicht mit rl and rr wiederum 2-mal hin und 2-mal zurück (sollte es wieder zumindest)

    PHP:

     code at 0
     
    include  c51rd2 . inc
     
            mov r2
    , #0
    start : mov p2 #01111111b 
            
    mov r1 , #1
    loop1 : mov a , p2
            rl a
            mov p2
    , a
            call zeit
            inc r1
            cjne r1
    , #8,loop1
            
            
    mov r1 , #1
    loop2 : mov a , p2
            rr a
            mov p2
    , a
            call zeit
            inc r1
            cjne r1
    , #8,loop2
            
            
    inc r2
            
            cjne r2
    , #2,start
            





    zeit : mov r6 #255
    loopz1 : mov r7 #255
    loopz2 : djnz r7 loopz2
    djnz r6
    loopz1
    ret 

    end
    Frage: Geht das so bzw. ist es so korrekt?



    Bewertungen kommen noch, kann blos grad keine mehr geben. Versprochen
     
  2. 10. Januar 2009
    AW: Lauflicht mit rotate und define byte

    wir arbeiten mit dem selben controller in der Schule und benutzen dazu Keil microvision das gibts kostenlos zum downloaden(finde es gerade leider nicht). Aufjedenfall hast du da die möglichkeit das ganze zu simulieren.

    Und ich glaub den befehl "call" gibts nich entweder "acall" oder "lcall" is zumindestens bei uns so.

    define byte wirste im zusammenhang mit Tabellen finden.

    Hoffe konnte etwas helfen muss jetzt leider weg.
     
  3. 10. Januar 2009
    AW: Lauflicht mit rotate und define byte

    Ich probier dir das hier mal einigermassen grob zu erklären.

    (Assembler Code gibts leider nicht, daher php zum besseren lesen. )
    PHP:
    #include 8051.h 
    . org 0000h
    main
    :      //Sprungmarke Hauptprogramm
    mov A #01111111b //In Akku. eine '1' laden - vermutlich Platine NULL aktiv - 0 => An
    sjmp lauf  // heist das nicht nur jmp? - naja springe zu "lauf"
    lauf //Sprungmarke "lauf"
    rr A   //Verschiebe das Bit ein Stelle nach Rechts
    mov P0 A   //Gib das ganze am Port 0 aus
    call zeit  //Zeitschleife
    call zeit  //Zeitschleife
    sjmp lauf  // Springen...

    zeit //unterprogramm...
    loop1 :
    mov r1 #255
    mov r2 #255
    loop2 :
    djnz r1 loop2
    djnz r2
    loop2
    ret 
    <---  haste vergessen

    Ich würde die Zeitschleife aber so schreiben, da man so ms genau Timen kann:

    Entspricht 1ms
    PHP:
    wait1ms :
    loop3 mov r7 #13
    loop2 mov r6 #255
               
    mov r5 #255
    djnz r5 , $    //$ -> gleichzeile
    djnz r6 loop2
    djnz r7
    loop3
    ret
     
  4. 10. Januar 2009
    AW: Lauflicht mit rotate und define byte



    Danke für die Kommentare hinter den Codezeilen.

    sjmp ist ein unbedingter Sprung mit noch anderen diversen Eigenschaften
    jmp ein bedingter

    Mir ist grad eingefallen, dass wir in der Schule auch nur jmp benutzt haben. Das änder ich dann ma

    Noch ne Frage: Die Sprungmarke "main" braucht man die denn überhaupt? Ich mein es wird ja nirgends drauf verwiesen und somit ist die ja überflüssig?!?!

    PHP:
    . org 0000h
    hat die Zeile irgendwas zu bedeuten, hab ich nämlich noch nie zuvor gesehen?!
     
  5. 10. Januar 2009
    AW: Lauflicht mit rotate und define byte

    Ist doch gut wenn du "neue Befehle" hast - wirkt gut - sollange du es erklären kannst.

    Das sagt dem Compiler wohin der Code soll. Sprich wo sich der Microkontroller befindet. (Abhängig vom jeweiligen Microkontroller - bei uns ist es org 8000h)
     
  6. 10. Januar 2009
    AW: Lauflicht mit rotate und define byte

    Allet klar, thank u very much erstmal.

    Die Sprungmarke "main" ganz am Anfang des Programms scheint mir überflüssig zu sein da nichts auf die Sprungmarke verweißt, oder hab ich da Unrecht?

    Wie bekomm ich es denn nun hin, dass es 2-mal hin und 2-mal zurück läuft?

    Theoretisch bräuchte man eine Art Zähler der eben +1 jedesmal nach einem Durchlauf macht und gleichzeitig eine if Abfrage ob schon 2 erreicht wurden.

    Allerdings könnte ich sowas nur in Java und nicht in Assemlber vllt. könnte mir da noch jemand auf die Sprünge helfen.

    Dann noch ein Anliegen zwecks dem Simulationsprogramm, ich hab es leider auch nicht gefunden im großen weiten Internet, falls es jemand hat oder besorgen könnte wäre es wirklich traumhaft wenn diese Person mich kontaktieren könnte

    Danke erstmal für die Hilfe, wirklich great!!
     
  7. 10. Januar 2009
    AW: Lauflicht mit rotate und define byte

    Jop

    Genau so könnte man es machen.
    Einfach ein Register anlegen das die Durchläufe zählt.
    Überprüfen nicht vergessen ob es schon am Ende ist und dann mir "rl A" das ganze zurück laufen lassen.
     
  8. 11. Januar 2009
    AW: Lauflicht mit rotate und define byte

    Naja, es bezieht sich mehr auf den speicher, wo der code hin geschrieben werden soll
     
  9. 11. Januar 2009
    AW: Lauflicht mit rotate und define byte

    Joa, wusste nicht wie ich mich ausdrücken soll. =)
     
  10. 20. Januar 2009
    AW: Lauflicht mit rotate und define byte

    Lauflicht mit define byte; 2-mal hin und 2-mal zurück laufen (sollte es zumindest)

    PHP:

     code at 0
     
    include  c51rd2 . inc
     

    mov a
    #0
    mov dptr , #lauflicht


    start : push acc ;        
            
    movc a ,@ a + dptr ;        
            
    mov P0 , a ;         
            
    call Zeit ;            
            
    pop acc ;            
            
    inc a ;            
            
    cjne a , #29,start            


    lauflicht DB 00000001b , 00000010b , 00000100b , 00001000b , 00010000b , 00100000b , 01000000b , 10000000b , 01000000b , 00100000b , 00010000b , 00001000b , 00000100b , 00000010b , 00000001b , 00000010b , 00000100b , 00001000b , 00010000b , 00100000b , 01000000b , 10000000b , 01000000b , 00100000b , 00010000b , 00001000b , 00000100b , 00000010b , 00000001b

    zeit
    : mov r6 #255
    loopz1 : mov r7 #255
    loopz2 : djnz r7 loopz2
    djnz r6
    loopz1
    ret 


    Lauflicht mit rl and rr wiederum 2-mal hin und 2-mal zurück (sollte es wieder zumindest)

    PHP:

     code at 0
     
    include  c51rd2 . inc
     
            mov r2
    , #0
    start : mov p2 #01111111b 
            
    mov r1 , #1
    loop1 : mov a , p2
            rl a
            mov p2
    , a
            call zeit
            inc r1
            cjne r1
    , #8,loop1
            
            
    mov r1 , #1
    loop2 : mov a , p2
            rr a
            mov p2
    , a
            call zeit
            inc r1
            cjne r1
    , #8,loop2
            
            
    inc r2
            
            cjne r2
    , #2,start
            





    zeit : mov r6 #255
    loopz1 : mov r7 #255
    loopz2 : djnz r7 loopz2
    djnz r6
    loopz1
    ret 

    end

    Genauere Aufgabenstellung bitte oben entnehmen!

    So da ich das nicht testen kann (Simulator ist leicht unkooperativ^^) ich aber trotzdem wissen muss ob es so geht bitte ich jemand der Ahnung hat da drüber zu schauen obs so geht bzw. funktioniert.

    Danke schonmal!
     
  11. 20. Januar 2009
    AW: Lauflicht mit rotate und define byte

    die "end" anweisung muss ganz ans ende, sprich nach den unterprogrammen.

    end sagt dem compiler weiter musste nicht und der ignoriert dann den rest.
     
  12. 20. Januar 2009
    AW: Lauflicht mit rotate und define byte

    Danke dir.

    Der Rest stimmt oder wie darf ich deine Zurückhaltenheit deuten?
     
  13. 21. Januar 2009
    AW: Lauflicht mit rotate und define byte

    Meiner Meinung nacht stimmt der Rest, kann es aber leider auch nicht Testen.

    Die Tabelle muss aber glaube ich so aussehen, weis nicht ob die Schreibweise was ändert. Zumindest ist es so übersichtlicher.


    Spoiler
    PHP:
    code at 0
    include  c51rd2 . inc


    mov a
    #0
    mov dptr , #lauflicht


    start : push acc ;        
            
    movc a ,@ a + dptr ;        
            
    mov P0 , a ;         
            
    call Zeit ;            
            
    pop acc ;            
            
    inc a ;            
            
    cjne a , #29,start            
            
    jmp ende ;   //<-----


    lauflicht
    db 00000001b
    db 00000010b
    db 00000100b
    db 00001000b
    db 00010000b
    db 00100000b
    db 01000000b
    db 10000000b
    db 01000000b
    db 00100000b
    db 00010000b
    db 00001000b
    db 00000100b
    db 00000010b
    db 00000001b
    db 00000010b
    db 00000100b
    db 00001000b
    db 00010000b
    db 00100000b
    db 01000000b
    db 10000000b
    db 01000000b
    db 00100000b
    db 00010000b
    db 00001000b
    db 00000100b
    db 00000010b
    db 00000001b

    zeit
    : mov r6 #255
    loopz1 : mov r7 #255
    loopz2 : djnz r7 loopz2
    djnz r6
    loopz1
    ret 

    ende
    end

    Kleine Verbesserung:
    Spoiler
    PHP:

     code at 0
     
    include  c51rd2 . inc
     
            mov r2
    , #0
    start : mov p2 #01111111b 
            
    mov r1 , #1
    loop1 : mov a , p2
            rl a
            mov p2
    , a
            call zeit
            inc r1
            cjne r1
    , #8,loop1
            
            
    mov r1 , #1
    loop2 : mov a , p2
            rr a
            mov p2
    , a
            call zeit
            inc r1
            cjne r1
    , #8,loop2
            
            
    inc r2
            
            cjne r2
    , #2,start
            
    jmp ende //<-----





    zeit : mov r6 #255
    loopz1 : mov r7 #255
    loopz2 : djnz r7 loopz2
    djnz r6
    loopz1
    ret 

    ende
    end
     
  14. 21. Januar 2009
    AW: Lauflicht mit rotate und define byte

    Rotate R-L

    http://img2.abload.de/img/rotaterulkopiewtzo.jpg

    Define Byte:

    http://img2.abload.de/img/definebytehkh4.jpg

    Das mit dem "end" stimmte davor, da er ja gar nicht da hin kommt. Nach dem Unterprogramm geht er ja wieder back zum Hauptprogramm und dann wird irgendwann erst das Programm beendet!

    Bzw. muss man ja immer Unterprogramm von dem Hauptprogramm trennen und das wäre nicht der Fall wen man den end Tag ganz am Schluss setzten würde!!??

    Ist dann so alles right?
     
  15. 21. Januar 2009
    AW: Lauflicht mit rotate und define byte

    Ja, ist alles richtig.
    Nur "normalerweise" schreibt man Text im Programmablaufplan und keine Dinge wie "A++", da das an die Programmierspreche zu arg anlehnt. Ein Text wie "erhöhe A um eins" wäre zb Ideal, da es auch für Laien verständlich ist die keine Programmiersprache sprechen. (Eigentlicher Sinn eines PAP ist es ja zB. einen Kunden diese zu Präsentieren und der kann mit "A++" nichts anfangen )
     
  16. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.