Forum: Mikrocontroller und Digitale Elektronik 1. Projekt 5Bit-Rechner


von Sören T. (stimmy)


Angehängte Dateien:

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

von Malte _. (malte) Benutzerseite


Lesenswert?

> 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).

von Sören T. (stimmy)


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

von avr (Gast)


Lesenswert?

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

von Sören T. (stimmy)


Lesenswert?

Was haltet ihr von meiner Version?
1
  CLR R1
2
  CLR R16
3
warte:
4
  DEC R1
5
  CPSE R1,R2
6
  RJMP warte

Er braucht genau 510µs zum durchlaufen.

Man kann mit LDI ja nur alle Register über 16 "hurtig" setzen.
Muss man denn den Umweg über
1
ldi r16, xyz
2
mov r1,r16
machen?

von Purzel H. (hacky)


Lesenswert?

Das AVRStudio hat doch einen Simulator...

von Sören T. (stimmy)


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

von Frank B. (frank501)


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

von Flo (Gast)


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 :-)

von ich (Gast)


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)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.