PDA

Επιστροφή στο Forum : Απορίες σε assemply για PIC



eebabs2000
10-11-07, 21:57
Για σας που ασχολείστε με προγραμματισμό PIC θα είναι παιχνίδι, αλλά εγώ επειδή πρώτη φορά διαβάζω κώδικα assemply για PIC με δυσκολεύει λίγο στην κατανόηση αλλα βλέπω ότι μερικές εντολές είναι παρόμοιες με αυτές για assemply των AVR. Βρήκα ένα πρόγραμμα σε PIC και θέλω να το κάνω να δουλέψει σε έναν AVR. Παρακάτω βάζω μερικές εντολές από το πρόγραμμα. Μπορείτε με λίγα λόγια να μου δώσετε τη σημασία τους. Πάνω απ' όλα με ενδιαφέρει να μάθω ποιοι είναι οι καταχωρητές και τι τιμές παίρνουν. Ευχαριστώ προκαταβολικά...


bsf STATUS,RP0
movlw b'00000000'
movwf TRISB
bcf STATUS,RP0

Del equ 0F
tmp1 equ 0C
tmp3 equ 0E
movlw 39

main


movlw b'00000000'
movwf PORTB

movlw 11
movwf Del
Delay1
decfsz Del,1
goto Delay1

---------------
nxt3
movlw b'00000011'
movwf PORTB
nop
goto nxt2
nxt1
nop

Delay2
decfsz Del,1
goto Delay2


nxt2
nop
nop
.
.
.

Lykos1986
11-11-07, 12:41
bsf STATUS,RP0 //Κάνει 1 το bit RP0 του καταχωριτή STATUS Για να αλλάξει σελίδα μνήμης (σελία 1)
movlw b'00000000' //Μεταφέρει στον καταχωριτή W την τιμή 0
movwf TRISB //Μεταφέρει τα δεδομένα του W στην TRISB (κάνει την πόρτα Β έξοδο)
bcf STATUS,RP0 //Κάνει 0 το bit RP0 του καταχωριτή STATUS Για να αλλάξει σελίδα μνήμης (σελίδα 0)


Del equ 0F //Θέτει το όνομα Del στην διεύθυνση μνήμης 0F
tmp1 equ 0C //Θέτει το όνομα tmp1 στην διεύθυνση μνήμης 0C
tmp3 equ 0E //Θέτει το όνομα tmp3 στην διεύθυνση μνήμης 0E
movlw 39 //Μεταφέρει στον καταχωριτή W την τιμή 39 --> Η εντολή είναι περιττή


main //Απλή ετικέτα


movlw b'00000000' //Μεταφέρει στον καταχωριτή W την τιμή 0
movwf PORTB //Λογικό 0 σε όλη την πόρτα Β

movlw 11 //Μεταφέρει στον καταχωριτή W την τιμή 11
movwf Del //Μεταφέρει στον καταχωριτή Del την τιμή του W


Delay1 //Απλή ετικέτα
decfsz Del,1 //Μειώνει κατά 1 τον καταχωριτή Del και αν το αποτέλεσμα είναι 0 πηδάει μια εντολή. Το κάθε νέο αποτέλεσμα αποθηκεύετε στον Del
goto Delay1 //Πήγαινε στην ετικέτα Delay1


nxt3 //Απλή ετικέτα
movlw b'00000011' //Μεταφέρει στον καταχωριτή W την τιμή 3
movwf PORTB //Λογικό ένα στα bit 0 και 1 της πόρτας Β
nop //Καμιά λειτουργία, κενός κύκλος μηχανής
goto nxt2 //Πήγαινε στην ετικέτα nxt2


nxt1 //Απλή ετικέτα
nop //Καμιά λειτουργία, κενός κύκλος μηχανής


Delay2 //Απλή ετικέτα
decfsz Del,1 //Μειώνει κατά 1 τον καταχωριτή Del και αν το αποτέλεσμα είναι 0 πηδάει μια εντολή. Το κάθε νέο αποτέλεσμα αποθηκεύετε στον Del
goto Delay2 //Πήγαινε στην ετικέτα Delay2


nxt2 //Απλή ετικέτα
nop //Καμιά λειτουργία, κενός κύκλος μηχανής
nop //Καμιά λειτουργία, κενός κύκλος μηχανής



Αυτά!!! Αν θέλεις κάτι άλλο εδώ είμαστε. Αν πάλι έχω κάνει κανένα λάθος κάποιος άλλος θα το διορθώσει. Έχω πολύ πολύ καιρό να ασχοληθώ με assembly

PS: Τώρα το θυμήθηκα! Δες και αυτό εδώ: http://www.electronics-lab.com/pic-in-greek/

eebabs2000
12-11-07, 11:41
Lykos1986 1000 ευχαριστώ για την απάντηση... Η σελίδα είναι πολύ καλή. Θα τα μελετήσω όλα και αν κάπου δυσκολευτώ θα ξαναγράψω. Να' σαι καλά!

savnik
14-11-07, 08:22
bsf STATUS,RP0 //Κάνει 1 το bit RP0 του καταχωριτή STATUS Για να αλλάξει σελίδα μνήμης (σελία 1)
movlw b'00000000' //Μεταφέρει στον καταχωριτή W την τιμή 0
movwf TRISB //Μεταφέρει τα δεδομένα του W στην TRISB (κάνει την πόρτα Β έξοδο)
bcf STATUS,RP0 //Κάνει 0 το bit RP0 του καταχωριτή STATUS Για να αλλάξει σελίδα μνήμης (σελίδα 0)


Del equ 0F //Θέτει το όνομα Del στην διεύθυνση μνήμης 0F
tmp1 equ 0C //Θέτει το όνομα tmp1 στην διεύθυνση μνήμης 0C
tmp3 equ 0E //Θέτει το όνομα tmp3 στην διεύθυνση μνήμης 0E
movlw 39 //Μεταφέρει στον καταχωριτή W την τιμή 39 --> Η εντολή είναι περιττή


main //Απλή ετικέτα


movlw b'00000000' //Μεταφέρει στον καταχωριτή W την τιμή 0
movwf PORTB //Λογικό 0 σε όλη την πόρτα Β

movlw 11 //Μεταφέρει στον καταχωριτή W την τιμή 11
movwf Del //Μεταφέρει στον καταχωριτή Del την τιμή του W


Delay1 //Απλή ετικέτα
decfsz Del,1 //Μειώνει κατά 1 τον καταχωριτή Del και αν το αποτέλεσμα είναι 0 πηδάει μια εντολή. Το κάθε νέο αποτέλεσμα αποθηκεύετε στον Del
goto Delay1 //Πήγαινε στην ετικέτα Delay1


nxt3 //Απλή ετικέτα
movlw b'00000011' //Μεταφέρει στον καταχωριτή W την τιμή 3
movwf PORTB //Λογικό ένα στα bit 0 και 1 της πόρτας Β
nop //Καμιά λειτουργία, κενός κύκλος μηχανής
goto nxt2 //Πήγαινε στην ετικέτα nxt2


nxt1 //Απλή ετικέτα
nop //Καμιά λειτουργία, κενός κύκλος μηχανής


Delay2 //Απλή ετικέτα
decfsz Del,1 //Μειώνει κατά 1 τον καταχωριτή Del και αν το αποτέλεσμα είναι 0 πηδάει μια εντολή. Το κάθε νέο αποτέλεσμα αποθηκεύετε στον Del
goto Delay2 //Πήγαινε στην ετικέτα Delay2


nxt2 //Απλή ετικέτα
nop //Καμιά λειτουργία, κενός κύκλος μηχανής
nop //Καμιά λειτουργία, κενός κύκλος μηχανής



Αυτά!!! Αν θέλεις κάτι άλλο εδώ είμαστε. Αν πάλι έχω κάνει κανένα λάθος κάποιος άλλος θα το διορθώσει. Έχω πολύ πολύ καιρό να ασχοληθώ με assembly

PS: Τώρα το θυμήθηκα! Δες και αυτό εδώ: http://www.electronics-lab.com/pic-in-greek/
Κανενα λαθος . Ολα σωστα.
Καλα δεν βαρεθηκες να τα γραψεις ολα αυτα.
Αλλα θα μου πεις πως θα βοηθησουμε τους αλλους.

eebabs2000
14-11-07, 11:34
OK, ευχαριστώ για τη βοήθεια και το χρόνο σας!

TeslaCoil
04-12-07, 00:25
Μια σελιδα με παραδειγματα

http://www.rentron.com/CodeSafe.htm
θελει μερικες τροποποιησεις αλλα δινει μερικες καλες ιδεες

μια ερωτιση

στο
STATUS
γιατι γραφουν ολοι

STATUS,RP0

μου το βγαζει λαθος το MPLAB

