1. Projekt 5Bit-Rechner

OP #1557462
Lesenswert?

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
Angehängte Dateien:
OP #1557534
Lesenswert?

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
OP #1557603
Lesenswert?

Ich habe das Programm jetzt so aufgebaut:
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
clr r16                       ;r16 = 0
17
ldi r17, 0b00000001           ;r17 = 1
18
ldi r19, 0b00011111           ;r19 = 31
19
ldi r20, 0b00000110           ;r20 = 6
20

21
loop:
22
loop2:
23
loop3:
24
   in r16,PIND              ;r16 = PIND
25
   cpse r16,r17             ;Springe wenn r16 u. r17 gleich
26
   rjmp loop3               ; -> loop3
27

28
loop4:
29
   add r21,r17              ;r21 + r17
30
   cpse r20,r21             ;Springe wenn r20 u. r21 gleich
31
   rjmp loop4               ; -> loop4
32

33
   clr r21
34
   add r18,r17              ;r18 + r17
35
   out PORTB,r18            ;r18 -> PortB -> LEDs 
36
   cpse r18,r19             ;Springe wenn r18 u. r19 gleich
37
   rjmp loop2               ; -> loop2
38

39
   ldi r18,0                 ;r18 = 0
40
   rjmp loop                ; -> loop
#1557626
Lesenswert?

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
Gast #1557632
Lesenswert?

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 :-)
Gast #1557819
Lesenswert?

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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren