foutzos Δημοσ. 9 Σεπτεμβρίου 2014 Δημοσ. 9 Σεπτεμβρίου 2014 Καλησπέρα σε όλους. Θα ήθελα τη βοήθεια σας με ένα κώδικα assembly που όπως λέει και το βιβλίο που έχω το πρόγραμμα που υλοποιείται λειτουργεί σε 2 φάσεις. Ανάβει ένα LED για ένα δευτερόλεπτο και το σβήνει για εξίσου 1 δευτερόλεπτο ενώ η διαδικασία συνεχίζει αεναώς. Αυτό που θέλω να κάνω και δεν γνωρίζω είναι να αλλάξω και τις 2 φάσεις. Θα ήθελά να ανάβει το LED για 5 δευτερόλεπτα και να σβήνει για 6. Επειδή δεν γνωρίζω και πολλά και δεν μπορώ ούτε στο internet να βρω απαντήσεις ζητάω τη βοήθεια σας λεπτομερώς. Ευχαριστώ εκ των προτέρων όποιον ασχοληθεί. Παραθέτω τον κώδικα παρακάτω. PORTD.DATA EQU $0003 PORTD.DIRECTION EQU $0007 COUNTER1 EQU $0040 COUNTER2 EQU $0041 COUNTER3 EQU $0042 ROM.START EQU $8000 RESET.VECTOR EQU $FFFE ORG ROM.START BSET 0,$001F MOV #$1F,$003C BSET 4,PORTD.DIRECTION LOOP BSET 4,PORTD.DATA JSR DELAY.1SEC BCLR 4,PORTD.DATA JSR DELAY.1SEC JMP LOOP DELAY.1SEC MOV #!55,COUNTER3 LOAD.COUNTER2 MOV #!100,COUNTER2 LOAD.COUNTER1 MOV #!180,COUNTER1 DELAY.LOOP DBNZ COUNTER1,DELAY.LOOP DBNZ COUNTER2,LOAD.COUNTER1 DBNZ COUNTER3,LOAD.COUNTER2 RTS ORG RESET.VECTOR FDB ROM.START Νομίζω για αρχή πρέπει να ορίσω ένα ακόμα Counter COUNTER4 EQU $0043 ενώ λογικα το LOOP θα αλλάξει σε: LOOP BSET 4,PORTD.DATA JSR DELAY.5SEC BCLR 4,PORTD.DATA JSR DELAY.6SEC JMP LOOP Το θέμα είναι μετά τι κάνω;
MeTaXaS4 Δημοσ. 9 Σεπτεμβρίου 2014 Δημοσ. 9 Σεπτεμβρίου 2014 καταρχάς δες στο βιβλίο σου πως υλοποιεί την "ρουτίνα" χρονοκαθυστέρησης 1 sec. επειδή δεν ξέρω για τι επεξεργαστή γράφεις την assembly και έχω γράψει μόνο για motorola δεν μπορώ να σου πω πολλές λεπτομέρειες για την κάθε εντολή, αλλά σκέψου ότι το κομμάτι που πρέπει να αλλάξεις είναι το DELAY.1SEC MOV #!55,COUNTER3 LOAD.COUNTER2 MOV #!100,COUNTER2 LOAD.COUNTER1 MOV #!180,COUNTER1 DELAY.LOOP DBNZ COUNTER1,DELAY.LOOP DBNZ COUNTER2,LOAD.COUNTER1 DBNZ COUNTER3,LOAD.COUNTER2 RTS θα μπορούσες να φτιάξεις 2 υπο ρουτίνες η μία να το τρέχει 5 φορές η άλλη 6 φορές, δεν είναι η πιο σωστή λύση αλλά είναι αποδεκτή. κατάλαβες τι θέλω να πω;
foutzos Δημοσ. 9 Σεπτεμβρίου 2014 Μέλος Δημοσ. 9 Σεπτεμβρίου 2014 περίπου ( :/ το βιβλίο μιλάει για τον μικροελεγκτή "MC68HC908GP32" ο οποίος δέχεται ρολόι συχνότητας έως 20MHZ. Ενώ για την καθυστέρηση λέει πως την δημιουργεί μέσω μετρητών σε σειρά. http://postimg.org/gallery/2q4wxg68a/f08bf341/ Η απάντηση που πήρα από κάποιον είναι να βάλω την παρακάτω υπορουτίνα για τα 5 δευτερόλεπτα. Ενώ για τα 6 απλά να αλλάξω το 5 με το 6. Αλλα πάλι δεν το χω... DELAY.5SEC MOV #!5,COUNTER4 DELAY5.LOOP JSR DELAY.1SEC DBNZ COUNTER4,DELAY5.LOOP RTS
MeTaXaS4 Δημοσ. 9 Σεπτεμβρίου 2014 Δημοσ. 9 Σεπτεμβρίου 2014 βάλε σε code tags... το DELAY.LOOP είναι label τίποτα άλλο. η κάθε εντολή έχει ένα x χρόνο για να τρέξει, οπότε αν τρέχει την εντολή y φορές θα μπορούσες να έχεις την χρονοκαθυστέρηση που θες... τυπικά μπορείς να κάνεις 5 και 6 φορές την λούπα του 1 sec
foutzos Δημοσ. 9 Σεπτεμβρίου 2014 Μέλος Δημοσ. 9 Σεπτεμβρίου 2014 το έβαλα , ψιλοκολάει το insomnia γ αυτό και το μπέρδεμα. To πρόβλημα είναι ότι ζητάει τρόπο επίλυσης με όσο το δυνατόν λιγότερες υπορουτίνες καθυστέρησης.Ευχαριστώ για την βοήθεια σου πάντως.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα