# Συζήτηση Κυκλωμάτων > Ψηφιακά Κυκλώματα > Μικροελεγκτές >  >  Αρχή με τον Atmega8 - μαθήματα μικροελεγκτών N2 (συνέχεια)

## master3763

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

spi_mc.gif

Καλό θα ήταν να τοποθετήσουμε τον μικροελεγκτή πάνω σε ειδική βάση που πωλείτε σε καταστήματα ηλεκτρονικών εξαρτημάτων, ώστε να μην λυγίζουμε και σπάμε τα ποδαράκια του ολοκληρωμένου, και στη συνέχεια την βάση μαζί με το ολοκληρωμένο κολλάμε πάνω σε πλακέτα.  Αυτό για να μπορούμε να συνδέουμε και να αποσυνδέουμε τον μικροελεγκτή όταν χρειαστεί. 

Για να μπορεί να γίνει ο προγραμματισμός πρέπει ο μικροελεγκτής να τροφοδοτείται από μία πηγή τάσης των 5 volt. Κάνει επίσης και η πλακέ μπαταρία των 4,5 volt.  To πλην συνδέουμε στο *GND* και το συν στο *AVCC* στα ποδαράκια του ολοκληρωμένου.  Και ήμαστε έτοιμοι να γράψουμε το πρώτο μας πρόγραμμα.

Ας  γράψουμε  κάτι  απλό για αρχή..  Να κάνουμε το λαμπάκι να αναβοσβήνει.

Ανοίγω το Сode Vision AVR -- >
File -- > New -- > επιλέγω Project -- > OK 
Αν εμφανισθεί το μήνυμα «Do you want to use the code wizard» πατάω όχι (No). -- > 
Βάζω όνομα αρχείου .prj -- > OK -- > στην καρτέλα που εμφανίζεται «Configure project mc.rpj» πάω C Compiler -- > επιλέγω το chip που χρησιμοποιώ ( Atmega 8 )
--- > πατάω OK.  
Στη συνέχεια πάω File -- > New -- > επιλέγω Source -- > και γράφω τον παρακάτω κώδικα :




```
#include "mega8.h" //syndeume tin vivliothiki gia ton Atmega8
#include "delay.h" //syndeume tin vivliothiki gia xronokathisteriseis

void main(void)
{
PORTD=0x00; //Eisagume ola ta pin tu port D se 0, diladi anigume oli tin port D
DDRD=0xFF; //orizume to port D san exwdo
while (1) // atermon vrogxos while
{
PORTD.0=1; //Aanavume to ledaki sto pin D.0 tou port D
delay_ms(500); // Xronokathisterisi 500 millisecond
PORTD.0=0; // Svinume to ledaki sto pin D.0 tou port D
delay_ms(500); // Xronokathisterisi 500 millisecond
};
}
```


Αποθηκεύω ( File -- > Save as -- > στο φάκελο που αποθήκευσα το αρχείο .prj ) -- > Αλλάζω και το όνομα σε mc.c
Εχω δημιουργήσει το αρχείο mc.c αλλά δεν το έχω προσθέσει στο project μου. Για να το προσθέσω πάω Porject -- > Configure -- > από δεξιά Add -- > επιλέγω το αρχείο mc.c που δημιούργησα --- > OK  -- > και έχω προσθέσει το αρχείο στο project.
Τώρα πάω Project -- > Compile για να δώ αν έχω κανένα συντακτικό λάθος.
Αν δεν έχω συνεχίζω Project -- > Build All .
Τώρα αν πάω στον φάκελο που αποθήκευα τα αρχεία μου μέσα έχει άλλον έναν φάκελο με όνομα Exe, αν τον ανοίξω θα βρω το ζητούμενο mc.hex (στη περίπτωση μου)  αρχείο που δημιούργησε το πρόγραμμα μου.
Για να εισάγω αυτό το αρχείο στον mc μου πρέπει να πάω Tools -- > Chip Programer
-- > Programm -- > FLASH
Έχουμε «εισάγει» το πρόγραμμα στον μικροελεγκτή.
Τώρα αν αποσυνδέσουμε τον μικροελεγκτή από τον προγραμματιστή, του δώσουμε την τροφοδοσία, και συνδέσουμε ένα LED λαμπάκι όπως φαίνετε στο σχήμα.
led_mc.gif

