THMMY.gr

Μαθήματα Κύκλου Ηλεκτρονικής & Υπολογιστών => AVR Εποχή => Topic started by: Kodi on February 19, 2017, 11:32:45 am



Title: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Kodi on February 19, 2017, 11:32:45 am
τόπικ για απορίες σε ασκήσεις μόνο
για παλιά θέματα υπάρχει αντίστοιχο τόπικ


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: lodi on June 14, 2017, 00:53:40 am
Γνωρίζει κανείς τι σημαίνει το σύμβολο << στο AVR ?
Ας πούμε σελ78 στο βιβλίο των ΜΙκρο2 λέει :
Code:
ldi temp, 1 <<INT0

Επίσης καμιά φορά βλέπω και κάτι τέτοιο :
Code:
ldi r16, (1 << CS22) | (1 <<OCF2A) | (1 << OCF2B) 

Τι σημαίνουν αυτά ;


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Goemon on June 14, 2017, 22:45:09 pm
Γνωρίζει κανείς τι σημαίνει το σύμβολο << στο AVR ?
Ας πούμε σελ78 στο βιβλίο των ΜΙκρο2 λέει :
Code:
ldi temp, 1 <<INT0

Επίσης καμιά φορά βλέπω και κάτι τέτοιο :
Code:
ldi r16, (1 << CS22) | (1 <<OCF2A) | (1 << OCF2B) 

Τι σημαίνουν αυτά ;

Το '<<' σημαίνει shift στα αριστερά. Τα INT0 κλπ είναι defined σταθερές στο .def αρχείο τα οποία δηλώνουν τη θέση του bit ΙΝΤ0 στον καταχωρητή του.

Αν δηλαδή θες στον GIMSK = [ INT0, INT1, INT2 ...] να θέσεις το bit ΙΝΤ2 σε ένα κάνεις 1<<ΙΝΤ2 = 1<<5 = 00100000.

Tο '|' είναι το λογικό or


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: lodi on June 15, 2017, 12:38:25 pm
και το 1 στο 1<<INT2 τι δείχνει ; Πόσες φορές θα γίνει η ολίσθηση στα αριστερά ; Και το INT2 μπορούμε να ξέρουμε τι τιμή έχει ;
 Επίσης 1<<5 δεν σημαίνει αριστερή ολίσθηση του 5 μια φορά, άρα του 0101 και συνεπώς θα γίνει 00001010 ?


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Goemon on June 15, 2017, 15:23:12 pm
και το 1 στο 1<<INT2 τι δείχνει ; Πόσες φορές θα γίνει η ολίσθηση στα αριστερά ; Και το INT2 μπορούμε να ξέρουμε τι τιμή έχει ;
 Επίσης 1<<5 δεν σημαίνει αριστερή ολίσθηση του 5 μια φορά, άρα του 0101 και συνεπώς θα γίνει 00001010 ?

όχι 1<<5 σημαίνει "αριστερή ολίσθηση του 1, 5 φορές".


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: lodi on June 15, 2017, 15:56:40 pm
και το INT2 γιατί έχει τιμή 5 ;


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: princess_of_the_dawn on June 15, 2017, 22:21:52 pm
Η απορία μου είναι η εξής:
Στα διανύσματα διακοπών για τον ΑΤμεγα128 το διάνυσμα νο 13 ($0018), έστω ότι εμείς  έχουμε θέσει μέσα στη διακοπή μι α μεταβλητή να αυξάνεται, κάθε φορά που γίνεται οποιαδήποτε σύγκριση η μεταβλητή μας αυξάνεται;
Θέλω να πώ, αν χρησιμοποιούμε τη μεταβλητή μας για να μετρήσουμε χ κύκλους από ένα γεγονός (έστω ότι έχουμε θέσει ο ένας κύκλος να μετράει 1'') και μετά θελουμε να μετρήσουμε ψ κύκλους από άλλο γεγονός, θα πρέπει να μηδενίσουμε προηγουμένως τη μεταβλητή;


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Goemon on June 15, 2017, 22:56:37 pm
Η απορία μου είναι η εξής:
Στα διανύσματα διακοπών για τον ΑΤμεγα128 το διάνυσμα νο 13 ($0018), έστω ότι εμείς  έχουμε θέσει μέσα στη διακοπή μι α μεταβλητή να αυξάνεται, κάθε φορά που γίνεται οποιαδήποτε σύγκριση η μεταβλητή μας αυξάνεται;
Θέλω να πώ, αν χρησιμοποιούμε τη μεταβλητή μας για να μετρήσουμε χ κύκλους από ένα γεγονός (έστω ότι έχουμε θέσει ο ένας κύκλος να μετράει 1'') και μετά θελουμε να μετρήσουμε ψ κύκλους από άλλο γεγονός, θα πρέπει να μηδενίσουμε προηγουμένως τη μεταβλητή;

