Hallo,
da jetzt mein Studio 4 arbeitet habe ich angefangen mein erste Projekt
umzusetzen.
Einen Tiny2313, der über 5LEDs dual bis 31 zählt.
Wenn man den Taster drückt, geht er immer ein Stück weiter.
5 Bit daher, weil ich nur noch 5 LEDs habe.
Im Simulator funktioniert das Programm schon.
Mein ISP ist noch nicht fertig.
1
.include "tn2313def.inc"
2
;5-Bit Rechner von Sören Timm
3
;
4
;16.02.2010
5
6
7
ldi r16, 0b11111111 ;PortB -> Ausgang
8
out DDRB, r16
9
10
ldi r16, 0b00000000 ;PortD -> Eingang
11
out DDRD, r16
12
13
ldi r16, 0b11111111 ;PortD -> Pullup an
14
out PORTD, r16
15
16
ldi r16, 0b00000000 ;r16 = 0
17
ldi r17, 0b00000001 ;r17 = 1
18
ldi r19, 0b00011111 ;r19 = 31
19
20
loop:
21
loop2:
22
loop3:
23
in r16,PIND ;r16 = PIND
24
cpse r16,r17 ;Springe wenn r16 u. r17 gleich
25
rjmp loop3 ; -> loop3
26
27
add r18,r17 ;r18 + r17
28
out PORTB,r18 ;r18 -> PortB -> LEDs
29
cpse r18,r19 ;Springe wenn r18 u. r19 gleich
30
rjmp loop2 ; -> loop2
31
32
ldi r18,0 ;r18 = 0
33
rjmp loop ; -> loop
Ich schätze nur, das ich den Finger nicht schnell genug vom Taster
bekomme, und er schon 100 mal bis 31 gezählt hat.
Wie kann ich in ASM den AVR zum warten bringen(ähnlich wie in Basic Wait
1s)?
Das das Programm nicht elegant ist, ist mir klar, es ist ja auch mein
Erstes.
Über Hilfe würde ich mich sehr freuen!
Danke im Voraus!
MfG
Sören Timm
> Wie kann ich in ASM den AVR zum warten bringen(ähnlich wie in Basic Wait
1s)?
Es gibt zwei Möglichkeiten:
1. Eine Warteschleife, für die du dir ausrechnen musst, wie oft sie
durchlaufen wird, bis eine Sekunde rum ist.
2. Nimm einen Timer, auf dessen Ende du wartest.
Wenn dir das zu aufwändig ist, nimm C (oder wie bisher Basic).
Zu aufwändig ist mir das nicht, ich kann C uns Basic, will jetzt aber
Assembler anfangen, weil es näher an der Hardware ist.
Für dieses Programm muss ich doch kein Externes Quarz dran hängen, da es
nicht auf genaues timing ankommt, oder?
Habe für eine Schleife einen Theard gefunden.
Danke für deine Hilfe
Wenn du Assembler willst kannst du auch hier schauen.
Da gibt es auch Zeitschleifen.
http://www.avr-asm-tutorial.net/avr_de/index.html
Fur eine Zeitschleife auch mit Timer brauchst du
keinen Quarz. Der µC bzw. der Timer braucht einen Takt
woher auch immer. Es ist dann eine Frage der Genauigkeit
und der Geschwindigkeit.
avr
Hallo,,
ich kann zwar kein Assembler, aber wie sieht es denn mit einer
vernünftigen Tastenentprellung über einen Timer aus?
Die benötigt keine Wartezeiten und blockiert somit nicht unnötig die
CPU. Ausserdem man kann auf die steigende oder fallende Flanke eine
Aktion starten.
Frank
merkt man am programm dass du aus der C Ecke kommst.
In Assembler kannste das Programm noch an vielen Stellen optimieren,
wenn du mal Übung hast, könnte z.B. so aussehen:
clr r16
loop:
sbic PIND, 0 ;wenn Taster = gedrückt(0), überspringe nächsten Befehl
rjmp loop ;zurückspringen
button: ;Taster gedrückt
inc r16 ;zähle hoch
sbrc r16, 4 ;wenn im Zählwert bit5 gesetzt ist (=32),
clr r16 ;setze auf null
wait_button_release: ;warten bis taster nicht mehr gedrückt
sbis PIND, 0
rjmp wait_button_release
rjmp loop
Gibt noch andere Alternativen, was ich dir aber empfehlen würde, benenne
deine Sprungmarken und Register so um, dass du auch verstehst, wofür sie
stehen.
Sobald du mal ein größeres Projekt mit Assembler machst, findest du dich
sonst nicht mehr zurecht.
Viel Spaß noch :-)
Hi,
zum Entprellen könnte man vor "dem wait_button_release:" noch eine
kleine Warteschleife einbauen. (für Taster... vielleicht 50 ms?)
das "sbrc r16, 4 ;wenn im Zählwert bit5 gesetzt ist (=32),"
würde ich persönlich durch eine Abfrage auf 32 ersetzen. Damit weiß ich
auch später noch was ich da tun wollte.
(Ja ich weiß, das benötigt einen Befehl mehr: cmp + breq)