Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα σε όλους. Θα ήθελα τη βοήθεια σας με ένα κώδικα 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

Το θέμα είναι μετά τι κάνω;

 

Δημοσ.

καταρχάς δες στο βιβλίο σου πως υλοποιεί την "ρουτίνα" χρονοκαθυστέρησης 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 φορές, δεν είναι η πιο σωστή λύση αλλά είναι αποδεκτή.

 

κατάλαβες τι θέλω να πω;

Δημοσ.

περίπου ( ;) :/ το βιβλίο μιλάει για τον μικροελεγκτή "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
Δημοσ.

βάλε σε code tags... 

το DELAY.LOOP είναι label τίποτα άλλο.

η κάθε εντολή έχει ένα x χρόνο για να τρέξει, οπότε αν τρέχει την εντολή y φορές θα μπορούσες να έχεις την χρονοκαθυστέρηση που θες...

 

τυπικά μπορείς να κάνεις 5 και 6 φορές την λούπα του 1 sec

Δημοσ.

το έβαλα , ψιλοκολάει το insomnia γ αυτό και το μπέρδεμα.

 

To πρόβλημα είναι ότι ζητάει τρόπο επίλυσης με όσο το δυνατόν λιγότερες υπορουτίνες καθυστέρησης.

Ευχαριστώ για την βοήθεια σου πάντως. :)

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...