1) Ο timer αρχίζει και αυξάνει σωστά?

2) Μετά από Χ κύκλους, θα φτάσει την τιμή OCRA (τιμή σύγκρισης) που έχεις αναθέσει κληθεί η διακοπή σου και η μεταβλητή σου θα αυξηθεί.

3) Σε αυτό το σημείο, ο timer είτε θα μηδενίσει και θα ξεκινήσει από την αρχή είτε θα συνεχίσει μέχρι να κάνει overflow και να ξεκινήσει από την αρχή. Εξαρτάται από ι έχεις βάλει στο TCCR

4) Την επόμενη φορά που θα φτάσει στο OCRΑ, θα έχουν περάσει άλλοι X κύκλοι, και μονο τότε θα ξανακληθεί η ISR

Δεν ξέρω αν σε κάλυψα, καθώς δεν κατανοώ ιδιαίτερα και την ερώτησή σου


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: princess_of_the_dawn on June 15, 2017, 23:13:32 pm
Ναι βασικά μόλις κατάλαβα ότι το έθεσα λάθος. :D

Η μεταβλητή αυξάνεται κάθε φορά που ο timer φτάνει στην τιμή που έχω αναθέσει στον OCRA (χ κύκλους).
Εγώ όμως θέλω να μετρήσω ψ δευτερόλεπτα (εστω ότι οι χ κύκλοι αντιστοιχούν σε 1 δευτερόλεπτο) άρα στην ουσία η μεταβλητή να φτάσει στο ψ. Η απορία μου είναι,

α) με κάθε σύγκριση η μεταβλητή αυξάνεται κατά 1 άρα για να μετρήσω την τιμή ψ θα πρέπει να κάνω ψ φορές σύγκριση ή η μεταβλητή αυξάνεται κατα 1 σε κάθε κύκλο και θα πρέπει να κάνω χ*ψ φορές σύγκριση;

β)με οποιαδήποτε σύγκριση, δηλαδή κάθε φορά που υπάρχει ένα cp/cpi η μεταβλητή αυξάνεται ή σε συγκεκριμένες περιπτώσεις;


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Goemon on June 16, 2017, 01:16:40 am
Ναι βασικά μόλις κατάλαβα ότι το έθεσα λάθος. :D

Η μεταβλητή αυξάνεται κάθε φορά που ο timer φτάνει στην τιμή που έχω αναθέσει στον OCRA (χ κύκλους).
Εγώ όμως θέλω να μετρήσω ψ δευτερόλεπτα (εστω ότι οι χ κύκλοι αντιστοιχούν σε 1 δευτερόλεπτο) άρα στην ουσία η μεταβλητή να φτάσει στο ψ. Η απορία μου είναι,

α) με κάθε σύγκριση η μεταβλητή αυξάνεται κατά 1 άρα για να μετρήσω την τιμή ψ θα πρέπει να κάνω ψ φορές σύγκριση ή η μεταβλητή αυξάνεται κατα 1 σε κάθε κύκλο και θα πρέπει να κάνω χ*ψ φορές σύγκριση;

β)με οποιαδήποτε σύγκριση, δηλαδή κάθε φορά που υπάρχει ένα cp/cpi η μεταβλητή αυξάνεται ή σε συγκεκριμένες περιπτώσεις;


Ρε

Ο μετρητής αυξάνει μόνος του. Δεν αυξάνεις εσύ τίποτα. Μετρά από μονος του από 0 μέχρι το 255 με συχνότητα πχ 1Hz

Όταν φτάσει στην τιμή 100 θα έχουν περάσει 100δευτερόλεπτα.

Όταν φτάσει στην τιμή 100 θα κληθει η ISR σύγκρισης μόνη της

Εσύ δεν συγκρίνεις τίποτα, δεν μετράς τίποτα. Μονο του τα κάνει, αυτή είναι η όλη υπόθεση. Όταν εκτελεστεί η ISR_COMP_A, θα ξέρεις το πρόγραμμά σου ότι πέρασαν 100 δευτερόλεπτα.


