PDA

Επιστροφή στο Forum : ATmega16 - interrupts



supersonic
28-11-06, 18:35
Καλησπέρα σε όλους

Είμαι φοιτητής και έχω να κάνω εργασία με τον μικροελεγτή AT mega16 σε γλώσσα assembly
Μου ζητήθηκε να εργαστώ με τα interrupts του μικροελεγτή και ψάχνω να βρω πληροφορίες
για το τι ακριβώς είναι αυτά,ποιες οι διαφορές τους από τις PORTS,και αν για τα pins των interrupts
οι εντολές στην assembly είναι διαφορετικές από αυτές των Ports .Δεν έχω ιδιαίτερη εμπειρία
και κάθε βοήθεια για το τι γενικα είναι τα θα μου ήταν χρήσιμη.
Ευχαριστώ όλους!!

pet
28-11-06, 22:43
http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf

chip
29-11-06, 13:26
Όταν πας σε μία καφετέρεια θα μπορούσε να υπάρχει μια γκαρσόνα από πάνω σου (ξέρω το καλύτερο) και οτι θες να σε εξυπηρετεί. Αυτό θα κόστιζε όμως πόλύ. Για το λόγο αυτό υπάρχει μία γκαρσόνα για πολλά άτομα και όταν την χρειαστεί κανείς την καλεί και τον εξυπηρετεί.
Κάτι ανάλογο είναι και τα interupt.
Ας υποθέσουμε οτι έχουμε έναν μικροελεγκτή ο οποίος εκτελεί κάποια διαδικασία, και για να ελέγχεται το μηχάνημα υπάρχει και ένα πληκτρο που δίνει στο μικροελεγκτή την εντολή να κάνει κάποια δουλειά.
Στην περίπτωση της μίας γκαρσόνας ανα πελάτη ο μικροελεγκτής θα πρέπει να ελέγχει συνεχώς μέσω λογισμικού αν πατήθηκε πλήκτρο και αν πατηθεί να δράσει ανάλογα. Κάτι τέτοιο όμως ξοδεύει επεξεργαστική ισχύ που σε κάποιες περιπτώσεις είναι επιτρεπτό αλλά σε κάποιες άλλες όχι.
Στην δέυτερη περίπτωση θα μπορούσε ο μικροελεγκτής να εκτελεί κανονικά το πρόγραμμά της εφαρμογής και να μην δίνει καμία σημασία στο πλήκτρο. Όμως το πλήκτρο είναι συνδεδεμένο με το pin του interupt. Αν ενεργοποιηθέι το pin αυτό, ο μικροελεγκτής θα σταματήσει την εκτέλεση του προγράμματος που εκτελεί, και θα κάνει μία διακλάδωση σε ρουτίνα προγράμματος η οποία εξυπηρετεί το Interupt (δηλαδή θα εκτελέσει την ρουτίνα που πρέπει να εκτελείται όταν πιέζετε το πλήκτρο). Όταν ολοκληρώσει την ρουτίνα αυτή θα επιστρέψει στο σημείο που είχε αφήσει το κυρίος πρόγραμμα και θα συνεχίσει κανονικά.
Για να γίνει αυτό στον ATMEL πρέπει να ενεργοποιήσεις τα κατάλληλα bit των καταχωρητών που ελέγχουν την λειτουργία interupt ώστε να ενεργοποιηθεί η δυνατότητα αυτή. Επίσης υπαρχει μία διεύθυνση στην οποία (θα την δεις στο datasheet) γίνεται η διακλάδωση μετα το Interupt. Κανονικά εκεί θα βάλεις μια εντολή jump (rjmp) και θα στείλεις την εκτέλεση του προγράμματος εκει που θα γράψεις την ρουτίνα εξυπηρέτησης Interupt. Στο τέλος της ρουτίνας αυτής θα επιστρέψεις στο κυρίως πρόγραμμα με την εντολή reti. Και φυσικά μην ξεχάσεις να κάνεις Push και Pop τους καταχωρητές που θα χρησιμοποιήσεις μέσα στη ρουτίνα.

supersonic
29-11-06, 23:21
Σ'ευχαριστώ chip.Αρκετά διαφωτιστικά όσα έγραψες.

