www.mikrocontroller.net

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


Autor: Sören T. (stimmy)
Datum:
Angehängte Dateien:
  • preview image for a.png
    a.png
    10,7 KB, 216 Downloads

Bewertung
0 lesenswert
nicht 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.
.include "tn2313def.inc"
;5-Bit Rechner von Sören Timm
;
;16.02.2010


ldi r16, 0b11111111           ;PortB -> Ausgang
out DDRB, r16

ldi r16, 0b00000000           ;PortD -> Eingang
out DDRD, r16

ldi r16, 0b11111111           ;PortD -> Pullup an 
out PORTD, r16

ldi r16, 0b00000000           ;r16 = 0
ldi r17, 0b00000001           ;r17 = 1
ldi r19, 0b00011111           ;r19 = 31

loop:
loop2:
loop3:
   in r16,PIND              ;r16 = PIND
   cpse r16,r17             ;Springe wenn r16 u. r17 gleich
   rjmp loop3               ; -> loop3

   add r18,r17              ;r18 + r17
   out PORTB,r18            ;r18 -> PortB -> LEDs 
   cpse r18,r19             ;Springe wenn r18 u. r19 gleich
   rjmp loop2               ; -> loop2

   ldi r18,0                ;r18 = 0
   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

Autor: Malte __ (malte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Sören T. (stimmy)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sören T. (stimmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was haltet ihr von meiner Version?
  CLR R1
  CLR R16
warte:
  DEC R1
  CPSE R1,R2
  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
ldi r16, xyz
mov r1,r16
machen?

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das AVRStudio hat doch einen Simulator...

Autor: Sören T. (stimmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das Programm jetzt so aufgebaut:
.include "tn2313def.inc"
;5-Bit Rechner von Sören Timm
;
;16.02.2010


ldi r16, 0b11111111           ;PortB -> Ausgang
out DDRB, r16

ldi r16, 0b00000000           ;PortD -> Eingang
out DDRD, r16

ldi r16, 0b11111111           ;PortD -> Pullup an 
out PORTD, r16

clr r16                       ;r16 = 0
ldi r17, 0b00000001           ;r17 = 1
ldi r19, 0b00011111           ;r19 = 31
ldi r20, 0b00000110           ;r20 = 6

loop:
loop2:
loop3:
   in r16,PIND              ;r16 = PIND
   cpse r16,r17             ;Springe wenn r16 u. r17 gleich
   rjmp loop3               ; -> loop3

loop4:
   add r21,r17              ;r21 + r17
   cpse r20,r21             ;Springe wenn r20 u. r21 gleich
   rjmp loop4               ; -> loop4

   clr r21
   add r18,r17              ;r18 + r17
   out PORTB,r18            ;r18 -> PortB -> LEDs 
   cpse r18,r19             ;Springe wenn r18 u. r19 gleich
   rjmp loop2               ; -> loop2

   ldi r18,0                 ;r18 = 0
   rjmp loop                ; -> loop



      

Autor: Frank B. (frank501)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.