Η μεταβλητή που αυξάνεις εννοείς οτι είναι μία δικιά σου?


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: princess_of_the_dawn on June 16, 2017, 02:53:05 am
 Ναι εννοω οτι καλω το διανυσμα $0018 και τον βαζω να κανει iinc πχ τον r20.


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Goemon on June 16, 2017, 03:09:38 am
Ναι εννοω οτι καλω το διανυσμα $0018 και τον βαζω να κανει iinc πχ τον r20.

Όταν λες καλείς εννοεις κάνεις rjmp σωστά?


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: princess_of_the_dawn on June 16, 2017, 03:10:53 am
Σισισι


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Goemon on June 16, 2017, 03:15:46 am
Σισισι

a ok... Sorry κόλλησα άγρια. beep boop does not compute.

1) Η μεταβλητή σου θα αυξάνεται ΜΟΝΟ όταν ο timer γίνει ίσος με τον αριθμό που έβαλες στο καταχωρητή OCR. Όχι με κάθε συγκριση.

2) οχι σε καμία περίπτωση δεν ισχύει αυτό.

Δες ρε κανα εισαγωγικό στο youtube με τους timers ρε να νιώσεις, μην τσαλαβουτάς στο βιβλίο και στα θέματα απευθείας


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: princess_of_the_dawn on June 16, 2017, 03:21:25 am
Καλα ετσι πώς τα γραφω κι εγω πού να καταλαβεις... Ναι χμμ θα πρεπε μαλλον!
Σ ευχαριστω πολυ!


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: lodi on June 19, 2017, 23:12:25 pm
Γενικά όταν έχουμε ADC ή External Interrupt ή κάτι τέτοιο , πρέπει το αντίστοιχο Pin να το θέσουμε σαν είσοδο ή γίνεται αυτόματα ;


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: princess_of_the_dawn on June 19, 2017, 23:34:04 pm
ΑΝ κατάλαβα τί εννοείς, που δεν είμαι και πολύ σίγουρη, πρέπει στο .cseg να βάλεις ένα από τα διανύσματα που αντιστοιχούν σε external interrupts από το cheatsheet το οποίο μες στο πρόγραμμα να μηδενίζει τη σημαία Τ κάθε φορά που συμβαίνει η διακοπή. Από κει και πέρα πρέπει στους καταχωρητές EICRA και EIMSK να θέσεις τα bits που ενεργοποιούν τη διακοπή που έχεις όπως σου υποδεικνύει το cheatsheet.

εδιτ: αν εννοείς ότι οι διακοπές συνδέονται με καποιο PORT που σου δίνει, που μάλλον αυτό εννοείς, ναι πρέπει τα bits που συνδέονται με τη διακοπή να τα μηδενίσεις για να θέσεις το PORT ως είσοδο
δες πχ στην άσκηση του εργαστηρίου με το σηματοδότη, στο σχήμα που δίνει συνδέει τα bits 0-3 του PORTA με τα κουμπιά που αντιπροσωπεύουν την εξωτερική διακοπή και τα υπόλοιπα με κάποια από τα φανάρια
τότε εσύ πρέπει να θέσεις το μισό PORT ως είσοδο και το μισό ως έξοδο


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: lodi on June 20, 2017, 10:36:36 am
To 2o εννοούσα. Οκ, ευχαριστώ !  Μήπως χρειάζεται να κάνω enable και τις αντιστάσεις ; Δηλαδή εκτός από cbi DDRD,0 ξέρω εγώ να κάνω και sbi PortD,0 ?


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Indy on June 20, 2017, 13:10:07 pm
Τί είναι τα external interrupts? "Custom" interrupts του προγραμματιστή που τα προκαλεί αυτός μέσω software? Κι αν ναι πώς ορίζεις πότε θα προκαλούνται; Άντε με τα EICRA και EIMSK ορίζεις πχ ότι θα προκαλούνται με άνοδο του παλμού. Τί σημαίνει αυτό; Άνοδο του παλμού ποιανού πράγματος; πχ στο micro-compre.pdf στο θέμα 2 Σεπτ 2007 λέει ότι η πίεση του κουμπιού από το χρήστη θα διαβάζεται μέσω external interrupt.. και όντως θέτει ότι θα γίνεται (μέσω EICRA, EIMSK) στο rising edge (ποιανού πράγματος είπαμε?) και στο interrupt vector label ορίζει τί θα γίνεται όταν προκαλείται το interrupt.. πού ορίζει όμως πότε θα προκαλείται;


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Andromedas on June 20, 2017, 13:24:04 pm
Τί είναι τα external interrupts? "Custom" interrupts του προγραμματιστή που τα προκαλεί αυτός μέσω software? Κι αν ναι πώς ορίζεις πότε θα προκαλούνται; Άντε με τα EICRA και EIMSK ορίζεις πχ ότι θα προκαλούνται με άνοδο του παλμού. Τί σημαίνει αυτό; Άνοδο του παλμού ποιανού πράγματος; πχ στο micro-compre.pdf στο θέμα 2 Σεπτ 2007 λέει ότι η πίεση του κουμπιού από το χρήστη θα διαβάζεται μέσω external interrupt.. και όντως θέτει ότι θα γίνεται (μέσω EICRA, EIMSK) στο rising edge (ποιανού πράγματος είπαμε?) και στο interrupt vector label ορίζει τί θα γίνεται όταν προκαλείται το interrupt.. πού ορίζει όμως πότε θα προκαλείται;
Τσέκαρε εάν θες αυτό το post μου. Βάση της πρώτης άσκησης του Πετρου εξηγεί τις διαφορές μέθοδο σημαιών - μέθοδο interrupts.
Και έχω κάνει και μια μέθοδο σημαιών με software interrupt 


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Indy on June 20, 2017, 14:33:09 pm
Τσέκαρε εάν θες αυτό το post μου. Βάση της πρώτης άσκησης του Πετρου εξηγεί τις διαφορές μέθοδο σημαιών - μέθοδο interrupts.
Και έχω κάνει και μια μέθοδο σημαιών με software interrupt  

Ευχαριστώ, αλλά δε διακρίνω και πολύ καλά τα γράμματα. Επίσης, βλέπω ότι κάνεις ό,τι γίνεται και στην επίλυση του θέματος 2 Σεπτεμβρίου 2007, δηλαδή ενεργοποιείς τα external interrupts 0 και 1, στο rising edge, αλλά δεν καταλαβαίνω πώς θέτεις πότε ενεργοποιούνται αυτά. Αν μου εξηγούσε κανείς με δυό λόγια θα ταν καλά (γιατί από τα παραδείγματα μόνο δεν κατάλαβα πλήρως).

Έχει να κάνει με τις τιμές στα pins? αλλά σε ποιά Pins και ποια bits?

Στην ουσία τα external interrupts είναι interrupts που καλούνται όταν πατιέται το αντίστοιχό τους (dedicated) κουμπί; Όταν πχ στο θέμα λέει "όταν ο χρήστης πατάει το κουμπί ACKNOWLEDGE να γίνεται αυτό κι αυτό" τότε θεωρούμε δεδομένο πως αυτό το κουμπί αντιπροσωπεύεται από το pin του INT0 και όταν αυτό πατηθεί, θα γίνει trigger το interrupt? (αφού πρώτα σετάρουμε τον EICRA και τον EIMSK)?


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: lodi on June 20, 2017, 20:13:22 pm
Λοιπόν , πάνε ATmega128 Datasheet σελίδα 2, στο Pin Configuration . Βλέπεις εκεί τα PinD από 0-7 ή αλλιώς PD[0-7] έχουν και ένα άλλο όνομα μέσα στην παρένθεση. Αυτό εκφράζει μια εν δυνάμη λειτουργεία τους . Τα συγκεκριμμένα Pins μέσα στην παρένθεση περιέχουν τα INT[0:7] . Αυτή η λειτουργία μπορεί να ενεργοποιηθεί μέσω του καταχωρητή EIMSK για τα αντίστοιχα PIN 0-7.

Τι σημαίνει αυτή η λειτουργία ;
Καταρχάς να σου πω σελ 89 στο Datasheet τα λέει αρκετά καλά, σε περίπτωση που δεν το διάβασες.
Κατα  τ' άλλα τα external interrupts εφόσον είναι enabled για ένα συγκεκριμμένο PIN (π.χ. το ΙΝΤ0 που στεγάζει στο PD0 ,και ενεργοποιείται με τον EIMSK να παίρνει την τιμή 0b00000001 ) υλοποιεί την εξής λειτουργία : Παρακολουθεί το INT0 ανά πάσα στιγμή και σε συγκερκριμμένες περιπτώσεις ανάλογα με αυτό που βλέπει καλεί INTERRUPT τύπου ext_INT0 στην 0002 codeSegment.
Οι συγκεκριμμένες περιπτώσεις ορίζονται από τον EICRA. Π.χ. για 0b00000011 EICRA σημαίνει ότι το INT0 (εφόσον έχει ενεργοποιηθεί από τον EIMSK) θα προκαλέσει interrupt όταν η τάση στο INT0 γίνει από 0 σε 1 (rising edge) .