θα παρατηρήσουμε ότι θα αναβοσβήνει κάθε 500 mc  :Wink:  

Ακόμα  ποιο αναλυτικά  μπορείτε να τα βρείτε και στη προσωπική μου ιστοσελίδα :
http://jonhs.orgfree.com/microcontrollers_turials2.html

----------


## FILMAN

> #include "mega8.h" //syndeume tin vivliothiki gia ton Atmega8 #include "delay.h" //syndeume tin vivliothiki gia xronokathisteriseis  void main(void) { PORTD=0x00; //Eisagume ola ta pin tu port D se 0, diladi anigume oli tin port D DDRD=0xFF; //orizume to port D san exwdo while (1) // atermon vrogxos while { PORTD.0=1; //Aanavume to ledaki sto pin D.0 tou port D delay_ms(500); // Xronokathisterisi 500 millisecond PORTD.0=0; // Svinume to ledaki sto pin D.0 tou port D delay_ms(500); // Xronokathisterisi 500 millisecond }; }





Ευχαριστούμε. Τώρα επειδή έχω μερικές ερωτήσεις ως άσχετος από C. Τα χρωματιστά είναι αυτά
που δεν καταλαβαίνω. Ρωτάω λοιπόν:

1) Τα δυο include είναι του μεταγλωττιστή της C;
2) Τι κάνει η συνάρτηση void main (void) με αυτό το όρισμα; Ποια άλλα ορίσματα παίρνει,
και τί κάνει τότε;
3) Τι είναι αυτά τα άγκιστρα και το ελληνικό ερωτηματικό;
4) Τι κάνει η συνάρτηση while με όρισμα 1; Ποια άλλα ορίσματα παίρνει,
και τί κάνει τότε;

----------


## master3763

1) Τα δυο include είναι του μεταγλωττιστή της C;
Με το include συνδέουμε την βιβλιοθήκη που χρειαζόμαστε
Στη περίπτωση μας την mega8.h (για τον mc μας)  και την delay.h (για  χρονοκαθυστέρηση )  Είναι απαραίτητη για τη λειτουργία του *delay_ms(500);*.

2) Τι κάνει η συνάρτηση void main (void) με αυτό το όρισμα; Ποια άλλα 
ορίσματα παίρνει,
και τί κάνει τότε;
Η συνάρτηση void main (void) είναι μία συνάρτηση που δεν επιστρέφει τίποτα. Διότι στη περίπτωση μας δεν χρειάζεται να επιστρέφεται κάτι. Μέσα της γράφεται όλο το σώμα του κώδικα. 

3) Τι είναι αυτά τα άγκιστρα και το ελληνικό ερωτηματικό;
Η # και ; είναι στη σύνταξη της C++ . Με την # αρχίζουμε συνήθως τις επικεφαλίδες ( σύνδεση βιβλιοθήκης , οδηγίες στον επεξεργαστή… ) 
Και με το ; τελειώνει κάθε εντολή της C++  