Η εργασία που έχω ακριβώς να κάνω είναι η ακόλουθη:
Μου δώθηκε ένας οπτικοηλεκτρονικός κωδικοποιητής και συγκεκριμένα ο mom20 της megatron http://www.p3america.com/pp/mom20.htm .
Αυτός όπως φαίνεται και στην παραπάνω σελίδα σε κάθε στροφή ενός άξονά του παράγει παλμούς πχ.για στροφή 20 μοιρών παράγει 30 παλμούς. Οι παλμοί βγαίνουν από δύο διαφορετικούς ακροδέκτες του κωδικοποιητή με μια καθηστέρηση φάσης, έτσι ώστε αν γιρίσουμε τον άξονα δεξιόστροφα εμφανίζεται πρώτα ο ένας παλμός και μετά ο άλλος.Αν τον γυρίσουμε αριστερόστροφα το αντίθετο. Εγώ τώρα πρέπει να συνδέσω τους ακροδέκτες αυτούς όπως μου ζητήθηκε στα interupts του μικροελεγχτή μου, επειδή οι παλμοι που βγαίνουν είναι της τάξης των μs και δεν μπορώ να τους συνδέσω σε απλά ports. Και κατόπιν σε μια οθόνη να φαίνεται πόσες μοίρες στροφή έγινε και προς ποια κατεύθυνση.

Αυτό που προσπαθώ να καταλάβω είναι με ποιον τρόπο θα μπορέσω μέσα στην υπορουτίνα του interupt να μετρήσω όλους τους παλμούς ,ώστε να αποφανθώ για τις μοίρες. Αν καλέσω την υπορουτίνα καθώς ανιχνεύεται ο πρώτος παλμός δεν θα σταματίσει η υπορουτίνα όταν η τάση γίνεται και πάλι 0?Με τον τρόπο αυτό όμως πως θα ανιχνευτούν οι υπόλοιποι παλμοί?

Ακόμα εφόσων πρέπει να συνδέσω τους δύο ακροδέκτες του κωδικοποιητή ,σε δύο ακροδέκτες για interupts του μικροελεγχτή πρέπει να καλέσω δύο υπορουτίνες ώστε να βρω την κατεύθυνση περιστροφής?

Ευχαριστώ για κάθε βοήθεια και συγνώμη αν είναι δυσνόητα όσα ρωτάω αλλα έχω μπερδευτεί στ'αλήθεια!! :)

pet
30-11-06, 00:06
ξεκίνα με τα ιντεραπτ . άνοιξε το μανιουαλ και βρες τα εξτερναλ ιντεραπτς.
εσυ χρησημοποιήσε το ιντ0 για παράδειγμα.

κάνε εκεί διάφορα και μάθε για τα ρολόγια να εξοικιωθείς

τώρα να ξέρεις ότι δεν είναι και το πιο απλο να παίζεις με παλμούς των μ σεκ
πχ αν σου σκάει ένα ιντερραπτ στο φόλλινγκ εντζ και το επόμενο έρθει σε 5 μσεκ
ας πούμε εσύ πρέπει να προλάβεις να κάνεις αυτά που θές με 5 μσεκ (μέσα στην ρουτίνα αι ες αρ)

τώρα με ρολόι 4 μεγαχέρτζ έχουμε 0.250 νάνο σεκ κύκλους, δηλαδή τα 5 μσεκ είναι 20 κύκλοι.

θα προλάβεις;??

επίσης δεν καταλαβαίνω το σημείο με τους παλμούς που λες πρώτα ο ένας και μετά ο άλλος

δηλαδή σε τι διαφέρουν οι παλμοί; στην χρονική διάρκεια ? πιθανότατα θα χρησημοποιήσεις τάιμερς
για να μετράς τους χρόνους....

δεν εχεις πει σε τι θα γράψεις, σι ή ασσέμπλυ?

σορρυ δεν εχω αγγλικα

Gant
30-11-06, 09:14
...
επίσης δεν καταλαβαίνω το σημείο με τους παλμούς που λες πρώτα ο ένας και μετά ο άλλος
δηλαδή σε τι διαφέρουν οι παλμοί; στην χρονική διάρκεια ? πιθανότατα θα χρησημοποιήσεις τάιμερς
για να μετράς τους χρόνους....


Ο κωδικοποιητής του έχει δύο εξόδους. Ανάλογα με τη φορά περιστροφής πρώτα αλλάζει τάση η μία έξοδος και μετά η άλλη.
Timers σε αυτή την περίπτωση δεν χρειάζονται.

Στη θέση σου θα έλεγχα την αλλαγή τάσης μίας εξόδου, πχ. την αύξηση τάσης (rising edge) της εξόδου Α με interrupt.
Στην υπορουτίνα του interrupt προσθέτεις ένα βήμα αν η έξοδος B είναι 0V και αφαιρείς ένα αν είναι 5V ή αντίστροφα.
Η μία έξοδος του κωδικοποιητή σου πάει λοιπόν σε είσοδο interrupt και η άλλη σε απλή είσοδο του atmel.

Δεν ξέρω λεπτομέρειες για τον Αtmel, γιατί είμαι PICάκιας ! :lol:

Ελπίζω να βοήθησα.

