-         

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

Thema: Inline Assembler

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544

    Inline Assembler

    Anzeige

    Hallo liebe Leute,

    nach einer Weile des grübelns und überlegens hab ich mich dazu entschieden, ein bischen Assembler zu "lernen".
    So weit, so gut.
    Allerdings macht mir mein erstes Programm schon Probleme
    Hier mal der Code:
    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $framesize = 30
    $hwstack = 30
    $swstack = 30
    
    $asm
    
    ldi r16, 0xFF
    Out Ddrc , R16
    
    ldi r16, 0b11110000
    Out Portc , R16
    
    Lop:
    
    rjmp lop
    
    $end Asm
    
    End
    Nach meinem Verständnis sollten jetzt ja 4 leds leuchten und die anderen 4 nicht. Jedoch leuchtet keine!

    Hier mal der Code, der meiner Meinung nach genau das selbe macht:
    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $framesize = 30
    $hwstack = 30
    $swstack = 30
    
    DDRC = 255
    
    PORTC = &b11110000
    
    Do
    
    Loop
    
    End
    Dieser Code funktioniert.
    Könnt ihr mir sagen, wo mein Fehler ist?

    Vielen Dank
    Gruß
    Chris

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    Versuch mal die Schreibweise des Wertes zu ändern:
    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $framesize = 30
    $hwstack = 30
    $swstack = 30
    
    $asm
    
    ldi r16, &hFF
    Out Ddrc , R16
    
    ldi r16, &b11110000
    Out Portc , R16
    
    Lop:
    
    rjmp lop
    
    $end Asm
    
    End
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    Hallo peterfido,

    vielen dank, jetzt funzts

    Aber kannst du mir erklären, warum das so gemacht werden muss??

    Gruß
    Chris

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143
    Hallo,

    das DDRC bestimmt welche Ports am Port C als Eingänge und welche als Ausgänge verwendet werden sollen. Erst wenn man dann auf den Port schreibt, steht ein Wert an.

    In Deinem Fall waren die Port-Ausgänge auf Low nachdem das DDRC gesetzt wurde. Deine LED's sind vermutlich vom Port über Vorwiderstand auf Masse geschaltet.

    Mitch.

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Hi, Che !
    vielleicht magst du gucken :
    http://www.rn-wissen.de/index.php/As...Cr_Bascom-User
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    Vielen Dank für eure Antworten,

    aber ich meinte eigentlich, worin der Unterschied besteht, wenn ich astatt
    Code:
    0xFF
    dieses schreibe:
    Code:
    &hFF
    ??

    Das sind doch eigentlich die gleichen Werte, oder nicht?

    Gruß
    Chris

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    "&H" ist das, was Bascom versteht, "0x" ist was für "C" und diverse andere Sprachen.
    Da is wohl noch jeder schon mal ins Schleudern gekommen *g*
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    Vielen Dank, jetzt weis ich das auch

    Jetzt habe ich aber wieder mal eine Frage:
    Mit folgendem Code möchte ich bei Tastendruck (Pina.0) eine Led an Portc.0 toggeln.
    Allerdings wird diese nicht getoggelt, sondern sie leuchtet nur solange, solange ich den Taster drücke.
    Hier der Code:
    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $framesize = 30
    $hwstack = 30
    $swstack = 30
    
    $asm
    
    .def Null = R20
    .def Eins = R21
    .def K = R22
    .def I = R23
    .def J = R24
    
    ldi null, &b00000000
    ldi eins, &b11111111
    
    ldi r16, &b11111111
    Out Ddrc , R16
    
    ldi r16, &b00000000
    Out Ddra , R16
    
    ldi r16, &b11111111
    Out Portc , R16
    
    ldi r16, &b11111111
    Out Porta , R16
    
    
    Lop:
    
    sbis pina , 0
    rjmp taster_an
    
    rjmp lop
    
    
    Taster_an:
    ldi r16, &b00000000
    sbis pinc , 0
    ldi r16, &b11111111
    cpi r16 , &b00000000
    breq led_ein
    sbi portc,0
    rjmp ende_taster_an
    Led_ein:
    cbi portc,0
    Ende_taster_an:
    'rcall wait
    ret
    
    Wait:
        ldi k,10
    loop_k:
        nop
        nop
        dec k
        cpi k,0xFF
        brne loop_k
        dec j
        cpi j,0xFF
        brne Wait
        dec i
        cpi i,0xFF
        brne Wait
        ret
    
    $end Asm
    
    End
    Warum wird die Led immer wieder ausgeschaltet (also 0 = ein und 1 = aus)??

    Gruß
    Chris

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    Du setzt r16 auf 1 und vergleichst im nächsten Schritt auf 0.. Das Ergebnis wird immer 1 sein...
    Hier mal ein Wechsellicht zwischen PortD 5 und PortD 6. Der Taster liegt auf PinD2, Pulldown, geschlossen auf High:

    Code:
    $regfile = "m32def.dat"
    $crystal = 8000000
    $framesize = 30
    $hwstack = 30
    $swstack = 30
    
    $asm
    
    
    ldi r16, &b01100000
    Out Ddrd , R16
    ldi r16, &b01000000
    Out Portd , R16
    
    Lop:
    sbic Pind , 2
    rcall Invled
    rjmp lop
    Invled:
    ldi r16, &b00100000
    sbis pind,6
    ldi r16, &b01000000
    Out Portd , R16
    Loslassen:
    sbic pind,2
    rjmp Loslassen
    ret
    $end Asm
    
    End
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    Hallo Leute,

    erstmal vielen Dank für eure Antworten.
    Aber ich hab mich grad soooo stark aufgeregt!

    Der einzige Fehler in meinem Programm ist der, dass ich im Mainloop (lop)
    Code:
    Lop:
    sbis pina , 0
    rjmp taster_an
    rjmp lop
    anstatt

    Code:
    Lop:
    sbis pina , 0
    rcall taster_an
    rjmp lop
    geschrieben habe.
    Der einzige Fehler war also das "RJMP" ...
    Kann mir jemand erklären, warum ich hier "RCALL" benutzen muss??

    Gruß
    Chris

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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