απο οσο κοιταξα στο help MPLAB δεν βρικα καποια καλη απαντηση
στο datasheet του PIC 18F452 λεει οτι αφορα καταχωριτή

οπως εχω δει και σε αλλα sourcecode
και οπως λεει και ο φιλος μας ο Lykos1986

bsf STATUS,RP0 //Κάνει 1 το bit RP0 του καταχωριτή STATUS Για να αλλάξει σελίδα μνήμης

πως ειναι η σωστη συνταξη? και απο που εξαρτατε

εγω εβαζα παντα
STATUS, PORTB,0
ή
STATUS, PORTB
και δουλευε
ομως μου βγαζει
Warning[202] C:\JIM PROG\BLINK.ASM 52 : Argument out of range. Least significant bits used.
αλλα αυτο που θελω παιζει

Κατι που ξεχασα να γραψω ειναι οτι
το 202 μηνυμα λεει οτι
202 Argument out of range. Least significant bits used.
Argument did not fit in the allocated space. For example, literals must be 8 bits.

πρεπει να ειναι 8 bit

Lykos1986
04-12-07, 15:38
...στο
STATUS
γιατί γράφουν όλοι

STATUS,RP0

βασικά δεν γράφουμε έτσι... είναι λάθος σύνταξη εντολής! Το "STATUS" είναι ένα όνομα καταχωρητή του PIC και το RP0 είναι το όνομα ενός bit αυτού του καταχωρητή. Οπότε λες στον assembler ότι σε αυτήν την σειρά αναφέρομαι στο bit RP0 του καταχωρητή STATUS αλλά δεν του λες πουθενά το τι θα πρέπει να κάνει με αυτό το bit.

H σωστή σύνταξη είναι η παρακάτω:

bsf STATUS,RP0
όπου του λες τι να κάνει με το bsf!


PS:

εγω εβαζα παντα
STATUS, PORTB,0
ή
STATUS, PORTB
και δουλευε
Δούλευε κάτι τέτοιο!!!;;;!!! Έχω πολύ καιρό να χρησιμοποιήσω αassembly αλλά αυτήν η σύνταξη (πιστεύω) είναι λάθος!!!!!!!!!!!

th_shak
05-12-07, 13:10
BSF STATUS,RP0 Σημαίνει ότι κάνεις '1' το Bit με όνομα RP0 του καταχωρητή κατάστασης STATUS και αυτό έπρεπε να γίνει στους pic της σειράς 16Fxxxx για να μεταβείς στη Bank 1 και να κάνεις κάποιες αρχικοποιήσεις στα pin κ.α. Το MPLAB σου βγάζει λάθος γιατί πολύ απλά στον pic 18F452 ο STATUS register δεν έχει κάποιο Bit με όνομα RP0 και στους pic της σειράς 18Fxxxx η αρχικοποίηση γίνεται με άλλο τρόπο. Δες το datasheet.

TeslaCoil
07-12-07, 05:05
th_shak
με καληψες και εγω δεν εχω βρει κατι για το RP0 στο datasheet του 18F
ισως γιατι δεν ειχα κοιταξει σωστα!! :roll: το RP0 δεν υπαρχει στο 18FΧΧΧ
εχει αλλο τροπο

αυτο που δουλευει ειναι

bsf STATUS,POR ειναι προφανες
Power-on Reset ομως δεν εχει σχεση με αυτο που κανει το
το RP0

εχει και μια αλλη επιλογη για αλλη λειτουργεια
... STATUS,ΒOR
Brown-out Reset Status bit
Brown-out περικοπή ηλεκτρικού ρεύματος

ειδα και ενα παραδειγμα του POR & BOR για
PWM και ενα για reset
ισως σε καπιον να φανουν χρησιμα

http://classshares.student.usp.ac.fj/EN300/Previous%20EN300%20Project%20Reference%20Materials/Internet%20Dev%20Kit_Denis%20Lal%202005/DATASHEETS/reset.pdf

http://www.engj.ulst.ac.uk/sidk/quintessential/pdf_docs/reset.pdf

Lykos1986
εχεις δικιο οτι

bsf STATUS,RP0
γραφετε απλα ετσι απομονωσα αυτο που με ενδιεφερε να ρωτισω

αυτο που δουλευε στο 18F452 ειναι το
bsf STATUS,PORTB ή bsf STATUS,PORTB,0
μονο και μονο για μην με ζαλιζει το MPLAB
με error

Ευχαριστω για τον χρονο σας