1. Projekt 5Bit-Rechner

OP #1557462
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:
Persönliche Seite
> 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).
OP
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
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?
OP
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.