Τώρα εφαρμογές , είναι πολλές . Αρκετές φορές όπως έχω δεν σου λέει πώς να το κάνεις και τα external interrupt αποτελούν συχνά λύση στο πρόβλημά σου. Στο συγκεκριμμένο παραδειγμα υποθέτεις ότι το κουμπι ACKNOWLEDGE στο πάτημά του δημιουργεί έναν παλμό στο INT0 από το 0->1 και μετά από κάποιους κύκλους πάλι στο 0.

Ελπίζω να κατάλαβες κάπως. Σου προτείνω να δεις και το Datasheet τι λέει γιατί τα συγκεκριμμένα τα εξηγεί καλά.


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Indy on June 20, 2017, 22:28:06 pm
Λοιπόν , πάνε ATmega128 Datasheet σελίδα 2, στο Pin Configuration . Βλέπεις εκεί τα PinD από 0-7 ή αλλιώς PD[0-7] έχουν και ένα άλλο όνομα μέσα στην παρένθεση. Αυτό εκφράζει μια εν δυνάμη λειτουργεία τους . Τα συγκεκριμμένα Pins μέσα στην παρένθεση περιέχουν τα INT[0:7] . Αυτή η λειτουργία μπορεί να ενεργοποιηθεί μέσω του καταχωρητή EIMSK για τα αντίστοιχα PIN 0-7.

Τι σημαίνει αυτή η λειτουργία ;
Καταρχάς να σου πω σελ 89 στο Datasheet τα λέει αρκετά καλά, σε περίπτωση που δεν το διάβασες.
Κατα  τ' άλλα τα external interrupts εφόσον είναι enabled για ένα συγκεκριμμένο PIN (π.χ. το ΙΝΤ0 που στεγάζει στο PD0 ,και ενεργοποιείται με τον EIMSK να παίρνει την τιμή 0b00000001 ) υλοποιεί την εξής λειτουργία : Παρακολουθεί το INT0 ανά πάσα στιγμή και σε συγκερκριμμένες περιπτώσεις ανάλογα με αυτό που βλέπει καλεί INTERRUPT τύπου ext_INT0 στην 0002 codeSegment.
Οι συγκεκριμμένες περιπτώσεις ορίζονται από τον EICRA. Π.χ. για 0b00000011 EICRA σημαίνει ότι το INT0 (εφόσον έχει ενεργοποιηθεί από τον EIMSK) θα προκαλέσει interrupt όταν η τάση στο INT0 γίνει από 0 σε 1 (rising edge) .

Τώρα εφαρμογές , είναι πολλές . Αρκετές φορές όπως έχω δεν σου λέει πώς να το κάνεις και τα external interrupt αποτελούν συχνά λύση στο πρόβλημά σου. Στο συγκεκριμμένο παραδειγμα υποθέτεις ότι το κουμπι ACKNOWLEDGE στο πάτημά του δημιουργεί έναν παλμό στο INT0 από το 0->1 και μετά από κάποιους κύκλους πάλι στο 0.

Ελπίζω να κατάλαβες κάπως. Σου προτείνω να δεις και το Datasheet τι λέει γιατί τα συγκεκριμμένα τα εξηγεί καλά.

Ναι, κατάλαβα, thanks.


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Indy on June 22, 2017, 19:00:28 pm
Μπορεί να μου εξηγήσει κάποιος πάνω στην αρχή στα .org (για το reset και τα interrupts) πόσα reti βάζουμε μεταξύ των .org? Στην αρχή νόμιζα πως βάζουμε τα μισά από τη διαφορά επόμενο_org - προηγούμενο_org αλλά βλέποντας παλιά λυμένα θέματα βλέπω ότι δεν το κάνουν πάντα έτσι.


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Andromedas on June 22, 2017, 19:33:16 pm
/off topic ας συγχωνευθεί στις ασκήσεις