chip
30-11-06, 11:49
Το όλο θέμα δεν είνα ιδιαιίτερα εύκολο. Πιθανόν να μη γίνεται με τον συγκεκριμένο μικροελεγκτή, ή να γίνεται εντελώς οριακά. Για το λόγο αυτό θα πρέπει να μάθεις ποια είναι η μέγιστη συχνότητα περιστροφής που επιθυμέι ο καθηγητής ώστε να εκτιμίσεις αν θα ανταποκρίνεται ο μικροελεγκτής. Ύστερα πρέπει να μάθεις αν σου επιτρέπει να προσθέσεις μερικές πύλες και FF ώστε να εξάγεις το σήμα clk (παλμοί από μετακίνηση) και το σήμα φοράς περιστροφής ή θα πρέπει να τα κάνει αυτά ο μικροελεγκτής. Επίσης θα πρέπει να μάθεις αν η έξοδος του κωδικοποιητή είναι καθαρή απο glitches ή θα πρέπει να την καθαρίσεις εσύ με κάποιο κυκλωματάκι.
Το όλο θέμα έχει βαρύνει γιατί δεν μπορείς να συνδέσεις τον κωδικοποιητή στον timer και να μετρά αυτός παλμούς και περιοδικά ο μικροελεγκτής να πέρνει την μέτρηση και να την απεικονίζει. Αυτό θα γινόταν πανεύκολα αν είχε επιλεχθεί ένας μικροελεγκτής με ενσωματωμένο κύκλωμα για συνεργασία με οπτικό κωδικοποιητη. (υπάρχουν μικροελεγκτές που στηρίζουν τέτοια δυνατότητα. Ή έστω μικροελεγκτής με UP/DOWN timer.
Βέβαια αν η συχνότητα περιστροφής είναι μικρή τότε γίνονται όλα με Software. θα μπορούσε ουτε καν interupt να μην υπάρχει. Παράδειγμα για κάτι τέτοιο υπάρχει σε application note της microchip που χρησιμοποιεί μικροελεγκτή PIC16c54 ή PIC16C56 για χρήση σε ποντίκι. Καλό είναι να του ρίξεις μια ματιά (οι PIC16C5X δεν έχουν καθόλου interupt)
Ένα άλλο θέμα είναι οτι δεν είναι απαραίτητο σε κάθε μετακίνηση να ανανεωνεται αμέσως η ένδειξη της οθόνης.
Η οθόνη θα πρέπει να ανανεώνεται απλά λίγες φορές το δευτερόλεπτο αφού ετσι κι αλλιώς το ανθρωπινο μάτι δεν βλέπει πιο γρήγορες μεταβολές.

supersonic
30-11-06, 19:18
Θα γράψω σε assembly ΡΕΤ(το γράφω και στην αρχή!). Έχω διαβάσει το μάνουαλ και αυτά στο σαιτ που μου είπες αλλα γενικά δύσκολα βρίσκω παραδείγματα προγραμματισμού στα οποία χρησιμοποιούνται Interupt και δεν έχω ακόμη μια ξεκάθαρη εικόνα για το πως δουλεύουν.
Πάντως σκεφτόμουν να κάνω κάτι τέτοιο που είπε ο Gant για να δω αν είναι δεξιόστροφη ή αριστερόστροφη η φορά. Έχεις καμοια ιδέα τώρα μήπως Gant και στο πως θα μπορέσω να μετρήσω και τους παλμούς και να τους απεικονήσω σε μοίρες? :) Σε μία πλήρη περιστροφή 360 μοιρών ο κωδικοποιητής παράγει 220 παλμούς.

Chip θα ρωτήσω αύριο αυτά που μου είπες για τις συχνότητες και θα σου πω, πάντως απ'όσο ξέρω επειδή οι έξοδοι του κωδικοποιητή είναι ανοιχτού συλλέκτη βάλαμε αντιστάσεις pullup για να μην έχουμε θόρυβο.Δεν ξέρω αν αυτό επηρεάζει κάτι στις εισόδους του μικροελεγτή...
Θα ρωτήσω όμως στα σίγουρα για όλα αυτά και θα σου απαντήσω.

Ευχαριστώ για κάθε βοήθεια!!

gsmaster
30-11-06, 22:21
Τι ακριβώς είναι η assembly ΡΕΤ ??? κάποια βελτιωμένη έκδοση της assembly για AVR? Καλύτερα θα ήταν να χρησιμοποιήσεις την κλασσική assembly, γιατί θα βρείς περισσότερη βοήθεια και περισσότερα παραδείγματα.

Για να κάνεις τους παλμούς σε μοίρες, θα βρείς ένας παλμός πόσες μοίρες είναι, και μετά θα πολλαπλασιάζεις τους παλμούς με τις μοίρες/παλμό.

εφόσον έχεις 220παλμούς σε 360 μοίρες 360/220=1,63636363636363... μοίρες/παλμό.
Άμα μετρήσες 20 παλμούς η γωνία θα είναι 20*1,63636363=32,727272..... μοίρες.