4) Τι κάνει η συνάρτηση while με όρισμα 1; Ποια άλλα ορίσματα παίρνει,
και τί κάνει τότε;
Το While είναι ο βρόγχος .. ( αν ισχύει η συνθήκη μέσα στις παρενθέσεις τότε εκτελείται αυτό που υπάρχει στα {} όσο ισχύει η συνθήκη.  Στη περίπτωση μας το 1 είναι το λογικό 1 η συνθήκη μας. Που είναι πάντα αληθής. Είναι ο λεγόμενος ατέρμον βρόγχος που εκτελείται συνέχεια.

----------


## FILMAN

Ευχαριστώ για την απάντηση. Αλλά δεν κατάλαβα κάτι. Τo αρχεία include που έχω εγώ με το AVR studio για τον ATMega8 είναι το m8.def. Γι αυτό ρωτάω. Τα mega8.h και delay.h έρχονται με τον μεταγλωττιστή της C;

----------


## spiroscfu

Φίλιππε θα μπορούσε να γραφτεί και έτσι void main(), το void μπροστά από την συνάρτηση μας λέει ότι δεν επιστρέφει κάποια τιμή, αν θέλαμε να επιστρέψει έναν integer λ.χ. θα την γράφαμε έτσι int main().

Με τα #include λέμε στον compiler ότι υπάρχουν μεταβλητές συναρτήσεις κ.α. σε ένα άλλο αρχείο (σε αυτό που δείχνει το #include),
και την while(1) την κάνουμε να τρέχει συνέχεια πχ. αν ήταν while (a==b) θα έτρεχε μόνο για όσο το α είναι ίσο με το b.



Υγ.
Αυτό που δεν καταλαβαίνω είναι γιατί έχει βάλει ερωτηματικό στο τέλος της while?

----------

FILMAN (15-03-12)

----------


## FILMAN

Ευχαριστώ Σπύρο. Αλλά έχω ακόμα την απορία για τα include. Ξέρω τι κάνουν. Αυτό που ρωτάω είναι στην ουσία πού βρίσκουμε τα συγκεκριμένα αρχεία.

----------


## spiroscfu

Τα include είναι oi βιβλιοθήκες που έχει ο κάθε compiler ή τα φτιάνουν διάφοροι και τα ανεβάζουν σε κάποια site.

----------


## FILMAN

Αυτό ήθελα. Άρα λοιπόν έρχεται με τον μεταγλωττιστή της C.

----------


## PanagiotisHlektrlogos

Τις βιβλιοθήκες αυτές πως ξέρουμε ότι είναι μ αυτό το όνομα? Δηλαδή είναι κοινή η ονομασία για όλες και σε όλους τους compiler? Η αν καλέσω στο AVR Studio το delay.h θα βγάλει λάθος?

----------


## FILMAN

Μάλλον όχι. Π.χ. στο AVRStudio και γράφοντας σε assembly, το αντίστοιχο είναι το:
 .include "m8.def"
Η συνάρτηση delay δεν νομίζω να υποστηρίζεται, εκτός αν φτιάξεις εσύ μια ρουτίνα καθυστέρησης χρησιμοποιώντας κάποιον timer του μ/ε (τα λέω καλά; )

----------


## manolena

Στην assembly τα include files μπορούν να έχουν διάφορες επεκτάσεις, οι οποίες γίνονται αντιλιπτές απο τον εκάστοτε compiler. Για παράδειγμα, σε έναν AVR στο αρχείο *.def (όπου * το όνομα του αρχείου) θα βρείς όλα τα definitions που χρειάζεται ο compiler για να "χτίσει" το project. Σε έναν PIC αντίστοιχα, χρειάζονται αρχεία με επέκταση *.inc. Στην C τώρα, όλοι οι compilers αντιλαμβάνονται αρχεία με επέκταση *.h (header). Μπορείς βέβαια σε μη πολύπλοκους κώδικες, να ενσωματώσεις όποια απαραίτητα για τον συγκεκριμένο controller που χρησιμοποιείς definitions στο ίδιο αρχείο assembly ή στο ίδιο αρχείο .c του κυρίως κώδικα, ανάλογα σε ποιά γλώσσα γράφεις.

----------

PanagiotisHlektrlogos (16-03-12)

----------


## spiroscfu

> Αυτό ήθελα. Άρα λοιπόν έρχεται με τον μεταγλωττιστή της C.



Τουλάχιστον με τις βιβλιοθήκες των μ/ε που υποστηρίζει και αρκετές συναρτήσεις (delay,pwm.adc,dac,rs232,i2c,usb,lan..............  ..), αρκετή νομίζω θα έχουν και αρχεία #include σαν driver για κάποια ολοκληρωμένα.

----------


## FILMAN

Ερώτηση: Μπορεί όσο τρέχει η delay να συνεχίσει να εκτελείται ο κώδικας;

----------


## edgar

εννοεις ταυτοχρονα?
Πιστευω ναι , αρκει να χρησιμοποιησεις hardware timer αντι για software delay, δεν ξερω βεβαια γιατι να θελει καποιος να το κανει αυτο καθως ο στεφανος απο κατω επεξηγει το λογο του delay
(κραταω καποιες επιφυλαξεις , εαν κανω λαθος ας με διορθωσει καποιος)

----------


## στεφανος μιχαλης

Η απάντηση είναι όχι διότι ο λόγος που βάζεις το delay είναι να καθυστερήσεις τον μE να πάει στην επόμενη εντολή..... οπότε ουσιαστηκά εκεινή τη στιγμή σταματάει η ροή του κωδικά σου... και απλά τρέχει η ρουτίνα του delay για όσο χρόνο ορίσαμε

----------


## FILMAN

Και αν δεν θέλω αυτό; Σε μια κατασκευή σίγουρα θα θέλω όσο αναβοσβήνει ένα LED να γίνονται και άλλες λειτουργίες! Όχι να νεκρώνει η κατασκευή προκειμένου να αναβοσβήνει ένα LED! Η delay το κάνει αυτό; Αν όχι, φαντάζομαι ότι δεν θα είναι και τόσο χρήσιμη. Ξέρω πως αυτό που θέλω γίνεται με τους ενσωματωμένους timers.

----------


## edgar

Πως δουλευει μια απλη software delay?
Πρεπει να σκεφτεις οτι καθε εντολη πιανει ενα ορισμενο αριθμο κυκλων, και οτι ο επεξεργαστης εχει μια συγκεκριμενη συχνοτητα λειτουργιας.
Εαν πεις στον μ/ε με software τροπο, "θελω να περιμενεις 1 δευτερολεπτο , π.χ. 1000 κυκλους (κοινως κανε μια loop 1000 φορες) και καθε loop πιανει 1 ms. Τοτε ο επεξεργαστης θα ειναι απασχολημενος να κανει αυτην την δουλεια μεχρι να τελειωσει.

----------


## στεφανος μιχαλης

Φιλλιπε μόνο με τους timers γίνεται αυτό όπως είπες και εσύ πολύ σωστά ..... δίότι για παράδειγμα αν γράψεις 
while(1) {
       output_high(PIN_B1);
       delay_ms(200);
       output_low(PIN_B1);
delay_ms(200);
}
αν παράληλα με το delay εκτελούσαμε άλλες εντολές δεν θα κάναμε τπτ.. λογο της δομής που έχει αυτη η ρουτίνα 
τωρα φτάκσαμε ενα παλμό αλλα το προγρμμα θα μείνει εκει μεχρι να του γίνει reset... σε αντίθεση με χρήση timer θα φτιαχναμε πάλι τον παλμό και θα εκτελούσαμε και άλλες εντολές.....

----------


## spiroscfu

Την delay την χρησιμοποιούμε όταν θέλουμε να καθυστερήσουμε τον κώδικα, κάνει ατέρμονες λούπες σύμφωνα με το ρολόι που έχουμε ορίσει για να φτάσει το delay που θέλουμε,
αν θέλουμε να αναβοσβήνει ένα led και συγχρόνος να τρέχει και τον κώδικα (και εφόσον δεν είναι multitasking) τότε απλά βάζουμε έναν timer να τρέχει και ελέγχουμε την τιμή του.

----------

στεφανος μιχαλης (16-03-12)

----------


## FILMAN

Άρα λοιπόν η delay δεν είναι και τόσο χρήσιμη...

----------


## edgar

αν θες να κανεις π.χ debouncing ειναι

----------


## FILMAN

Χμ, σε αυτή την περίπτωση, ναι...

----------


## spiroscfu

Ανάλογα την εφαρμογή είναι φίλιππε.

----------


## stratos111

Αν θέλουμε π.χ. να αναβοσβήνουμε 2 led με διαφορετική καθυστέρηση το ενα 300 ms και το άλλο με 1000ms, πως το κάνουμε;Γιατι αν στο πρώτο του δώσουμε delay_ms 300 και στο δευτερο delay_ms 1000, τότε το δεύτερο θα κάνει 1300 καθυστέρηση. Θα μου πείτε, κάνε το δεύτερο 700 και θα είσαι εντάξει. Γίνετε και αλλιώς; Γιατί αν έχεις πολλά delay κάποια στιγμή δεν θα βγαίνουν οι χρόνοι.

----------


## mariosm

> να αναβοσβήνουμε 2 led με διαφορετική καθυστέρηση



Οταν θελουμε να κανουμε τετοιες δουλειες η delay ειναι μια παντελως ακαταλληλη εντολη. Μονο με χρηση timer γινονται αυτα. 
Το εχουν πει και οι προηγουμενοι οτι οταν εκτελειται η εντολη delay ο επεξεργαστης δεν κανει ΤΙΠΟΤΑ αλλο εκεινη τη στιγμη. Αρα στην ουσια "παγωνει" καθε λειτουργια 
για οσο χρονο λειτουργει το delay.

----------


## manolena

Όλοι οι μ/ε διαθέτουν τουλάχιστον ένα 8μπιτο timer module, το οποίο μπορεί να ρυθμιστεί έτσι ώστε με μια βάση χρόνου (είτε εξωτερική με κρύσταλο ή resonator είτε εσωτερική απο το δικό του RC) να δίνει διακοπές στις οποίες θα εκτελείς το άναμμα των LED σε διαφορετικά χρονικά παράθυρα. Ορίζεις λοιπόν 2 σταθερές που θα αντιστοιχούν στους χρόνους που θές για τα LED και συγκρίνεις αυτές τις τιμές ανά π.χ.10ms σε διακοπή ελέγχοντας το περιεχόμενο του timer. Όταν δείς ίδια τιμή για κάθε περίπτωση, ανάβεις τα LED. Με τη μέθοδο των διακοπών, δεν απασχολείς τον μ/ε σε βρόγχους καθυστέρησης και μπορείς να κάνεις και άλλες εργασίες.

----------

FILMAN (16-03-12)

----------


## stratos111

Κάποιο παράδειγμα;

----------


## somone

Η delay θα φανεί χρήσιμη για μικρότερες χρονικές καθυστερήσεις, αν θέλει κάποιος πχ να υλοποιήσει με software σε έναν mcu που τρέχει στα 10MHz ένα σειριακό πρωτόκολλο επικοινωνίας στο 1MHz τότε πιθανότατα την απαραίτητη καθυστέρηση ανάμεσα στις εναλαγές τον πιν του mcu θα την εισάγει με την delay. Για εφαρμογές του τύπου "θέλω να κάνω ένα πράγμα συνέχεια, να ελένχω κάτι μερικές φορές το δευτερόλεπτο και να αναβοσβήνει κ ενα led" χρησιμοποιούμε είτε timers είτε πιο απλά για καταστάσεις οπου δεν είναι σημαντικό να έχουμε μεγάλη χρονική ακρίβεια:



```
#define enda //ανάλογα με τον χρονισμό και την συχνότητα με την οποία θέλουμε να εκτελούνται τα διάφορα task 
#define endb
#define endc
void main (void) {int timea=0, timeb=0, timec=0, taks1, task2, task3;
init();
while(1) {timea++;
if(timea==enda) {task1=1;
timea=0;}
timeb++;
if(timeb==endb) {task2=1;
timeb=0;}
timec++;
if(timec==endc) {task3=1;
timec=0;}
if(task1) {task_1();
task1=0;}
if(task2) {task_2();
task2=0;}
if(task3) {ledonoff();
task_3=0;}}}
```

----------

FILMAN (16-03-12)

----------


## manolena

> Κάποιο παράδειγμα;




http://www.efundies.com/avr/avr_time...s_c_simple.htm

----------


## spiroscfu

Πχ. μπορούμε να βάλουμε έναν timer να κάνει interrupt κάθε 1mS και στην ρουτίνα isr αυξάνουμε μια μεταβλητή "a", έτσι όταν αυτή θα πάρει την τιμή 1000 θα έχει περάσει ένα δευτερόλεπτο,
όταν γίνει αυτό την μηδενίζουμε και αυξάνουμε μια άλλη "b", 
και έτσι η "b" θα αυξάνει κατά 1 κάθε ένα δευτερόλεπτο, μετά παίζουμε με αυτήν ή την μηδενίζουμε όποτε θέλουμε ή μηδενίζει μόνη της ανάλογα με το πόσα bit είναι 8bit=256sec 16bit=65536sec .....

----------

FILMAN (16-03-12), 

manolena (16-03-12)

----------


## stom

Και για να το πουμε πιο διαφορετικα, ολα τα κρισιμα εκτελουνται μεσω interrupt services ρουτινες. Ειτε ασυγχρονα (εληφθη ενας χαρακτηρας στη σειριακη πορτα, τελειωσε ενα adc conversion) ειτε συγχρονα, δλδ μεσω ενος (εσωτερικου) τιμερ που εκτελει μια ρουτινα καθε ας πουμε 1 ή 10 msec.
Για παραδειγμα καθε 10msec διαβαζει καποια bits απο ψηφιακες εισοδους και κανει διαφορες global variables true or false. Στη συνεχεια κανει καποιους υπολογισμους και ενεργοποιει καποια pins εξοδου. Ειναι βασικο σε ολες αυτες τις ρουτινες να μην υπαρχει κανενος ειδους delay.
Καπως ετσι εχουμε υλοποιησει το βασικο ελεγχο να δουλευει παντα, και μας μενει η βασικη ρουτινα πχ για να ενημερωνει lcd οθονες, να ασχολειται με το τι πατησε ο χρηστης, η ακομα και για να παιζει pacman στην οθονη... Εκει θα τρεχουν ολα οσα δεν ειναι κρισημα.

Ολα αυτα εκτος απο πολυ απλα πραγματα οπου δεν απαιτειται multitasking.
Το βασικο ειναι οτι εδω πρεπει να συνεργαζονται ολα τα tasks του multitasking. Αν ενα κολλησει, τελειωσαμε. Γιαυτο και λεγεται και cooperative multitasking.
Οσο το project ειναι μικρο, δουλευει τελεια. Ετσι και μεγαλωσει....χανεται η μπαλα.
Ετσι δουλευαν τα windows 3.1

----------


## kitMAN

Για σας. Έχω και εγώ κάποιες απορίες σχετικά με το παράδειγμα του Γιάννη.
Καταρχήν σε ένα τόσο απλό πρόγραμμα πρέπει οπωσδήποτε να ορίσουμε τη main; Την πρώτη εντολή μέσα στη main “PORTD=0x00;” δεν μπορούμε να την παραλείψουμε; Εάν στον καταχωρητή DDRD θέλουμε να δώσουμε την τιμή 01000001 σε δυαδική μορφή, τι θα γράφαμε μετά το “DDRD= ” ;

----------


## edgar

την main την βαζεις ωστε να καταλαβει ο compiler οτι εκει "ξεκιναει" ο κωδικας.
edited εγραψα λαθος σορρυ

----------


## manolena

Η main() είναι η κύρια ρουτίνα του προγράμματος. Χωρίς αυτήν, ο compiler δεν μπορεί να "χτίσει" τον κώδικα. Πάντα έχει μορφή:void main(void) ή void main(){   ...code...}...και δεν χρειάζεται να κάνεις declaration με ( :Wink:  στο τέλος, όπως θα έκανες σε μια κανονική ρουτίνα του προγράμματος. Μέσα στη main κάνεις όλα όσα έχεις σχεδιάσει στο πρόχειρο διάγραμμα ροής στο χαρτί.Τώρα, η πρώτη εντολή που λές, χρειάζεται για την αρχικοποίηση της πόρτας και γραμμένη έτσι, γυρνά όλα τα bit σε 0. Σε 8μπιτους μ/ε μπορεί να πάρει τιμές απο 0-255 (δεκαδικό) ή 0x00-0xFF δεκαεξαδικό ή 0b00000000-0b11111111 δυαδικό. Για το τελευταίο, χρησιμοποίησε το calculator των Windows σε επιστημονική μορφή και κάνε τις ματατροπές στις τιμές.

Συγχωρήστε μου το γράψιμο, είναι απο κινητό...

----------

FILMAN (19-03-12)

----------


## spiroscfu

Τι να σου συγχωρέσουμε ρε Μάνο, μια χαρά είναι και τα γραφόμενα αλλά και τα εννοούμενα σου!

----------

manolena (16-03-12)

----------


## manolena

Όπως λοιπόν λέω πάντα, δεν μπορείς να καταφέρεις και πολλά χωρίς διάβασμα. Άν στο Google χτυπήσεις " simple AVR C courses" και ανοίξεις την πρώτη επιλογή σε .pdf θα δείς ένα εξαιρετικό tutorial για μ/ε AVR σε λογισμικό ανοιχτού κώδικα GCC, το WinAVR (δωρεάν). Μπορείς έτσι να κάνεις τις δοκιμές σου και θα λύσεις πολλές απο τις απορίες σου.

----------


## kitMAN

Α’…. Τότε μπροστά από την δυαδική τιμή βάζουμε “0b” και μπροστά από δεκαεξαδική που βάζουμε “0x”.
Ο Mega8 από default έχει όλες τις πόρτες δηλωμένες ως εισόδους, δηλαδή “DDRD=0”. Οπότε όταν σε αυτή την περίπτωση δώσουμε “PORTD=0”, απενεργοποιούμε τις αντιστάσεις pull up, οι οποίες είναι είδη απενεργοποιημένες από default. Παρακάτω ορίζουμε όλη την πόρτα σαν έξοδο DDRD=0xFF και έτσι o καταχωρητής PORTD ελέγχει τώρα την κατάσταση της εξόδου της πορτας 0 ή 1 και όχι την ενεργοποίηση ή την απενεργοποίηση των pull up αντηστάσεων.  Επειδή γραφώ ήδη σε BASCOM, προσπαθώ να καταλάβω σιγά σιγά και τα κόλπα της C. Εντάξει με τη void και τα ορίσματά της αλλα πιστεύω πως η εντολή  PORTD=0x00; στο σημείο που βρίσκεται είναι άχρηστη ουσιαστικά.

----------


## manolena

Συνήθως, για κάποιον κώδικα που γράφεις, θέλεις να εκτελείται συνεχώς επαναλαμβανόμενος, χωρίς να σταματά κάπου αυτοκτονώντας. Για αυτό λοιπόν θα δείς πως συνήθως μέσα στη main() υπάρχει και μια ρουτίνα while της μορφής while(1) {...code...}. Η ρουτίνα αυτή είναι ατέρμονας βρόγχος, δηλ. επαναλαμβάνεται συνεχώς αν δεν γίνει reset για κάποιο λόγο. Πριν τη while() θα δείς οτι γίνονται όλες οι αρχικοποιήσεις σε πόρτες, timers, comparators, ADC ή ό,τι άλλο hardware του μ/ε θα χρησιμοποιηθεί. Όλα αυτά δε, εκτελούνται μέσα στη main().

----------

