glaza Δημοσ. 20 Ιανουαρίου 2010 Δημοσ. 20 Ιανουαρίου 2010 Καλησπέρα παιδιά, θέλω να δημιούργησω ένα συγκεκριμένο χρόνο καθυστέρησης για το πρόγραμμα μου αλλά δυστηχώς το βιβλίο που έχω δεν εξηγεί καθόλου καλά στα παραδείγματα του πως να δημιουργώ τετοιες ρουτίνες... πχ : delay20ms: ldi r21, 31 delay1: ldi r20, 255 delay2: nop nop nop nop nop nop nop dec r20 brne delay2 dec r21 brne delay1 ret αυτό αν γίνεται αναλυτικά να μου το εξηγήσει κάποιος για να το καταλάβω πλήρως. πώς δουλεύει ακριβώς και τι πολλαπλασιασμόυς θα κάνει στους βρόγχους... Thanks in advance
HalfAsleep Δημοσ. 20 Ιανουαρίου 2010 Δημοσ. 20 Ιανουαρίου 2010 Το μονο που κανει το συγκεκριμενο κομματι κωδικα ειναι να εκτελει ενα διπλο βροχο (οχι βρογχο, αυτο το βρισκεις στα πνευμονια) απο NOPs (no-operation) ωστε να καθυστερησει λιγο η εκτελεση του κωδικα που ακολουθει. Το ποσες φορες εκτελουνται δες το σαν ασκηση κατανοησης... ΥΓ. Δεν εκτελει πολλαπλασιασμους. Διαβασε λιγο AVR assembly για να δεις τι κανει καθε μια απ'τις εντολες.
glaza Δημοσ. 20 Ιανουαρίου 2010 Μέλος Δημοσ. 20 Ιανουαρίου 2010 Ναι ρε συ έχω διαβάσει avr assembly και ξέρω τι κάνουν οι εντολές...απλά όταν κάνω τις πράξεις για να επαληθεύσω οτι θα κάνει 20ms delay με f=4Mhz, δλδ 80000 κύκλους μηχανής μου βγαίνει άλλο νούμερο..κάτι ξεχναω-κάνω λάθος, γιαυτό θέλω καποιος να μου το εξηγήσει...
GCMH Δημοσ. 20 Ιανουαρίου 2010 Δημοσ. 20 Ιανουαρίου 2010 Κοίτα το σκεπτικό... Ένας κύκλος εντολής δεν χρειάζεται 1/4000000=0,00000025 sec για να εκτελεστεί; Που σημαίνει 0,00000025 sec η μια NOP καθώς και η μια DEC. Ένα κύκλο θέλουνε. Συνεπώς ο εσωτερικός βρόχος κάνει 8Χ0,00000025=0,000002 sec. Ωραία; Για λόγους απλότητας, αν και θα έπρεπε, δεν θα περιλάβουμε τις άλλες εντολές όταν βγαίνουμε από τον εσωτερικό βρόχο. Το αφήνω για άσκηση για εσένα! Πάμε στο τελικό σημείο... Ο εσωτερικός βρόχος θα εκτελεστεί 255Χ31=7905 φορές. 7905Χ0,000002 sec=0,01581 sec δηλαδή 15-16 msec... Στην πράξη θα είναι λίγο παραπάνω για λόγους που εξήγησα πιο πριν.
glaza Δημοσ. 20 Ιανουαρίου 2010 Μέλος Δημοσ. 20 Ιανουαρίου 2010 Φίλε GCMH, δεν θέλω απλότητα, θέλω αναλυτικά να συμπεριλάβεις και τις εντολές branch και ldi στους κύκλους μηχανής...θέλω να δώ ακριβώς πόσους κύκλους μηχανής θα εκτελέσει αυτή η delay..έτσι όπως το εξηγείς με τους βρόχους και του πολ/σμους το καταλαβαίνω πολύ καλά..!!! συμπεριέλαβε αν μπορείς και τις άλλες εντολές..
StavrosD Δημοσ. 20 Ιανουαρίου 2010 Δημοσ. 20 Ιανουαρίου 2010 Υπάρχει έτοιμη η εντολή στον AVR void delay_us(unsigned int n) void delay_ms(unsigned int n) Μην ξεχάσεις το header "DELAY.h". Περιττό να σου πω ότι πρέπει να έχεις απενεργοποιήσει τα interrupt προσωρινά καθώς δεν τα παγώνει.
bxenos Δημοσ. 20 Ιανουαρίου 2010 Δημοσ. 20 Ιανουαρίου 2010 Και φυσικά με το development tool/debugger της atmel μπορούν να μετρηθούν πρακτικά οι κύκλοι/χρόνος (για τεμπέλικες λύσεις ή για επιβεβαίωση αποτελεσμάτων)
glaza Δημοσ. 21 Ιανουαρίου 2010 Μέλος Δημοσ. 21 Ιανουαρίου 2010 προφανώς και δεν χρησιμοποιώ timer γιατί στο project δεν επιτρέπεται, αλλιώς θα το είχα κάνει...εκτιμώ τις προτάσεις σας a lot αλλά ήταν πολύ συγκεκριμένο αυτό που ρώτησα...αν το γνωρίζετε πεστε το...και επίσης γίνεται μόνο σε assembly να γράφω και όχι σε αλλη γλώσσα..thanks in advance
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.