Σελίδα 12 από 13 ΠρώτηΠρώτη ... 2 10 11 12 13 ΤελευταίαΤελευταία
Εμφάνιση αποτελεσμάτων : 111 έως 120 από 123

Θέμα: Παραδείγματα σε CCS

  1. #111
    Μέλος
    Όνομα
    Σπύρος
    Εγγραφή
    May 2010
    Περιοχή
    Κεφαλονιά Αργοστόλι
    Μηνύματα
    105

    Προεπιλογή

    που βρισκεται το λαθος ρε παιδια κ δεν μου γινεται compile το προγραμμα?
    μου βγαζει undefined identifier --atol

    #include "16F877A.h"
    #FUSES NOWDT, HS, PUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD
    #USE DELAY (clock=4M)
    #USE RS232 (baud=9600,parity=N,bits=8,xmit=PIN_C6,rcv=PIN_C7)

    void main ()
    {
    char rs232;
    int16 pwm1;
    setup_ccp1(CCP_PWM);
    setup_timer_2(T2_DIV_BY_16, 255, 1);

    while (True)
    {
    if(kbhit())
    {
    rs232=getc();
    pwm1=atol(rs232);
    set_pwm1_duty(pwm1);
    }
    }
    }

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη ventouza1987 : 12-04-15 στις 22:50

  2. #112
    Μέλος Το avatar του χρήστη osek
    Όνομα
    Σωκράτης
    Εγγραφή
    Nov 2008
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    109

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από ventouza1987 Εμφάνιση μηνυμάτων
    που βρισκεται το λαθος ρε παιδια κ δεν μου γινεται compile το προγραμμα?
    μου βγαζει undefined identifier --atol
    Δοκίμασε να κάνεις
    #INCLUDE <stdlib.h>


    Edit:
    Δεν νομίζω πως εύκολα με την getc() θα μπορέσεις να ρυθμίσεις σωστά το εύρος του παλμού...

    Στην set_pwm1_duty(value), ο κύκλος εργασίας δίνεται από τη σχέση

    duty cycle = value / [ 4 * (PR2 +1 ) ]

    και στον κώδικά σου έχεις ρυθμίσει τον PR2=255.
    Άρα ως μέγιστο όρισμα στην
    set_pwm1_duty(value) πρέπει να μπει ο αριθμός 1023.
    Επομένως θεωρώ ότι η gets() είναι η ορθότερη επιλογή.

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη osek : 13-04-15 στις 01:27
    ...'Θα σε ξεχνάω κάθε μέρα'...

  3. #113
    Μέλος
    Όνομα
    Σπύρος
    Εγγραφή
    May 2010
    Περιοχή
    Κεφαλονιά Αργοστόλι
    Μηνύματα
    105

    Προεπιλογή

    Σε ευχαριστω osek το προγραμμα γινεται compile τωρα μετα το include stdlib αλλα δεν ειναι λειτουργικο ειτε με gets() ειτε με getc().

    0 Not allowed! Not allowed!

  4. #114
    Μέλος Το avatar του χρήστη osek
    Όνομα
    Σωκράτης
    Εγγραφή
    Nov 2008
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    109

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από ventouza1987 Εμφάνιση μηνυμάτων
    Σε ευχαριστω osek το προγραμμα γινεται compile τωρα μετα το include stdlib αλλα δεν ειναι λειτουργικο ειτε με gets() ειτε με getc().
    Ναι ίσως θέλει κάποιες μικρές αλλαγές ο κώδικας. Την σειριακή την ελέγχεις εσύ;
    Στα fuses αντί για HS βάλε XT εφόσον δουλεύεις με κρύσταλλο 4MHz.
    Την μεταβλητή rs232 όρισέ την ως char rs232[4]; (Πίνακας 4 θέσεων που θα διαβάζει αριθμούς από την σειριακή)
    Αντί για rs232=getc(); κάνε gets(rs232);
    Μετά από αυτά (κι αν δεν ξεχνάω κάτι) αν στείλεις από την σειριακή τον αριθμό 512 ο κύκλος εργασίας θα πάει στο 50%.

    0 Not allowed! Not allowed!
    ...'Θα σε ξεχνάω κάθε μέρα'...

  5. #115
    Μέλος
    Όνομα
    Σπύρος
    Εγγραφή
    May 2010
    Περιοχή
    Κεφαλονιά Αργοστόλι
    Μηνύματα
    105

    Προεπιλογή

    o κωδικας ο καινουργιος ειναι ο παρακατω. Δεν λειτουργει ουτε ετσι αλλαξα κ εβαλα μπας κ ειναι το ccp1 setup_ccp2 k set_pwm2_duty τιποτα. Την σειριακη την ελεγχω εγω με ενα rs-232 ->ttl. Με το προγραμμα hype! terminal -cm-. Επισης το πιν ccp1 εχωντας βαλει ενα λεντ το βλεπω παντα on (βεβαια χωρις παλμογραφο να δω το duty cycle) αλλα 8α επρεπε να ειναι κλειστω κ οταν του στελνω εγω τιμη 8α επρεπε να αναβει.
    Κώδικας:
    #include "16F877A.h"
    #INCLUDE <stdlib.h>
    #FUSES NOWDT, XT, PUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD
    #USE DELAY (clock=4M)
    #USE RS232 (baud=9600,parity=N,bits=8,xmit=PIN_C6,rcv=PIN_C7)
    
    
    void main ()
       {
       char rs232[4];
       int16 pwm1;
       setup_ccp1(CCP_PWM);                   
       setup_timer_2(T2_DIV_BY_16, 255, 1);   
       
       while (True)
          {
          gets(rs232);
          pwm1=atol(rs232);
          set_pwm1_duty(pwm1);
          }
       }
    Οταν αντικαθιστω το προγραμμα με το παρακατω κωδικα να στελνω απλους χαρακτηρες δουλευει κανονικα το συστημα αρα καπου στον προγραμματισμο συμβαίνει κατι.
    Κώδικας:
    void main ()   {
       char rs232;   
       while (True)
          {
          rs232=getc();
          switch (rs232)
             {
             case 'a':
             output_high(PIN_a0);
             break;
             
             case 'b':
             output_low(PIN_a0);
             break;
             
             case 'c':
             output_high(PIN_a1);
             break;
             
             case 'd':
             output_low(PIN_a1);
             break;
    }
    }
    }

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη ventouza1987 : 13-04-15 στις 13:09

  6. #116
    Μέλος Το avatar του χρήστη osek
    Όνομα
    Σωκράτης
    Εγγραφή
    Nov 2008
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    109

    Προεπιλογή

    Περίεργο! Εγώ τον παρακάτω κώδικα τον έτρεξα στο ISIS Proteus (simulation) και δουλεύει κανονικά.
    Κώδικας:
    #include "16F877A.h"#INCLUDE <stdlib.h>
    #FUSES NOWDT, XT, PUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD
    #USE DELAY (clock=4M)
    #USE RS232 (baud=9600,parity=N,bits=8,xmit=PIN_C6,rcv=PIN_C7)
    
    
    void main ()
       {
          char rs232[4];
          int16 pwm1;
          set_tris_c(0x80);
          setup_ccp1(CCP_PWM); 
          setup_timer_2(T2_DIV_BY_16, 255, 1);
          while (True)
             {
                gets(rs232); 
                pwm1=atol(rs232);
                set_pwm1_duty(pwm1); 
             }
       }

    0 Not allowed! Not allowed!
    ...'Θα σε ξεχνάω κάθε μέρα'...

  7. #117
    Μέλος
    Όνομα
    Σπύρος
    Εγγραφή
    May 2010
    Περιοχή
    Κεφαλονιά Αργοστόλι
    Μηνύματα
    105

    Προεπιλογή

    Σωκρατη σε ευχαριστω κ με συγχωρεις για το καθυστερημενο της απαντησης μου. Το ετρεξα κ εγω το προγραμμα κ παιζει μια χαρα.
    Μερικες ερωτησεις για περισσοτερη κατανοηση του προγραματος να κανω.

    Ποια ειναι η διαφορα μεταξυ χ=getc(); κ gets(χ); ?
    Επισης τι επιτυχαινουμε με char
    rs232[4] εναντι του char rs232, οπου στο char rs232[4] λειτουργει κανονικα κ στο char rs232 οχι?

    0 Not allowed! Not allowed!

  8. #118
    Μέλος Το avatar του χρήστη osek
    Όνομα
    Σωκράτης
    Εγγραφή
    Nov 2008
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    109

    Προεπιλογή

    Στο manual του CCS μπορείς με λίγο ψάξιμο να βρεις όλες τις λεπτομέρειες.

    Εν συντομία να σου πω πως η πρώτη εντολή "διαχειρίζεται" απλές μεταβλητές τύπου χαρακτήρα, ενώ η δεύτερη ολόκληρη συμβολοσειρά! Αυτή είναι και η διαφορά στον ορισμό char rs232 (εδώ δηλώνουμε μία μεταβλητή τύπου χαρακτήρα με το όνομα rs232), από τον ορισμό char rs232[4] (εδώ δηλώνουμε έναν πίνακα 4 θέσεων που τα στοιχεία του είναι χαρακτήρες). Ο ορισμός του τετραθέσιου πίνακα είναι "προσαρμοσμένος" πάνω στη διαχείριση των δεδομένων που θα διαβάσουμε από την σειριακή. Στην εφαρμογή σου που ίσως θεωρείς ότι στέλνεις έναν αριθμό στην πράξη στέλνεις συμβολοσειρά (=πολλοί χαρακτήρες μαζί. Θεωρώντας ως μέγιστο το "1023" θα έχουμε 4 ψηφία που θα πρέπει να διαβάσουμε).

    Μία ενδιαφέρουσα παραλλαγή θα ήταν από την σειριακή να έρχονται κατευθείαν τα δεδομένα του κύκλου εργασίας, π.χ. αν στείλεις το 50, (μετά από κατάλληλη επεξεργασία) το pwm να ρυθμιστεί στο 50% [σε αντίθεση με τώρα που πρέπει να στείλεις το 512 για γίνει ο κύκλος εργασίας 50%]

    0 Not allowed! Not allowed!
    ...'Θα σε ξεχνάω κάθε μέρα'...

  9. #119
    Μέλος
    Όνομα
    Σπύρος
    Εγγραφή
    May 2010
    Περιοχή
    Κεφαλονιά Αργοστόλι
    Μηνύματα
    105

    Προεπιλογή

    Η αληθεια ειναι οτι πριν σε ρωτησω ειχα διαβασει απο το manual τι εστι καθε εντολη αλλα ηθελα μια πιο κατανοητη εννοια των εντολων, οπως επισης παρατηρησα κ το Requires: #INCLUDE <stdlib.h>(στο atol) που ειχες προτεινει.
    Κατι αλλο απο την σειριακη επικοινωνια λαμαβανουμε ASCII χαρακτηρες μονο για αυτο χρησημοποιουμε το atol?

    0 Not allowed! Not allowed!

  10. #120
    Μέλος Το avatar του χρήστη osek
    Όνομα
    Σωκράτης
    Εγγραφή
    Nov 2008
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    109

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από ventouza1987 Εμφάνιση μηνυμάτων
    Κατι αλλο απο την σειριακη επικοινωνια λαμαβανουμε ASCII χαρακτηρες μονο για αυτο χρησημοποιουμε το atol?
    Ναι. Η σειριακή στέλνει ASCII. Ο PIC τα λαμβάνει κι εμείς τα αποθηκεύουμε σε έναν πίνακα (4 χαρακτήρων). Ωστόσο για την εφαρμογή θέλουμε να χρησιμοποιήσουμε αυτά που πήραμε ως αριθμούς και όχι ως χαρακτήρες. Κάπου εκεί έρχεται να λύσει το πρόβλημα η atol() που δέχεται ως όρισμα ένα αριθμητικό string (=συμβολοσειρά) και επιστρέφει τον "αντίστοιχο" δεκαδικό αριθμό.

    0 Not allowed! Not allowed!
    ...'Θα σε ξεχνάω κάθε μέρα'...

Σελίδα 12 από 13 ΠρώτηΠρώτη ... 2 10 11 12 13 ΤελευταίαΤελευταία

Παρόμοια Θέματα

  1. Απαντήσεις: 26
    Τελευταίο Μήνυμα: 24-01-17, 14:54
  2. Προβλημα με C# (CCS)
    By dbsjro in forum Μικροελεγκτές
    Απαντήσεις: 43
    Τελευταίο Μήνυμα: 03-09-09, 02:03
  3. Παραδείγματα κώδικα c για AVR
    By nikspyr in forum Μικροελεγκτές
    Απαντήσεις: 4
    Τελευταίο Μήνυμα: 29-03-09, 18:23

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας