-
        

Ergebnis 1 bis 3 von 3

Thema: Brauche Hilfe, würde diese "primitive" Schaltung s

  1. #1

    Brauche Hilfe, würde diese "primitive" Schaltung s

    Anzeige

    Hi ihr,

    es tut mir leid das ich euch mit dieser Kleinigkeit, für mich
    aber eine Herrausforderung belästige.

    Ich muss ein kleines Programm für einen ATMEL ATMege16 in Assembler
    schreiben, das auf Knopfdruck des Tasters 1 auf der ATMEL STK500 Platine
    die LED 1,2,3 und 4 zum leuchten bringt.

    Wenn man die Taste 2 Drückt soll LED 5,6,7 und 8 angehen.

    Würde dies so funktionieren wie ich es unten geschrieben habe?

    Würde mich sehr freuen wenn ihr mir weiterhelfen könntet, ich muss mir
    den Einstieg selbst erarbeiten, und dies ist mein Ergebnis...

    Mit freundlichen Grüßen und voller hoffen!







    ;************************************************* *****************************
    ;************************************************* *****************************

    ;Geschrieben von Martin
    ;Datum 2008-04-13
    ;version 1.0
    ;file safe as:
    ;for AVR: ATMega16
    ;clock frequency 8MHz

    ;************************************************* *****************************
    ;Program function
    ;
    ;
    ;
    ;************************************************* *****************************

    .device ATmega16 ;teilt dem Compiler den Prozessortyp mit
    .nolist ;Programmcode nicht in Logfile aufnehmen
    .include "m16def.inc" ;include file ist die Atmel Mega Definition

    ;===============
    ;Declarations:

    .def temp = r16

    ;===============
    ;===============
    ;Start Programm

    rjmp Init ;Erste Zeile vom Programm

    ;==============
    Init:

    ldi temp, 0b00000000 ;konfiguriert als Input(da 0-7 alles 0)
    out DDRD,temp

    ldi temp, 0b11111111 ;konfiguriert als Output(da 0-7 alles 1)
    out DDRA, temp
    out DDRB, temp
    out DDRC, temp

    out PortD, temp ;PullUp`s für PortD
    out PortA, temp
    out PortB, temp
    out PortC, temp

    ;=============
    ;Hauptprogramm beginnt hier:

    Start:
    sbis PIND,0 ;Springe, wenn Bit 0 im Port D Eins ist
    rcall Lampe14 ;Wenn Gedrückt,also oben Null,SpringeProgramm Lampe14

    sbis PIND,1 ;Springe, wenn Bit 1 im Port D Eins ist
    rcall Lampe48 ;Wenn Gedrückt, also oben Null,Springe Programm Lampe48



    Lampe14:
    in temp,PortA ;Lese aktuellen Zustand von Port B
    andi temp, 0b11110000 ;Lösche Bit 0 bis 3 mit UND Befehl
    out PORTA, temp ;Schreibe ergebnis zurück
    ret ;Springe zurück von dort wo du kommst.

    Lampe48:
    in temp, PortA
    andi temp, 0b00001111 ;Lösche Bit 4 bis 7 mit UND Befehl
    out PORTA,temp ;Schreibe ergebnis zurück
    ret ;Springe zurück von dort wo du kommst.





    rjmp START ;springt wieder an den Start

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.111
    Habe nur schnell drüber gesehen.
    Mein letztes Assembler Programm ist schon ne Weile her, aber hier fehlt definitiv die Initialisierung des Reset-Vektors und des Stackpointers.
    Darüber hinaus wird es nicht funktionieren, weil ein Sprungbefehl fehlt, der bei Nichtausführen von "rcall Lampe48" wieder zu Start springt. Sonst wird Lampe14 und 48 jedes Mal ausgeführt.
    Die LEDs sollen also nur solange brennen, wie man den Taster drückt?
    Lampe14: in temp, PortA liest nicht Port B!
    Wenn Du die Pullups aktivierst, müsste die Logik eigentlich umgekehrt sein: Drücken=0, Loslassen =1.
    Gruß

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Um die Interrruptvectoren braucht man sich nicht kümmern, das geht auch ohne, denn vom start weg sind Interrupts erst mal blockiert. Der Stack Pointer ist nötig. Sonst ist das wesentlich wohl schon gesagt.

Berechtigungen

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