Μπορεί να μου εξηγήσει κάποιος πάνω στην αρχή στα .org (για το reset και τα interrupts) πόσα reti βάζουμε μεταξύ των .org? Στην αρχή νόμιζα πως βάζουμε τα μισά από τη διαφορά επόμενο_org - προηγούμενο_org αλλά βλέποντας παλιά λυμένα θέματα βλέπω ότι δεν το κάνουν πάντα έτσι.
το interrupt vector δηλαδή το .org διευθυνση θέλει ένα. πχ:
.ORG OVF1addr
JMP Timer1OverFlow
.αλλά interrupt vectors


Timer1OverFlow:
....
reti ('ωστε να γίνει το flag του  SR Ι από 0->1 και να μπορεί να ξανακάνει interupt "με μια επιφύλαξη)

κάθε interrupt γυρίζει με reti
το reset δεν είναι interrupt απλά επειδή πάει και διαβάζει τις εντολές από το 0x00 πρέπει να του πεις να πάει κάπου αλλιώς θα πάει στο επόμενο μέχρι να βρει εντολή που πολύ πιθανών να είναι κάτι το οποίο δεν θες πχ interrupt vector



Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Indy on June 22, 2017, 19:45:43 pm
/off topic ας συγχωνευθεί στις ασκήσεις
το interrupt vector δηλαδή το .org διευθυνση θέλει ένα. πχ:
.ORG OVF1addr
JMP Timer1OverFlow
.αλλά interrupt vectors


Timer1OverFlow:
....
reti ('ωστε να γίνει το flag του  SR Ι από 0->1 και να μπορεί να ξανακάνει interupt "με μια επιφύλαξη)

κάθε interrupt γυρίζει με reti
το reset δεν είναι interrupt απλά επειδή πάει και διαβάζει τις εντολές από το 0x00 πρέπει να του πεις να πάει κάπου αλλιώς θα πάει στο επόμενο μέχρι να βρει εντολή που πολύ πιθανών να είναι κάτι το οποίο δεν θες πχ interrupt vector



Δεν εννοώ ακριβώς αυτό. Βλέπω ότι ανάμεσα στα .org στην αρχή (όχι στο "σώμα" του interrupt) βάζουν κάτι reti(x21) reti(x10) κλπ. Αυτά εννοώ πώς κρίνουμε τί πρέπει να τα βάλουμε.


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Andromedas on June 22, 2017, 19:54:26 pm
Δεν εννοώ ακριβώς αυτό. Βλέπω ότι ανάμεσα στα .org στην αρχή (όχι στο "σώμα" του interrupt) βάζουν κάτι reti(x21) reti(x10) κλπ. Αυτά εννοώ πώς κρίνουμε τί πρέπει να τα βάλουμε.

γενικά δεν χρειάζεται να βάλεις κάτι νομίζω ότι είναι macro αυτά που βλέπεις.

και το
.ORG OVF1addr
JMP Timer1OverFlow
.ORG OVF2addr
JMP Timer2OverFlow
....
Timer1OverFlow:
{body_1}
reti

Timer1OverFlow:
{body_2}
reti

είναι το ίδιο με το

.ORG OVF1addr
{body_1}
reti
.ORG OVF2addr
{body_2}
reti
αν θες ανέβασε κώδικα αλλά http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_RETI.html


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Indy on June 22, 2017, 20:02:11 pm
γενικά δεν χρειάζεται να βάλεις κάτι νομίζω ότι είναι macro αυτά που βλέπεις.

και το
.ORG OVF1addr
JMP Timer1OverFlow
.ORG OVF2addr
JMP Timer2OverFlow
....
Timer1OverFlow:
{body_1}
reti

Timer1OverFlow:
{body_2}
reti

είναι το ίδιο με το

.ORG OVF1addr
{body_1}
reti
.ORG OVF2addr
{body_2}
reti
αν θες ανέβασε κώδικα αλλά http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_RETI.html

mikro2-compre.pdf λύση θέματος 2 Ιουνίου 08 τί είναι αυτό το reti(x21) που έχει στις αρχές;
Όπως και βιβλίο Πεκμεστζή σελίδα 94


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Andromedas on June 22, 2017, 20:15:57 pm
mikro2-compre.pdf λύση θέματος 2 Ιουνίου 08 τί είναι αυτό το reti(x21) που έχει στις αρχές;
Όπως και βιβλίο Πεκμεστζή σελίδα 94
Δεν ξέρω, δεν χρειάζεται....
δεν είναι interrupt για να θέλει reti ||The first vector isn't an interrupt but the reset vector, performing no stack operation!||
εδώ για το reset ...
http://www.avr-asm-tutorial.net/avr_en/beginner/JUMP.html
μαζί με κώδικα


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: bsp on June 22, 2017, 20:38:32 pm
Με επιφύλαξη, στο βιβλιο κάνει ουσιαστικά οτι κανει  στις διαφανειες 22-23 στο ethmmy -> Υλη -> I/o Ports -> IOPorts.ppt.
Αν τα έχω καταλάβει σωστά όταν συμβαινει ενα interrupt εκτελείται η εντολή που βρίσκεται στην αντίστοιχη θέση της μνήμης σύμφωνα με την διαφάνεια 22.
Αυτοί ξεκινάνε απο το 0 και βάζουν jmp reset έτσι ώστε οταν συμβεί το reset να πάει στην θέση 0 της μνήμης και να εκτελέσει το reset. Μετά για όσα interrupts δεν τους ενδιαφέρουν επειδή δεν θα συμβούν βάζει στην αντίστοιχη θέση μνήμης το reti με το οποίο ουσιαστικά δε θα  συμβεί τίποτα. Άμα θές να γράψεις κώδικα για το 10ο interrupt γράφεις μετά το reset 8 reti έτσι ώστε η επόμενη εντολή που θα γράψεις π.χ. jmp interrupt να γραφτεί στην θέση μνήμης του συγκεκριμένου interrupt για να τρέχει ο κώδικας για την συγκεκριμένη διακοπή και όχι για κάποια άλλη.
Με το .org 0x0004
   jmp EXT_INT1_ISR
ουσιαστικα γράφεις την εντολή κατευθείαν στην θέση μνήμης που θές και δεν ξεκινάς απο το 0 γράφοντας κάθε θέση μνήμης μέχρι να φτάσεις εκεί που θες. Οπότε στην λύση του θέματος δεν νομίζω ότι χρειάζονται τα reti.



Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Andromedas on June 22, 2017, 20:48:57 pm
έχεις ένα δίκιο: ότι μπορεί να πετάει κενά reti για να είναι σίγουρος για τα interrupt.
Καλύτερα είναι να είσαι κομπλε με τον χειρισμό EIMSK έτσι ώστε να ελέγχεις τα interrupt που θες. Αφού μπορεί να βάλει και ιεραρχικό interrupt οπότε το μαθαίνεις έτσι. Και δεν χρειάζεσαι reti συνέχεια.


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Indy on June 22, 2017, 20:52:44 pm
Άρα η χρήση των κατάλληλων .org για το κάθε interrupt καθιστά τα πολλαπλά reti αχρείαστα... μάλιστα


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Andromedas on June 22, 2017, 21:02:44 pm

Όταν γράφω είναι τα ίδια αυτό που εννοώ ότι καταλήγει σε reti
προφανώς κάθε εντολή μετά από το 0x00 -> reset
μέχρι το τελευταίο interrupt vector είναι μια θέση και πρέπει να μπει μια εντολή: jump εκεί που θες ή reti  ή να μην μπει τίποτα για το αντίστοιχο vector


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: fibonacci on June 23, 2017, 14:30:29 pm
Τι κάνουμε στην περίπτωση που θέλουμε να σετάρουμε έναν  timer με περίοδο διακοπής 1 min ; Ακόμα και στην περίπτωση του timer1 που είναι 16-bit  δεν βγαίνει γιατί το 1 λεπτό είναι αρκετά μεγάλη περίοδος .


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Indy on June 23, 2017, 15:19:12 pm
Τι κάνουμε στην περίπτωση που θέλουμε να σετάρουμε έναν  timer με περίοδο διακοπής 1 min ; Ακόμα και στην περίπτωση του timer1 που είναι 16-bit  δεν βγαίνει γιατί το 1 λεπτό είναι αρκετά μεγάλη περίοδος .

Μετράς πολλές φορές. Ο μεγαλύτερος χρόνος για 16 bit και επεξεργαστή 4MHz (ο οποίος χρόνος παίρνεται για max prescaler, δηλαδή 1024) είναι 2^16 / (4MHz / 1024) = 16s. Οπότε το 1 λεπτό το παίρνεις μετρώντας 3 φορές 16s και μια φορά 12s.


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Indy on June 23, 2017, 16:47:48 pm
Γενικά χρειάζεται να μηδενίζουμε manually τους actual καταχωρητές των timers (TCNTn) πριν τη χρήση τους; Σε κάποια παλιά θέματα έχω δει να το κάνουν και σε κάποια όχι.


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Andromedas on June 23, 2017, 16:48:53 pm
Τι κάνουμε στην περίπτωση που θέλουμε να σετάρουμε έναν  timer με περίοδο διακοπής 1 min ; Ακόμα και στην περίπτωση του timer1 που είναι 16-bit  δεν βγαίνει γιατί το 1 λεπτό είναι αρκετά μεγάλη περίοδος .
Μετράς πολλές φορές. Ο μεγαλύτερος χρόνος για 16 bit και επεξεργαστή 4MHz (ο οποίος χρόνος παίρνεται για max prescaler, δηλαδή 1024) είναι 2^16 / (4MHz / 1024) = 16s. Οπότε το 1 λεπτό το παίρνεις μετρώντας 3 φορές 16s και μια φορά 12s.
Μια άλλη λύση έιναι να χρησιμοποιήσεις δύο timers  ο ένας να μετράει με περίοδό T=10s πχ και άλλος να μετράει 6*T. Αυτή η μέθοδος πραγματοποιείται με τον εξής τρόπο:
έστω για το ΑΤmega128 χρησιμοποιήσεις τον ένα timer πχ για να έχεις την περίοδο 10sec και τον timer 1 η 2 για την 6*Τ. Ο timer1 ή 2 πρέπει να ρυθμιστεί με prescaler external clock cs =7 και ελεγχει το pin PD6 (T1) ή PD7(T2) όταν rise edge αυξάνει τον timer1 ή 2 κατά 1. Άρα πρέπει σε interrupt του overflow  του timer που μετράει το 10sec να αλλάζεις το PD7 από 0->1 (Με προσόχη θές η αλλάγη 0->1 1->0 να διαρκεί πάνω από 3 cpu clock αρά μισή περίοδος Τ=5sec 0->1 T=5sec 1->0 και έχεις από Rise edge σε Rise edge 10 seconds)


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Andromedas on June 23, 2017, 17:04:03 pm
Γενικά χρειάζεται να μηδενίζουμε manually τους actual καταχωρητές των timers (TCNTn) πριν τη χρήση τους; Σε κάποια παλιά θέματα έχω δει να το κάνουν και σε κάποια όχι.
Γενικά γίνονται 0 με reset. Έαν αλλάξεις τον prescaler σε 00  ενώ τρ΄εχει το ρολόι ο TCNT δεν μηδενίζεται  άρα εάν θες να ξαναρχίσει από το μηδέν μέχρι το πού το έχει ρυθμίσει τότε πρέπει να τον μηδενίσεις. Αν ο TCNT έχει μια τιμή, αλλάξεις το top σε < από TCNT τότε θα μετρήσει μια φορά μέχρι το max για να μηδενιστεί. Γενικά προτείνω να χρησιμοποιήσεις διαφορετικά clock και όχι το ίδιο διότι μπορεί να ξεχάσεις καμιά μικρό ρύθμιση από κυματομορφή σε κυματομορφή


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: kaspas on June 25, 2017, 13:00:14 pm
Στις ρουτίνες διακοπής πρέπει να αποθηκεύουμε στην στοίβα τον SR;


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: lady_of_winter on June 28, 2017, 12:12:19 pm
απορία τελευταίας στιγμής

δε μπορώ με κανέναν τρόπο να καταλάβω πως βγάζει τιμές για τον prescaler στα παραδείγματα

έχω 2 απορίες
1)στο πρώτο παράδειγμα το Tovck έχει μονάδες Hz ενώ στο δεύτερο sec
2)στο δεύτερο αυτό το ρημάδι το 56 πως το βγάζει?


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: Aristos on June 28, 2017, 13:16:28 pm
το 56 είναι το αποτέλεσμα της πράξης (στο περίπου). για το 1ο που ρωτάς, δε καταλαβα τι ακριβως εννοείς. 1sec -> 1Hz. με τον ίδιο τρόπο εφαρμόζεται ο τύπος στις δύο περιπτώσεις


Title: Re: [Μικρο ΙΙ] Ασκήσεις-Σχολιασμός Απορίες 2017
Post by: lady_of_winter on June 28, 2017, 13:23:00 pm
το 56 είναι το αποτέλεσμα της πράξης (στο περίπου). για το 1ο που ρωτάς, δε καταλαβα τι ακριβως εννοείς. 1sec -> 1Hz. με τον ίδιο τρόπο εφαρμόζεται ο τύπος στις δύο περιπτώσεις

πωω τι χαζη, νομιζα οτι το εξισωνε με κατι :P

ευχαριστω