PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche Hilfe, würde diese "primitive" Schaltung s



MartinNSU
13.04.2008, 18:30
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

Gock
14.04.2008, 16:03
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ß

Besserwessi
14.04.2008, 17:13
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.