Τώρα το πώς θα βάλεις τα δεκαδικά στο πρόγραμμα και ειδικά στην assembly...

pet
30-11-06, 23:30
loool πατσίσαμε gmsaster χαχαχα (με τη γρεναδίνη)

gsmaster
01-12-06, 00:23
ωποοοο........ 8-[
:-# :-s :hammer:
Χρειάζομαι ύπνο επιγόντως....

Gant
01-12-06, 09:03
... Έχεις καμοια ιδέα τώρα μήπως Gant και στο πως θα μπορέσω να μετρήσω και τους παλμούς και να τους απεικονήσω σε μοίρες? :) Σε μία πλήρη περιστροφή 360 μοιρών ο κωδικοποιητής παράγει 220 παλμούς...

Ο αριθμος των παλμων/βημάτων αποθηκεύεται σε μιά μεταβλητή του επεξεργαστή σου. Όπως είδες και στην προηγούμενη απάντησή μου, η αλλαγή τάσης μίας εξόδου του κωδικοποιητή σου θα καλεί την υπορουτίνα Interrupt στον επεξεργαστή. Σε εκείνη την ρουτίνα θα κοιτάς τί τάση έχει η άλλη έξοδος και ανάλογα αυξάνεις ή μειώνεις το περιεχόμενο της μεταβλητής με τους παλμούς.

Όπως είπε και ο γσμάστερ, χρειάζεσαι μαθηματικές πράξεις για να βρεις τις μοίρες.
Στη θέση σου θα είχα μια μεταβλητή 16 μπιτ (0-65535) όπου θα αποθήκευα τη γωνία σε εκατοστά της μοίρας.
Δλδ. 0 -> 0 μοιρες, 100 -> 1 μοίρα, 35999 -> 359,99 μοίρες.

Για να βρεις λοιπόν τις μοίρες, προσθέτεις 164 (περίπου 1.63636363 * 100, σφάλμα 0.23%) στη μεταβλητή με τις μοίρες τόσες φορές, όσοι είναι οι παλμοί.

Καλή συνέχεια!

gsmaster
01-12-06, 22:23
Ακριβώς Gant δεν το ανέφερα αυτό με τον 16bit και τον πολλαπλασιασμό*100, για να έχει να σκεφτεί κάτι παραπέρα. Έτσι κι αλλιώς θα πρέπει να χησιμοποιήσει καταχωρητή μεγαλύτερο απο 8bit για να μπορεί να δουλέψει μοίρες πάνω απο 255...

Ένας άλλος τρόπος που είχα κάνει για να μετράω πανω απο το 255 όταν έγραφα σε assembly, ήταν να βάλω έναν καταχωρητή για κάθε ψηφίο και να προσθέτω κατα ένα, και αμα γίνει 10 να γίνει 0 και να αυξήσει κατα ένα το αριστερά του ψηφίο κτλ.... Αυτά παθαίνει όποιος θέλει assembly.

Willpowa
05-03-07, 00:03
ΧαιρετΩ!
Ηθελα να ρωτησω το εξης : Θελω να αποκωδικοποιησω εναν εισερχομενο συρμο με data rate 3.9Kb/s με τον ΑVR.Τα δεδομενα ειναι ΤΤL κωδικοποιημενα κατα Μαντσεστερ. Σκεφτηκα λοιπον να βαλω τα δεδομενα σαν εισοδο στο PinD2 (AT90s2313) που δινει την δυνατοτυτα ΙΝΤ0.Δηλαδη να φτιαξω ενα σεναριο που θα ενεργοποιται ιντεραπτ σε καθε φολινγκ ετζ και να δειγματολειπτει την εισοδο ΠΙΝ2.Δηλαδη να φευγει ο ελεγχος απο το κυριως προγραμμα και μολις δεχτει την πρωτη παρυφη να αρχισει δειγματοληψια. Εχω καταλαβει τον χειρισμο οταν εχουμε ιντεραπτ απο το χρηστη πχ με σουιτς ,αλλα θελω αυτο να γινεται αυτοματα..

τελος ο σειρμος πχ 32 μπιτ αφου αποθηκευται ,θα συγκρινεται με εναν αλλο προαποθηκευμενο κατα ποσο ειναι ομοιοι η μη,

Εχεte να προτεινετε κατι?Εχω υπολογισει το καθε μπιτ και ολοκληρος ο συρμος ποσο διαρκει,αλλα περα απο το ΙΝΤ0 και τις παραμετρους που πρεπει να ρυθμισω,μηπως να εβαζα και ενα χρονιστη απο τον Ταιμερ1 η 0..?εχω μπερδευτει λιγοSmile

Eyxaristv