PDA

Επιστροφή στο Forum : Εύρεση κώδικα σε PIC



Lykos1986
28-09-05, 02:13
Με ποιόν τρόπο μπορώ να διαβάζω σειριακά 3bytes πληροφορίας (μήκους 8bit το καθένα) το ένα πίσω από το άλλο, από ένα pin του 16f84A.
Πχ έχουμε την πληροφορία AABBCC. Βάζω δύο γράμματα στο καθένα γιατί αφού έχουμε μήκος 8bit θα έχουμε και 255 συνδυασμούς άρα και δύο γράμματα σε hex.
Θέλω ο pic να αναγνωρίσει τα AA, έστω η τιμή 0C και τότε μόνο να αρχίσει την καταγραφή των ΒΒ και CC σε δύο καταχωριτές, έστω reg1 και reg2.

Το όλο θέμα είναι να καταφέρω να γράψω κώδικα ώστε αρχικά ο μC να αναγνωρίσει το πρώτο byte και αν είναι σωστό τότε και μόνο τότε να καταγράψει τα άλλα δύο σε δύο ξεχωριστούς καταχωρητές.

Δεν έχω πολλές γνώσεις από μC ακόμα, παρά μόνο ότι διάβασα από διάφορα βιβλία απο εδώ και απο εκεί. Αν δεν έχεις και κανένα να σου εξηγήσει εκεί που κολλάς τότε…
Με λίγα λόγια έφαγα ένα ολόκληρο απόγευμα προσπαθώντας να γράψω τον καταραμένο τον κώδικα. Με assembly τα βρήκα πολύ δύσκολα. Αν ήταν σε κάποια πιο ανώτερου επιπέδου γλώσσα… τα πράγματα θα ήταν πιο εύκολα. Τουλάχιστον τώρα διαβάζω C για να μπορέσω να χρησιμοποιήσω κανένα compiler στο μέλλον.

gsmaster
28-09-05, 23:18
Θα πρέπει να ακολουθήσεις κάποιο πρότυπο για την επικοινωνία σου. Αυτα τα 3byte απο που θα έρχονται???

Αν έρχονται απο την σειριακή του υπολογιστή μπορείς (υποχρεωτικά) να χρησιμοποιήσεις το πρωτόκολλα rs232. Θα στο συνιστούσα γιατί αν θες να κάνεις μόνο αποστολη δεδομένων προς μια κατεύθυνση, χρειάζεται μόνο ένα καλώδιο (+γείωση).

Αν θες άλλα πρωτόκολλα είναι το i2c το οποίο έχει 2 γραμμές (+γείωση). Η μια είναι το clock και η άλλη τα δεδομένα. Μπορεί να είναι και αμφίδρομο, χωρίς άλλο αγωγό. Ψάξε για i2c specification θα βρείς πολλά πώς δουλέυει.

Ένα άλλο καλό πρωτόκολλο είναι το 1wire το οποίο είναι ευέλικτο, αμφίδρομο και ...περίπλοκο


Για τους πειραματισμούς σου, σου συνιστώ σειριακή rs232 με χίλια, Υπόψην οι περισσότεροι compiler συνήθως έχουν έτοιμες τις ρουτίνες για 232.

πχ κώδικας σε CCS C για να πάρεις 1 byte απο την σειριακή:


#use rs232 (9600, xmit=b0, rcv=b1); //ayto to grafeis mia fora stin arxi tou kwdika
a=getc;
εσύ μήπως προτιμάς assembly?

Lykos1986
28-09-05, 23:30
Σε RS232 είναι εύκολο, το I2C το έχω ακουστά αλλά δεν ξέρω και πολλά. Το πρόβλημα είναι ότι δεν έχω σχεδιάσει εγώ το σύστημα αποστολής των δεδομένων και το μεγαλύτερο πρόβλημα είναι ότι δεν ακολουθεί κάποιο πρωτόκολλο όπως θα έπρεπε!!! Αυτό που κάνει είναι να βγάζει με συχνότητα 40ms τα 3 Bytes που γράφω παραπάνω. Το πρώτο byte είναι πάντα σταθερό και μόνο τα άλλα δύο είναι μεταβλητά. Αν μπορούσα να αναγνωρίσω το πρώτο byte (αφού δεν αλλάζει ποτέ) τότε θα μπορούσα να αποθηκεύσω και τα άλλα δύο που είναι συνεχόμενα χωρίς κανένα κενό ανάμεσα τους, σε δύο ξεχωριστούς καταχωρητές για περαιτέρω επεξεργασία.


Μακάρι να χρησιμοποιούσε κάποιο κλασικό πρωτόκολλο επικοινωνίας.
:cry: :cry: :cry:

gsmaster
28-09-05, 23:39
Αν ο χρόνος είναι παντα ο ίδιος, 40ms και δεν αλλάζει, κατι είναι κι αυτό.

Ας ονομάσουμε τα 3Byte = 1 frame

Όταν τελειώσει το πρώτο frame σου δίνει κάποιο παλμό ή ξεκινάει κατευθείαν το επόμενο??? έστω και μια μικρή διακοπή να κάνει κάτι είναι κι αυτό. Επίσης η μορφή της μετάδωσης ποιά είναι αν έχει να στείλει το 255 (1111 1111) θα μείνει 1 για 480mS???

Τι είναι αυτό που στέλνει έτσι??? Δεν μπορεί κάποιο τρόπο θα έχει. Για κοίτα σε κάνα Datasheet...

Lykos1986
28-09-05, 23:57
Τι είναι ατό που στέλνει έτσι!!! Αυτήν την απορία είχα και εγώ!!! Πρόκειται για πρόγραμμα που σου δίνει δεδομένα από τον υπολογιστή σου, αλλά το πρόγραμμα στήθηκε έτσι ώστε να είναι εύκολα χρησιμοποιήσιμο από του μC Basic Stamp.
Στον basic Stamp με μια εντολή μπορείς να τα κάνεις όλα αυτά. Απλά ορίζεις το ποδαράκι επικοινωνίας και μετά με μία εντολή που δεν ξέρω αν την γράφω σωστά παίρνει όλα τα δεδομένα. Πρέπει να είναι κάπως έτσι: (KD,ger1,reg2). Όπου KD το σταθερό byte αναγνώρισης. Στον reg1 και reg2 αντίστοιχα αποθηκεύονται τα άλλα δύο bytes αυτόματα. Έτσι απλά!!!
Όσο για κάποιο Pin χρονισμού – σκανδαλισμού ή κάτι αντίστοιχο… δεν υπάρχει τίποτα!!!

gsmaster
29-09-05, 00:19
ο μόνος τρόπος ποθ μπορώ να σκευτώ είναι:

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

Θα πρέπει όμως να ξέρεις πότε αρχίζει να στέλνει το πρώτο byte γιατί αν χάσεις ένα bit, δεν θα δουλέψει. Κάποιο τρόπο θα έχει δεν μπορεί...

Lykos1986
29-09-05, 10:33
Σίγουρα θα έχει κάποιον τρόπο αλλά για την ώρα δεν τον ξέρουμε!!! Που θα μας πάει όμως… θα τον βρούμε. Πάντων αποκλείεται να κάτσω να μάθω basic Stamps!!!

leosedf
29-09-05, 18:55
μήπως η γραμμή είναι συνέχεια low πχ και κάνει polling την πόρτα (στο 1ms πχ) και μόλις γίνει active να ενεργοποιειται? η δεν κατάλαβα σωστά?