Σελίδα 1 από 3 1 2 3 ΤελευταίαΤελευταία
Εμφάνιση αποτελεσμάτων : 1 έως 10 από 29

Θέμα: Υπορουτίνες σε mikroc

  1. #1
    Μέλος
    Όνομα
    Αδάμ
    Εγγραφή
    Oct 2010
    Περιοχή
    Αγια Μαρίνα
    Μηνύματα
    30

    Προεπιλογή Υπορουτίνες σε mikroc

    Καλησπέρα.
    Μήπως μπορεί κάποιος να μου δείξει ένα παράδειγμα με υπορουτίνα σε mikroc?
    και πως καλείται μέσα στο πρόγραμμα.
    χρησιμοποιώ pic 16f877A.
    Ευχαριστώ εκ των προτέρων.

    0 Not allowed! Not allowed!

  2. #2
    Μέλος
    Εγγραφή
    Jun 2007
    Περιοχή
    Χανια
    Μηνύματα
    423

    Προεπιλογή

    Η ερώτηση σου είναι πολύ γενική, μπορείς να γίνεις πιο συγκεκριμένος? Θέλεις ενα οποιοδήποτε πρακτικό παράδειγμα? επίσης να υποθέσω ότι μιλάς για mikroc pro και όχι την Mikroc την παλιά ε?

    0 Not allowed! Not allowed!

  3. #3
    Μέλος
    Όνομα
    Αδάμ
    Εγγραφή
    Oct 2010
    Περιοχή
    Αγια Μαρίνα
    Μηνύματα
    30

    Προεπιλογή

    Λοιπον για να καταλάβεις τι χρειάζομαι θα πρέπει να εξηγήσω το πρόβλημα απο την αρχή.

    Φτιάχνω ένα αυτοκινητάκι το οποίο θα παρκάρει μόνο του .
    Πρέπει να το προγραμματίσω ώστε αφού "διαβάσει" την θέση και υπολογίσει ότι χωράει , να κάνει τους απαραίτητους ελιγμούς για να μπει στην θέση.
    Για να το κάνω αυτό χρησιμοποίησα μια switch(m) και στην case 2: του έγραψα όλους τους ελιγμούς που χρειάζεται . Το πρόβλημα εμφανίζεται ακριβώς σε αυτό το σημείο , Ξεκινάει να τρέχει και αφου εκτελεσει μερικες εντολες προγραμματος ξεκιναει παλι απο την αρχη . Σκεφτηκα οτι μπορει να υπαρχει ενα οριο στις γραμμες εντολων που βαζουμε σε μια case m:
    για αυτο θέλω να χρησιμοποιησω μια υπορουτινα ωστε οταν μπαινει στην case 2: να την καλει . Το προγραμμα με τους ελιγμους ειναι το παρακάτω.
    Ευχαριστω για το ενδιαφέρον.
    Κώδικας:
        case 2:
          Mprosta=0;
          Pisw=0;
          PWM1_Set_Duty(Mprosta);
          PWM2_Set_Duty(Pisw);
          Strofes=0;
          delay_ms(1000);
    
    
    
          while(Strofes<4)
          {
          Laser=ADC_Read(3);
    
          portd.Aristera=0;
          portd.Dexia=0;
          Pisw=120;
          Mprosta=0;
          PWM1_Set_Duty(Mprosta);
          PWM2_Set_Duty(Pisw);
    
          if (Laser>400)
          {
          portd.f5=1;
          Strofes=Strofes+1;
          delay_ms(100);
          }
          else
          portd.f5=0;
          }
    
          Strofes=0;
    
          while(Strofes<5)
          {
          Laser=ADC_Read(3);
    
          portd.Aristera=0;
          portd.Dexia=1;
          Pisw=0;
          Mprosta=120;
          PWM1_Set_Duty(Mprosta);
          PWM2_Set_Duty(Pisw);
          if (Laser>400)
          {
          portd.f5=1;
          Strofes=Strofes+1;
          delay_ms(100);
          }
          else
          portd.f5=0;
          }
    
          Strofes=0;
    
          while(Strofes<5)
          {
          Laser=ADC_Read(3);
    
    
          portd.Aristera=1;
          portd.Dexia=0;
          Pisw=120;
          Mprosta=0;
          PWM1_Set_Duty(Mprosta);
          PWM2_Set_Duty(Pisw);
          if (Laser>400)
          {
          portd.f5=1;
          Strofes=Strofes+1;
          delay_ms(100);
          }
          else
          portd.f5=0;
          }
    
          Strofes=0;
    
          while(Strofes<5)
          {
          Laser=ADC_Read(3);
    
          portd.Aristera=0;
          portd.Dexia=1;
          Pisw=120;
          Mprosta=0;
          PWM1_Set_Duty(Mprosta);
          PWM2_Set_Duty(Pisw);
          if (Laser>400)
          {
          portd.f5=1;
          Strofes=Strofes+1;
          delay_ms(100);
          }
          else
          portd.f5=0;
          }
                Strofes=0;
    
          while(Strofes<3)
          {
          Laser=ADC_Read(3);
    
    
          portd.Aristera=1;
          portd.Dexia=0;
          Pisw=0;
          Mprosta=120;
          PWM1_Set_Duty(Mprosta);
          PWM2_Set_Duty(Pisw);
          if (Laser>400)
          {
          portd.f5=1;
          Strofes=Strofes+1;
          delay_ms(100);
          }
          else
          portd.f5=0;
          }
          portd.Aristera=0;
          portd.Dexia=0;
          Mprosta=0;
          Pisw=0;
          PWM1_Set_Duty(Mprosta);
          PWM2_Set_Duty(Pisw);
          Strofes=0;
          delay_ms(2000);
          Yperithres=400;
          m=10;
    
          break;

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη Adamloi : 21-02-11 στις 03:41

  4. #4
    Μέλος
    Όνομα
    Αδάμ
    Εγγραφή
    Oct 2010
    Περιοχή
    Αγια Μαρίνα
    Μηνύματα
    30

    Προεπιλογή

    Oι ελιγμοι που κάνει στο περίπου είναι αυτοι που φαίνονται εδώ: http://instruct1.cit.cornell.edu/cou...kingmotion.jpg

    0 Not allowed! Not allowed!

  5. #5
    Μέλος
    Εγγραφή
    Jun 2007
    Περιοχή
    Χανια
    Μηνύματα
    423

    Προεπιλογή

    Μπορείς να βάλεις σχόλια στον κώδικα σου για να γίνει πιο γρήγορα κατανοητός?

    edit: τώρα κατάλαβα(είναι και αργά), θες το περιεχόμενο της case 2 να το κάνεις υπορουτίνα και να την καλείς.
    Εστω ότι o κώδικας σου είναι σωστός(δεν μπορώ να το ξέρω εγώ). Το όνομα της υπορουτίνας θα είναι eligmoi_parkarismatos η υπορουτίνα σου θα είναι:

    Κώδικας:
    void eligmoi_parkarismatos(void)
    {
    
    Mprosta=0;
          Pisw=0;
          PWM1_Set_Duty(Mprosta);
          PWM2_Set_Duty(Pisw);
          Strofes=0;
          delay_ms(1000);
    
    
    
          while(Strofes<4)
          {
          Laser=ADC_Read(3);
    
          portd.Aristera=0;
          portd.Dexia=0;
          Pisw=120;
          Mprosta=0;
          PWM1_Set_Duty(Mprosta);
          PWM2_Set_Duty(Pisw);
    
          if (Laser>400)
          {
          portd.f5=1;
          Strofes=Strofes+1;
          delay_ms(100);
          }
          else
          portd.f5=0;
          }
    
          Strofes=0;
    
          while(Strofes<5)
          {
          Laser=ADC_Read(3);
    
          portd.Aristera=0;
          portd.Dexia=1;
          Pisw=0;
          Mprosta=120;
          PWM1_Set_Duty(Mprosta);
          PWM2_Set_Duty(Pisw);
          if (Laser>400)
          {
          portd.f5=1;
          Strofes=Strofes+1;
          delay_ms(100);
          }
          else
          portd.f5=0;
          }
    
          Strofes=0;
    
          while(Strofes<5)
          {
          Laser=ADC_Read(3);
    
    
          portd.Aristera=1;
          portd.Dexia=0;
          Pisw=120;
          Mprosta=0;
          PWM1_Set_Duty(Mprosta);
          PWM2_Set_Duty(Pisw);
          if (Laser>400)
          {
          portd.f5=1;
          Strofes=Strofes+1;
          delay_ms(100);
          }
          else
          portd.f5=0;
          }
    
          Strofes=0;
    
          while(Strofes<5)
          {
          Laser=ADC_Read(3);
    
          portd.Aristera=0;
          portd.Dexia=1;
          Pisw=120;
          Mprosta=0;
          PWM1_Set_Duty(Mprosta);
          PWM2_Set_Duty(Pisw);
          if (Laser>400)
          {
          portd.f5=1;
          Strofes=Strofes+1;
          delay_ms(100);
          }
          else
          portd.f5=0;
          }
                Strofes=0;
    
          while(Strofes<3)
          {
          Laser=ADC_Read(3);
    
    
          portd.Aristera=1;
          portd.Dexia=0;
          Pisw=0;
          Mprosta=120;
          PWM1_Set_Duty(Mprosta);
          PWM2_Set_Duty(Pisw);
          if (Laser>400)
          {
          portd.f5=1;
          Strofes=Strofes+1;
          delay_ms(100);
          }
          else
          portd.f5=0;
          }
          portd.Aristera=0;
          portd.Dexia=0;
          Mprosta=0;
          Pisw=0;
          PWM1_Set_Duty(Mprosta);
          PWM2_Set_Duty(Pisw);
          Strofes=0;
          delay_ms(2000);
          Yperithres=400;
          m=10;
    
    
    }
    και πλέον η case 2 θα γίνει:

    Κώδικας:
    case 2 : eligmoi_parkarismatos(); break;

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη antonis_x : 21-02-11 στις 03:12

  6. #6
    Μέλος
    Εγγραφή
    Jun 2007
    Περιοχή
    Χανια
    Μηνύματα
    423

    Προεπιλογή

    Αλλά προκύπτουν μερικά ζητήματα όσο αφορά τυχόν τοπικές μεταβλητές που θα πρέπει να τις κάνεις global.

    Πριν μπούμε σ αυτή τη διαδικασία, στον κώδικα που έχεις παραθέσει επειδή οι εντολές μέσα στην case είναι παραπάνω από μία, εσύ δεν έχεις βάλει {}
    δηλαδή θα έπρεπε να είναι:
    Κώδικας:
    case 2 : { εντολες
    εντολες
    εντολες
    ...
    ...
    εντολές };  break;
    το χεις προσέξει αυτό?

    0 Not allowed! Not allowed!

  7. #7
    Μέλος
    Όνομα
    Αδάμ
    Εγγραφή
    Oct 2010
    Περιοχή
    Αγια Μαρίνα
    Μηνύματα
    30

    Προεπιλογή

    εχω βάλει εναν αισθητηρα(Laser) to οποιο μετραει τις στροφες τις ρόδας.
    και του λεω να κανει πχ 4 στροφες πισω με το τιμονι γυρισμενο δεξια μετα 4 στροφες πισω με το τιμονι αριστερα κλπ...
    το μπρος-πισω δουλευει με pwm ωστε να ελεγχω την ταχυτητα και το δεξια-αριστερα με πολικοτητα του μοτερ.
    το portd.f5 ειναι ενα λεντακι που αναβει σε καθε στροφη της ροδας.
    το delay_ms(100); ειναι για να εχει μια μικρη καθυστερηση στην δειγματοληψια του αισθητηρα.

    0 Not allowed! Not allowed!

  8. #8
    Μέλος
    Όνομα
    Αδάμ
    Εγγραφή
    Oct 2010
    Περιοχή
    Αγια Μαρίνα
    Μηνύματα
    30

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από antonis_x Εμφάνιση μηνυμάτων

    το χεις προσέξει αυτό?
    οχι δεν ήξερα οτι χρειάζεται .αν και απολυτως λογικο...
    Θα τα δοκιμάσω αυριο με καθαρο μυαλο και θα ενημερώσω.
    Ευχαριστω πολυ για τις μέχρι τωρα πληροφοριες .
    Καλο βραδυ.

    0 Not allowed! Not allowed!

  9. #9
    Μέλος
    Εγγραφή
    Jun 2007
    Περιοχή
    Χανια
    Μηνύματα
    423

    Προεπιλογή

    πρόσεξες αυτό που σου είπα για τα {} στον κώδικά σου?
    εντιτ: απαντήσαμε μαζί.

    0 Not allowed! Not allowed!

  10. #10
    Μέλος
    Όνομα
    Αδάμ
    Εγγραφή
    Oct 2010
    Περιοχή
    Αγια Μαρίνα
    Μηνύματα
    30

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από antonis_x Εμφάνιση μηνυμάτων
    Αλλά προκύπτουν μερικά ζητήματα όσο αφορά τυχόν τοπικές μεταβλητές που θα πρέπει να τις κάνεις global.
    Επειδή είμαι λιγο ασχετος , μπορείς να μου πεις πως να τις δηλωσω, και για ποιες μεταβλητές αναφέρεσαι?
    Η μήπως μπορείς να μου δώσεις ενα λινκ να τα διαβάσω...

    0 Not allowed! Not allowed!

Σελίδα 1 από 3 1 2 3 ΤελευταίαΤελευταία

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

  1. webserver control με mikroc
    By Killo_Watt in forum Μικροελεγκτές
    Απαντήσεις: 5
    Τελευταίο Μήνυμα: 06-10-11, 14:31
  2. Βοήθεια με PIC 16F876 και mikroC
    By ko$t@s85 in forum Μικροελεγκτές
    Απαντήσεις: 10
    Τελευταίο Μήνυμα: 22-04-09, 19:38
  3. -----mikroC for PIC--------
    By ROLAND in forum Μικροελεγκτές
    Απαντήσεις: 0
    Τελευταίο Μήνυμα: 29-01-07, 11:43

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

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