# Συζήτηση Κυκλωμάτων > Ψηφιακά Κυκλώματα > Μικροελεγκτές >  >  pic από την αρχή

## soulhealer

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

Για αρχή παρήγγειλα από ebay ένα interface usb 40pin και 2 Χ 16F84A (σε περίπτωση που κάψω τον έναν) για να ξεκινήσω..
η πλακέτα θα είναι εδώ σε 5-7 μέρες.. 

έχω:
1- breadboard
10- leds
10- 370Ω αντιστάσεις για τα led
1- crystal@ 4Mhz
και όρεξη για προγραμματισμό..

έχω κατεβάσει το microBasic pro (DT200!! thanks) και κάποια pdf που 
υπήρχαν στην ίδια σελίδα.. 
τι άλλο μου λείπει για να περάσω μέσα στον pic το πρόγραμμα σε hex ώστε να μου ανάψει ένα led για αρχή??

Τώρα τι άλλο θα χρειαστώ για να αρχίσω τα πειράματα?? μόνο με μικροbasic κάνω την basic - hex σωστά?? και πως θα καλωδιώσω (κάποια μπουτόν άν πιστεύετε πως θα χρειαστώ)??

----------


## billtech

λοιπον εγω ειμαι μεσα να σε βοηθεισω σε οτι θες οπως βοηθεισε ακριβως εμενα ο DT200 πριν κανα χρονο περιπου και τον ευχαριστω πολυ.
αλλα οτι σου λεω εγω θα ειναι για την mikrobasic την απλη.

καταρχας διαβασε αυτα εδω.ριξε τους μια ματια.
http://www.hlektronika.gr/forum/showthread.php?t=43400

για να φορτωσεις το hex σου στον επεξεργαστη σου αμα θες χρησιμοποιησε το WinPIc800.
αν θες παρα να δουλευεις σε Breadboard μπορω να σου στειλω καποια σχηματικα ετοιμα τα PCB να τα εμφανισεις και να δουλευεις πανω σε αυτα.

και οτι θες...εδω ειμαστε...καλη αρχη αδερφε.

----------


## stom

Παρε και κανεναν Avr...  :Angry:

----------


## soulhealer

φίλε σοτ πρώτον για avr είναι αργά γιατί είδη έχουμε παραγγείλει με τα παιδιά πλακέτες (interface) usb οπότε σε avr, πιο μετά..
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>
επειδή έφτιαξα παλαιότερα το jdm εδώ από το site, αλλά δεν κατάφερα ποτέ να το δω από την σειριακή μου, βρήκα αφορμή πάλι και με την ευκαιρία αγόρασα έναν έτοιμο usb ώστε να ξέρω ότι τουλάχιστον hardware είμαι οκ..
τώρα ρε βασίλη αν μπορείς να μου στείλεις και τα τυπωμένα σου θα σου είμαι υπόχρεος, αλλά και αν έχεις ένα απλό έτοιμο πρόγραμμα για το πως δηλώνεις μεταβλητές και σταθερές σε μια απλή εφαρμογή.. π.χ πως ανάβω με μια είσοδο ένα led  και ένα δεύτερο πρόγραμμα πως ανάβω με μια είσοδο ένα led αλλά με καθυστέρηση αυτήν τη φορά..
πιστεύω πως είναι η πιο κατάλληλη μέθοδος για να αρχίσω να προγραμματίζω pic..

----------


## billtech

Αυτα που σου ειπα τα διαβασες?τους εριξες μια ματια?

επισης και μεσα απο το Help της Mikrobasic και απο τα παραδειγματα  θα βρεις μεγαλη βοηθεια...

για το PCB θα στο κανω ενα PDF και θα στο στειλω.εκτος και αν εχεις το protell 99SE να σου στειλω το αρχειο να κανεις και αλλαγες και προσθαφαιρεσεις πανω.τι προτιμας?

----------


## soulhealer

> Αυτα που σου ειπα τα διαβασες?τους εριξες μια ματια?
> 
> επισης και μεσα απο το Help της Mikrobasic και απο τα παραδειγματα  θα βρεις μεγαλη βοηθεια...
> 
> για το PCB θα στο κανω ενα PDF και θα στο στειλω.εκτος και αν εχεις το protell 99SE να σου στειλω το αρχειο να κανεις και αλλαγες και προσθαφαιρεσεις πανω.τι προτιμας?



protell 99SE τι είναι αυτό δεν γνωρίζω.. στεί΄λε τα μου σε pdf δεν με πειράζει
ίσα ίσα που θα εξασκηθώ στο να τα γράψω ξανά στο πρόγραμμα.. \
Το λινκ που μου έδωσες το διάβασα και πριν καν κάνω αυτό το ποστ αλλά έχω λίγο πρόβλημα στο να καταλάβω τι θέλετε να κάνετε με την κάθε εντολή.. δηλαδή ο 16f84a έχει 4 πόρτες a/b/c/d σωστά??
μπορώ να κάνω όποια θέλω είσοδο και όποια θέλω έξοδο? πως το δηλώνω?? ξέρω είναι το "tris  %" και κάτι νούμερα να ακολουθούν αλλά δεν τα καταλαβαίνω γιατί δεν τα έχω διαβάσει κάπου..

----------


## billtech

λαθος.πηγαινε στο datasheet του και δες τα ποδαρακια...
δες ποσες πορτες εχει.
στο παραδειγμα 1
http://www.hlektronika.gr/forum/showthread.php?t=42827
στο σχολιο #6 στη τριτη Γραμμη γραφει πως κανεις μια πορτα εισοδο η εξοδο..
το ιδιο ισχυει και για την αλλη πορτα απλα αλλαζεις το TRISΒ σε A.

----------


## soulhealer

είσαι φοβερός.. άρα ότι έχει "1" είσοδος και ότι έχει "0" 'εξοδος..
τέλεια..τώρα το κατάλαβα..
και όταν γράφεις PORTB.0=1 στην απο κάτω γραμμή τι σημαίνει?
ότι κάνεις πρώτη είσοδο της πόρτας Β high?

----------


## billtech

εδω σου επισυναπτω τα κυκλωμα που χρησιμοποιουσα εγω με αυτον τον επεξεργαστη για να μαθω τους PIC.

κοιταξε το και αν σου αρεσει τυπωσε το.
ειναι κατι πολυ απλο.

----------


## soulhealer

και κάτι άλλο (σε ρωτάω όχι τόσο από άγνοια αλλά και για επιβεβαίωση,έτσι?)
με την άνω κάτω τελεία δηλώνεις υπορουτίνα στην οποία δεν μπαίνει το πρόγραμμα εκτός αν πάρει εντολή από goto command?

----------


## billtech

> είσαι φοβερός.. άρα ότι έχει "1" είσοδος και ότι έχει "0" 'εξοδος..
> τέλεια..τώρα το κατάλαβα..
> και όταν γράφεις PORTB.0=1 στην απο κάτω γραμμή τι σημαίνει?
> ότι κάνεις πρώτη είσοδο της πόρτας Β high?




ναι.
οταν κανεις την πορτα 
TRISB=%11110000 σημαινει οτι τα ποδια της πορτας 4-7 ειναι εισοδοι και τα 0-3 εξοδοι.
με την εντολη PORTB.0=1 σημαινει οτι το ποδαρακι 0 που ειναι εξοδος το κανει high οπως ειπες  και εσυ.

----------


## billtech

> και κάτι άλλο (σε ρωτάω όχι τόσο από άγνοια αλλά και για επιβεβαίωση,έτσι?)
> με την άνω κάτω τελεία δηλώνεις υπορουτίνα στην οποία δεν μπαίνει το πρόγραμμα εκτός αν πάρει εντολή από goto command?



εξαρταται.
οπως βλεπεις το main ξεκινα οταν ξεκινα ο κωδικας χωρις να του πεις να παει στο main,και μετα που τελειωνει το main παει στο START παλι χωρις να του πεις. αλλα να ξαναπαει στο STARTοταν του λες εσυ με την εντολη goto.




```
program enoee

main:
TRISB=%11110000   '7,6,5,4 eisidos//3,2,1,0 exodos
PORTB.0=1

START:
delay_ms(200)
......
....
...
```


το κομματι αυτο ειναι απο τον παραδειγμα1.

----------


## lordi

Θα σου έλεγα να ασχοληθείς και λίγο με assembly! Σίγουρα όμως να διαβάσεις καλά το datasheet του PIC σου! Για να ξέρεις τι προγραμματίζεις όχι τίποτα άλλο!

Για πιο υψηλού επιπέδου γλώσσα θα πρότεινα την C!

Καλή αρχή!

----------


## soulhealer

δηλαδή έστω ότι αγόρασα 5 μπουτόν και 3 led και θέλω να παίξω με την πόρτα c γιατί τις Α και Β τις έκαψα (ή είναι κατειλλημένες από άλλες εφαρμογές) το πρόγραμμα μου γίνετε:

main:
 trisc=%11111000
portc.0=0
portc.1=0
portc.2=0

if portc.7=1 then
   portc.0=1
   portc.1=1
   portc.2=1
endif

----------


## billtech

ο PIC16F84A ποιες πορτες εχει?

----------


## soulhealer

2 πόρτες έχει Α και Β μόνο.. απλά την φιλοσοφία ήθελα λίγο να δω..
http://ww1.microchip.com/downloads/e...doc/35007b.pdf
και κάτι άλλο βασίλη:
όταν γράφεις:
main:
trisB=%11000000  'σημαίνει πόρτες 7/8 εισόδοι και τα υπόλοιπα εξόδοι
led= %11000011   'τι σημαίνει??
portB=255            'τι σημαίνει??
μετά κάνεις 0.5sec καθυστέρηση και μετά την καθυστέρηση
όλοι οι εξόδοι PORTΒ γίνονται "0"..??

----------


## billtech

> δηλαδή έστω ότι αγόρασα 5 μπουτόν και 3 led και θέλω να παίξω με την πόρτα c γιατί τις Α και Β τις έκαψα (ή είναι κατειλλημένες από άλλες εφαρμογές) το πρόγραμμα μου γίνετε:
> 
> main:
>  trisc=%11111000
> portc.0=0
> portc.1=0
> portc.2=0
> 
> if portc.7=1 then
> ...



ναι σωστος εισαι...

----------


## soulhealer

> ναι σωστος εισαι...



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

----------


## billtech

> ωραία τότε.. αφού έχω πιάσει την λογική πάμε να το κάνουμε και πραγματικό..
> απλά αν μπορείς πρώτα, εξήγησε μου το προηγούμενο ποστ που έκανα, για να σου γράψω ένα πρόγραμμα από την αρχή με σταθερες μπουτόν και led και με διορθώνεις..



αν μιλας για αυτο εδω



```
program enoee
DIM BUT   AS BYTE
DIM LED AS BYTE
main:
  TRISB=%11000000
  LED  =%11000011
  PORTB=255
  DELAY_MS(500)
  PORTB=0

START:
```


με την εντολη 
PORTB=255 ειναι το ιδιο με την εντολη PORTB=%11111111
και μετα απο μισο δευτερολεπτο την κανεις 0.
στη ουσια απλα οταν ξεκινα το προγραμμα αναβοσβηνεις τις led μια φορα απλα.
και μετα προχωρας στο start.

σου ξαναλεω...κοιταξε καλα στο help τα mikrobasic libraries...για οτι κανεις να συμβουλευεσε το help ειναι πολυ καλο...


α και το LED  =%11000011 ειναι απλα ενας byte καταχωρητης που απλα εκει του δινεις μια τιμη.που θα την καταλαβεις παρακατω στο προγρααμμα..μην δινεις σημασια σε αυτο τωρα εσυ.

και αν θελεις καλυτερα ειναι να δουλεψεις σε mikrobasic την απλη πρωτα για να μπορω και εγω να τρεχω τα προγραμματα σου να βλεπω πως πανε αν εχεις καποιο προβλημα καπου.

----------


## soulhealer

θα με βοηθούσες πολύ να μου τρέξεις τα προγράμματα που θα φτιάξω ,γιατί για την ώρα δεν έχω ακόμα τον programmer.. 
ερώτηση όμως πρώτα, γιατί μπερδεύτηκα λίγο:
πρώτα δηλώνεις την portB με 4 εισόδους, 4 εξόδους..
μετά με το PORTB=255 κάνεις "1" μόνο τις εξόδους ή και τις εισόδους ή και τα δύο??

----------


## billtech

οσα ειναι δηλωμενα εισοδοι και που τα κανεις 1 δεν σημαινει τπτ για αυτα...
μην μπερδευεσε με αυτο....θα δεις και πολλα στη πραξη...
στο PCB το κοιταξες?κανε το προγραμμα και μιλαμε...

----------


## soulhealer

βασίλη όταν βρεις λίγο χρόνο δες αυτό..
ευχαριστώ πάντως πάρα πολύ που ασχολήσαι..


program ledtest
' Declarations section 

DIM I AS INTEGER     'dilosi metablitwn


main:
TRISB=%11110000      'bazo 4 mpoyton kai 4 LED na doulepso
PORTB=0                   'midenizo tis eisodoeksodous tis portas B

start:                       'simeio anaforas gia anabosbima tou protoy led
if PORTB.7=1 then      'an patithei to proto mpouton
 PORTB.0=1               'anapse to proto led
 delay_ms(1500)        'perimene 1.5 sec
 PORTB.0=0               'sbise to proto led
   goto start              'kane loop
       else                  'allios
 FOR I=0 TO 3 STEP 1     'plithow epanalipseon anabosbisimatos
  PORTB.0=1                  'anapse to proto led
  PORTB.1=1                  'anapse kai to deftero led
  DELAY_MS(1000)          'perimene 1 sec
  PORTB.0=0                  'sbise to proto led
  PORTB.1=0                  'sbise kai to deftero led
 NEXT I                        'epanalipsi

end if

----------


## billtech

δεν δουλευει...
πηγαινει στο παραδειγμα 1 στο σχολιο #7 και δες τι μου γραφει ο DT200. και πως μου προτινει την λυση..
το δοκιμασα τωρα αλλα δεν παιζει...

καταρχας ξαναδιαβασε το προγραμμα σου...δεν το βγαζεις ποτε απο το if η απο το else...

σε οποιο απο τα 2 μπει δεν ξαναβγαινει...ξανακοιταξε το λιγο...

----------


## soulhealer

ξέχασα μετά το endif στο τέλος να προσθέσω ένα goto start..
ναι το ξέρω ότι το έχω κλείσει σε ένα ατέρμονο λουπ..
έκανα μια ρουτίνα που να ελέγχει συνεχώς τον διακόπτη και ανάλογα αν είναι πατημένος να βγάζει τα αντίστοιχα αποτελέσματα..
αν τον κρατήσω πατημένο τότε θα μου αναβοσβήνει ένα led..
αν δεν τον πατήσω (ποτέ) ή αν τον πατήσω και τον αφήσω μετά, τότε
το πρόγραμμα ήθελα να μου αναβοσβήνει 2 led..
αυτό ήθελα να κάνω για αρχή.. 

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

----------


## soulhealer

σου γράφω και σχόλια δίπλα από κάθε βήμα μου για να παρακολουθείς το σκεπτικό μου... και να με διορθώνεις εννοείται..
 απλά με μπερδεύει λίγο το ότι δηλώνει τα Button και τα LEd στην αρχή
και μετά το πως τα χρησιμοποιεί στο πρόγραμμα.. δεν το έχω καταλάβει αυτό το κομμάτι ακόμα.. 
αλλά που θα μου πάει??

----------


## soulhealer

πίσω από το σκεπτικό με τον διακόπτη είχα στο μυαλό μου ένα σύστημα με μια ακτίνα λέιζερ ίσως (αντί για μπουτον) όπου αν διακοπεί τότε να δίνει ένα αλάρμ (διαφορετικό αναμμα led).. αλλιώς όσο μένει συνεχώς η ακτίνα στην είσοδο 7 να μου ανάβει ένα led σαν να είναι το σύστημα σε standby..

----------


## billtech

μα δεν θα δεις ποτε την διαφορα στο button ετσι οπως το εκανες...
εδω σου εχω αλλο παρομοιο κωδικα να του ριξει μια ματια.
δουλευει.



```
program LEDTEST

dim i as byte

main:
TRISB=%11111111 'bazo 4 mpoyton kai 4 LED na doulepso
PORTB=0
TRISA=%0000
PORTA=255
DELAY_MS(500)
PORTA=0

start: 'simeio anaforas gia anabosbima tou protoy led
       delay_ms(100)
       if Button(PORTB, 7, 100, 1) then 'an patithei to proto mpouton
       SetBit(PORTA, 0)                 'anapse to proto led
       SetBit(PORTA, 1)
       SetBit(PORTA, 2)
       SetBit(PORTA, 3)
       
       delay_ms(500)
       ClearBit(PORTA, 0) 'sbise to proto led
       ClearBit(PORTA, 1)
       ClearBit(PORTA, 2)
       ClearBit(PORTA, 3)
       
       delay_ms(500)
       SetBit(PORTA, 0) 'anapse to proto led
       SetBit(PORTA, 1)
       SetBit(PORTA, 2)
       SetBit(PORTA, 3)
       
       delay_ms(500)
       ClearBit(PORTA, 0) 'sbise to proto led
       ClearBit(PORTA, 1)
       ClearBit(PORTA, 2)
       ClearBit(PORTA, 3)
       
       else
       if Button(PORTB, 6, 100, 1) then 'an patithei to deytero mpouton
          for i=1 to 3
              SetBit(PORTA, 0) 'anapse to proto led
              SetBit(PORTA, 1)
              SetBit(PORTA, 2)
              SetBit(PORTA, 3)

              delay_ms(500)
              ClearBit(PORTA, 0) 'sbise to proto led
              ClearBit(PORTA, 1)
              ClearBit(PORTA, 2)
              ClearBit(PORTA, 3)
              delay_ms(500)
              
              next i
              end if

       end if
       goto start
end.
```


προσπαθησε να καταλαβεις αυτο το κωδικα.

επισης καταλαβε αυτο του DT200 στο * 	 Μάθημα στην MikroBasic No1*  το σχολιο #7.

----------


## soulhealer

xm μάλιστα! ωραία τώαρ ξέρω πως αλλάζω κατάσταση σε βιτ πόρτας..με SetBit kai ClearBit.. δεν τις ήξερα αυτές τις εντολές..
επίσης για να μπορέσω να διαβάσω και το σχόλιο #7 του DT200 θ πρέπει να μου πεις 2 πράγματα πρώτα..
1) όταν σου λέει BUT=PORTB τι σημαίνει??
και 
2) όταν λέει PORTB=LED τι αλλάζει??
και αφού έχει δηλώσει αρχικά 2 εισόδους και 6 εξόδους πως μπορεί και 
κάνει LED.7=1 kai LED.1=1??

----------


## billtech

> xm μάλιστα! ωραία τώαρ ξέρω πως αλλάζω κατάσταση σε βιτ πόρτας..με SetBit kai ClearBit.. δεν τις ήξερα αυτές τις εντολές..
> επίσης για να μπορέσω να διαβάσω και το σχόλιο #7 του DT200 θ πρέπει να μου πεις 2 πράγματα πρώτα..
> 1) όταν σου λέει BUT=PORTB τι σημαίνει??
> και 
> 2) όταν λέει PORTB=LED τι αλλάζει??
> και αφού έχει δηλώσει αρχικά 2 εισόδους και 6 εξόδους πως μπορεί και 
> κάνει LED.7=1 kai LED.1=1??



οπως βλεπεις o BUT και ο LED ειναι δυο καταχωρητες...οι οποιοι με την εντολη
BUT=PORTB βαζεις την κατασταση της πορτας στο BUT και ελεγχεις τα bit του καταχωρητη που αντιστιχουν με εκεινα της πορτας....

και οταν βαζεις το PORTB=LED στον LED εχεις την κατασταση που θελεις να εχει η PortB σαν εξοδος...το γιατι?διαβασε τα σχολια του Γιαννη και θα καταλαβεις...

----------


## soulhealer

Βασίλη, τελικά έκατσα 2 βράδια και μετά από δουλειά,αλλά 
δεν το βρήκα το πρόβλημα.. οπότε "έκλεψα" και το κοίταξα 
από το σωστό που σου είχε στείλει ο γιάννης.. 
δεν υπήρχε περίπτωση να το δω το λάθος... 
τώρα σου ετοιμάζω άλλο προγραμματάκι να μου πεις αν είναι σωστό..
να σε ρωτήσω κάτι άλλο:
εσύ πως βλέπεις το πρόγραμμα ότι είναι σωστό? το φορτώνεις σε πικ και μετά το τρέχεις ,ή έχεις κανένα πρόγραμμα εξομοίωσης που το κοιτάς??
α! και κάτι άλλο μπορώ να κάνω πιν πόρτας του 16φ84Α αναλογική??
να την δουλέψω δηλαδή με φωτοαντίσταση??

----------


## Stergios_[.gr]

Να σε προλάβω τώρα που είναι νωρίς.. 

ΑΝ θες να έχεις κάποιο TESTBED για να δουλέψεις καιρό πάνω του, καλύτερα να μην επενδύσεις πολύ χρόνο στον PIC16F84A...
Δεν έχει ADC, δεν έχει PWM, δεν έχει ΕΕPROM, δεν USB, δεν.., δεν... Εϊναι πολύ παλιός.

Καλύτερα να αρχίσεις με κάποιον άλλον, όπως ο PIC16F887 (πολλά παραδείγματα της MikroBasic είναι γραμμένα για αυτόν) ή αν θέλεις να κάνεις σωστή δουλειά με κάποιον καινούργιο PIC που θα τον δουλεύεις για πολύ καιρό, δοκίμασε κανέναν PIC18F**** (πχ PIC18F2550) που έχουν και USB, και ADC, και SPI, και UART και πολλά-πολλά άλλα..

Εγώ άρχισα με ένα kit της MicroChip, το PICKIT 2 DEBUG EXPRESS, που είχε και In Circuit Debugging και ακόμα αυτό δουλεύω τις πρόχειρες ιδέες μου!

 Βέβαια, ποτέ δεν χρησιμοποίησα την MPLAB που έδινε η Microchip, μόνο την MikroBasic PRO, αλλά υπήρχαν πολλά έτοιμα παραδείγματα γραμμένα για τον PIC16F887, που το μόνο που χρειαζόνταν να κάνω, ήταν να αλλάξω τα μερικά πινς για να δουλέψουν στην πλακέτα μου.

----------


## billtech

Στεργιε συμφωνω μαζι σου αλλα και το επεξεργαστης που αρχισε να ασχολητε μια χαρα ειναι...γιατι οι επεξεργαστες της σειρας που λες εσυ κια πιο πανω ναι μεν εχουν πραματα παραπανω αλλα μην ξεχνας οτι (νομιζω εσυ ησουν δεν ειμαι και σιγουρος) που δεν μπορουσες να τρεχεις ενα κωδικα γιατι ηταν αναλογικες οι πορτες...γιαυτο ασε τον να ασχοληθει..να μαθει την νοοτροπια προγραμματισμου και μετα παει στον επεξεργαστη που λες εσυ η ακομα παραπανω..εγω ειμαι στον PIC18F452.

α και ο 84A για μικρες εφαρμογες απλους ελεγχουν ειναι μια χαρα...δεν χρειαζεται να καταναλωνεις ενα επεξεργαστη με μεγαλη δυναμη και δυνατοτητες για να κανεις κατι απλο που και χωραει και γινεται με τον 84Α.

Φιλικα Βασιλης...

----------


## Stergios_[.gr]

Πολύ καλά τα λες Βασίλη! Εγώ είχα κολλήσει ώρες ατελείωτες χωρίς να μπορώ να ενεργοποιήσω λειτουργία ΚΟΥΜΠΙΟΥ στον 887, γιατί η πόρτα ήταν δηλωμένη ως αναλογική..

Όπως τα λες, παλιός αλλά απλός ο PIC16F84A, 
καινούργιου και με περισσότερο μέλλον οι επόμενοι.

Όσο για την υπερ-διαστασιολόγηση στην επιλογή μΕ, ε, αν με 1.80€ παίρνεις 84Α, και με 2.20€ παίρνεις 887, μας παίρνει να τα δώσουμε..

----------


## billtech

μα δεν μιλησα απο θεμα χρηματων....αλλα απο επεξεργαστικη ισχυ.

----------


## soulhealer

κοίτα βασικά έχω σκοπό 
να φτάσω αρκετά γρήγορα σε επίπεδο lcd 2 γραμμών
και οδήγηση σερβο..αλλά πρέπει να αρχίσω από κάπου απλά όπως λέει και ο βασίλης.. τώρα η πλακέτα που παρήγγειλα πρέπει να κάνει και για πικ 18φ..
απλά είχα την εντύπωση πως μπορούσα να δουλέψω είσοδο του 16φ84 
ως αναλογική..
και βασίλη εσύ πως δοκιμάζεις τα προγράμματα από το microbasic??
έχεις testboard?

----------


## billtech

εχω το breadboard Που σου εστειλα και δεν ξερω αν ασχοληθηκες....
αλλα τα κανω και εξομοιωση στον υπολογιση στο Proteus.

----------


## soulhealer

δεν έχω ακόμα τον προγραμματιστή οπότε δεν μπορώ να δουλέψω σε breadboard..
οπότε κοιτούσα για μια software λύση..

----------


## Stergios_[.gr]

Soulhealer, γιαυτό πρότεινα ένα λίγο ισχυρότερο PIC.. 

Το λέω γιατί εγώ με τον PIC1F887 έκανα ακριβώς αυτό, ένα servo και 4Χ20 LCD...

----------


## Stergios_[.gr]

Για έτοιμο σέρβο με PIC16F84A κοίτα εδώ: 
http://www.rentron.com/SerialServo.htm
http://www.digitalnemesis.com/info/projects/picservo/
http://www.pages.drexel.edu/~kws23/t...s/PWM/PWM.html
Καταλαβαίνω όμως ότι δεν χρειάζεσαι έτοιμο, αλλά έδαφος για να εξασκηθείς..

----------


## soulhealer

στεργιο ευχαριστώ πολύ.. επειδή ήδη έχουμε αγοράσει τους 16F84A οπότε θα παίξουμε λίγο με αυτούς και μετά θα πάμε σε κάποιον πιο μεγάλο, για να φτάσουμε στο ζητούμενο μας.. την κατασκευή ενός ρομποτ που θα οδηγείται από σερβο.. θα μας ήταν πάρα πολύ εύκολο και γρήγορο φαντάζομαι να βρούμε έτοιμες ρουτίνες και να τις παντρέψουμε ώστε να το κάνουμε πιο γρήγορα.. αλλά αν καλλήσουμε κάπου? καλύτερα να πάμε μόνοι μας να δούμε λίγο την λογική σταδιακά και μετά προχωράμε σε projectakia σαν τα δικά σου

----------


## soulhealer

ξανα πάλι πίσω στους πικ... μου ήρθε τελικά ο προγκράμερ usb.. μαζί με το πρόγραμμα να φορτώνω και να διαβάζω .ΗΕΧ στον πικ..
ερώτηση τώρα: έστω από θέμα του Κώστα "http://www.hlektronika.gr/forum/showthread.php?t=43604&page=1" ο οποίος ήθελε να αναβοσβήσει κα΄ποια λεντ (βλ. #1)..
ακόμα δεν έχω καταφέρει πως να κάνω την basic - hex.. παρακαλώ ας με βοηθήσει κάποιος βήμα βήμα.. biilteck μου είχες στείλει παλαιότερα το σχηματικό από συνδεσμολογία του 
16f84a για να δοκιμάζω εκεί και όχι σε breadboard.. θα ζητήσω από Μουτουλο αν μπορεί να μου τυπώσει 2 ίδιες πλακέτες..

----------


## billtech

τι εννοεις οτι δεν μπορεις να κανεις hex?
σε ποια γλωσσα δουλευεις?Microbasic?

----------


## ptisi110

> ακόμα δεν έχω καταφέρει πως να κάνω την basic - hex.



Στο menu επιλογών έχει την επιλογή *Project->* Build. Αλλιώς με συντόμευση είναι το Ctrl+F9.
Το αρχείο .hex αποθηκεύεται στον κατάλογο που αποθηκεύεις το project σου.

edit: Ψάχνοντας βρήκα και αυτό, ίσως σε βοηθήσει.

----------


## soulhealer

> Στο menu επιλογών έχει την επιλογή Build. Αλλιώς με συντόμευση είναι το Ctrl+F9. (Αυτά στην MikroC αλλά πρέπει να είναι ίδιο και την Mikrobasic).
> Το αρχείο .hex αποθηκεύεται στον κατάλογο που αποθηκεύεις το project σου.



με ποιο πρόγραμμα το κάνετε αυτό?
δλδ αν πάρω ένα έτοιμο προτζεκτ από εδώ μέσα π.χ. ledblink σε microbasic το κάνω paste στο προγραμμα που θα μου πείτε και μετά με ctrl+F9 θα μου το κάνει .hex??
έχετε λινκ???

----------


## ptisi110

Την Mikrobasic δεν έχεις για compiler?

----------


## soulhealer

δεν έχω τιποτα... γι αυτό ζητάω βοήθεια.. 
ένα πρόγραμμα να κατεβάσω ώστε όταν του φορτώσω κάποια παραδείγματα από το site να μου τα κάνει hex για να τα φορτώσω με το δικό μου πρόγραμμα στον πικ

----------


## ptisi110

Επειδή στα ποστ που σου απαντούσαν τα παιδιά ήταν παραδείγματα σε Mikrobasic, μπορείς να την κατεβάσεις από http://www.mikroe.com/eng/products/v...c-pro-for-pic/
Ειναι Full έκδοση απλά με περιορισμό στο μέγεθος κώδικα που μπορεί να δώσει σε *hex.

*edit*:* free demo version, it cannot generate hex output over 2K of program words.

----------


## soulhealer

οκ το εγκατέστησα ευχαριστώ.. τώρα παίρνω για παράδειγμα τον κώδικα του billteck σε αυτό το θέμα σελίδα3 σχόλιο #27 και το κάνω copy - paste  στο πρόγραμμα
της microbasic pro..  αλλά μου βγάζει το παρακάτω μήνυμα όταν πάω να μετατρέψω σε .hex 
"[IMG]file:///C:/DOCUME%7E1/Teo/LOCALS%7E1/Temp/moz-screenshot.png[/IMG]main function is not defined"

----------


## billtech

ο κωδικας δεν ειναι για την PRO αλλα για την απλη.
και δεν θα το κανεις απλα copy paste.
θα κανεις νεο Project και μετα θα κανεις copy paste τον κωδικα.

----------


## ptisi110

Αρχικά διάβασε εδώ πως να φτιάξεις το πρώτο σου project.
Όταν σου δώσει την επιλογή για τον MCU που θα χρησιμοποιήσεις θα επιλέξεις αυτόν για τον οποίο ο κώδικας που έχεις είναι γραμμένος.
πχ, για τον 16F84A.

----------


## soulhealer

> ο κωδικας δεν ειναι για την PRO αλλα για την απλη.
> και δεν θα το κανεις απλα copy paste.
> θα κανεις νεο Project και μετα θα κανεις copy paste τον κωδικα.



ok εγκατέστησα την απλή έκδοση.. έτρεξα με ctrl+F9.. δεν μου έβγαλε κάποιο πρόβλημα.. 
πως βρίσκω το .hex αρχείο που έκανα μετατροπή?? δεν μου έβγαλε να κάνω save κάποιο .hex αρχείο

----------


## ptisi110

> Το αρχείο .hex αποθηκεύεται στον κατάλογο που αποθηκεύεις το project σου.



καλή τύχη :Smile:

----------


## soulhealer

> καλή τύχη



ρε παιδιά το αρχείο που μου αποθηκεύει έχει κατάληξη .pbas 
που είναι το .hex??? οεο?? δεν το βρίσκω ούτε με search 
τι κάνω λάθος??

----------


## billtech

οταν κανεις coplile κατω κατω σου βγαζει error?
εκανες νεο project...να δωσεις ονομα....μερος αποθηκευσεις...κρυσταλλο...επεξεργαστη...και default κατω κατω και μετα ok???
και μετα να κανεις copy paste το προγραμμα?

----------


## georgz

Σε ποια γλώσσα γράφεις? Arduino δεν είχες πει σε άλλο θέμα ότι θα αγόραζες??

----------


## soulhealer

> οταν κανεις coplile κατω κατω σου βγαζει error?
> εκανες νεο project...να δωσεις ονομα....μερος αποθηκευσεις...κρυσταλλο...επεξεργαστη...και default κατω κατω και μετα ok???
> και μετα να κανεις copy paste το προγραμμα?



 τα βήματα τα κάνω όπως είπες.. στο τέλος copy paste και έπειτα ctrl+F9 και στο κάτω μέρος των μηνυμάτων βγάζει σε τρεις γραμμές
s-100   success(release built) :με πράσινα γράμματα αυτό
w-101  used rom (34%)           :με κόκκινα γράμματα αυτό
w-102  free rom (66%)            :με κόκκινα γράμματα αυτό
και όταν μου ζητάει να αποθηκεύσω αποθηκεύει με επέκταση .pbas

----------


## billtech

αναιβασε μου τον φακελο που εχεις το αρχειο σου με οτι βγαζει μαζι.

----------


## soulhealer

είναι 150Μβ δεν μπορώ να στο στείλω λογικά...
τελικά έψαξα το .pbas αρχείο και βρήκα και το .hex.. και το φόρτωσα στον πικ.. τώρα μένει στο breadboard να δω αν όντως κάναμε καλή και υπεύθηνη δουλειά!!

----------


## billtech

Ποσα MB ειναι???!!!!!!

----------


## soulhealer

> Ποσα MB ειναι???!!!!!!



το .hex?? 4Κβ size on disk.. 
να σου πώ, αν σου το στείλω σε .txt (γιατί .hex δεν με αφήνει) μπορείς να κάνεις αντίστροφη διαδικασία
και από .hex να το γυρίσεις σε microbasic?? 
με ενδιαφέρει για αργότερα γι αυτο σε ρωτάω αν γίνεται και ανάποδα το convert...

----------


## ptisi110

> από .hex να το γυρίσεις σε microbasic??



Όχι δεν γίνεται. Σε assembly μπορεί να γίνει, μέσω ενός disassembler, ένα πρόγραμμα που τον έχει ενσωματωμένο είναι το WinPicProg

----------


## billtech

> το .hex?? 4Κβ size on disk.. 
> να σου πώ, αν σου το στείλω σε .txt (γιατί .hex δεν με αφήνει) μπορείς να κάνεις αντίστροφη διαδικασία
> και από .hex να το γυρίσεις σε microbasic?? 
> με ενδιαφέρει για αργότερα γι αυτο σε ρωτάω αν γίνεται και ανάποδα το convert...



 δεν καταλαβαινω γτ το θες αυτο.

----------


## soulhealer

> δεν καταλαβαινω γτ το θες αυτο.



σκεφτόμουν την περίπτωση όπου θλελω να τσεκάρω αν το .hex έχει τις εντολές που θέλω..απλά για επιβεβαίωση
double check diladi

----------


## billtech

δεν το χρειαζεσε αυτο τωρα...
κανε κωδικες πρωτα να ξεκινησεις σιγα σιγα.

----------


## soulhealer

> δεν το χρειαζεσε αυτο τωρα...
> κανε κωδικες πρωτα να ξεκινησεις σιγα σιγα.



οκ! και αφού σε εμπιστευτώ, παίρνω το σχηματικό που μου έδωσες στις πρώτες σελίδες αυτού του ποστ 
το κάνω σε διάτρητη και βάζω επάνω τον πικ με το πρόγραμμα που πέρασα εχθές μέσα να δούμε τι κάνει...
μέχρι τότε .. 1000 ευχαριστώ σε όλους!! Γειά Σας

----------


## billtech

καλη επιτυχια.

----------


## soulhealer

> καλη επιτυχια.



  επιτέλους!!! βασίλη πολύ με βόλεψε η πλακέτα σου.. την έφτιαξα σε διάτριτη βέβαια αλλά όλα καλά!!
άναψα το πρώτο λεντ.. σε πόρτα β3 και μετά με είσοδο β4-β7 άναψα εξόδους β0-β3..
θα ανεβάσω τον κώδικα και τα .hex για όποιον ενδιαφέρεται να ξεκινήσει από πολύ χαμηλά.. (όπως εγώ!!)
να είστε καλά

----------


## soulhealer

γειά σας και πάλι.. τελικά όλα πάνε καλά (με τις απλές εφαρμογές), αλλά νομίζω ήρθε η ώρα για κάτι παραπάνω.. 
προσπαθώ τώρα κάτι μέρες να κουνήσω με 16f84a ένα servo αλλά χωρίς αποτέλεσμα.. βασίλη μάλλον θα χρειαστώ τα φώτα σου πάλι (επειδή είδα ότι έχεις ασχοληθεί).
βάζω παλμό "for x=1 to 75 -> portb.7=1 -> delay_us(3000) -> portb.7=0 -> delay_ms(20) next x "     αλλά δεν κουνιέται το μοτέρ με τίποτα.. που κάνω λάθος?? 
to servo τροφοδοτήτε από διαφορετική πηγή από ότι ο πικ.. μόνο εντολή παίρνει από πικ..

----------


## soulhealer

> επιτέλους!!! βασίλη πολύ με βόλεψε η πλακέτα σου.. την έφτιαξα σε διάτριτη βέβαια αλλά όλα καλά!!
> άναψα  λεντ..με είσοδο β4-β7 άναψα εξόδους β0-β3..
> θα ανεβάσω τον κώδικα και τα .hex για όποιον ενδιαφέρεται να ξεκινήσει από πολύ χαμηλά.. (όπως εγώ!!)
> να είστε καλά



για να μην ξεχνιόμαστε
το πρόγραμμα:
program testled

 main:                      '16f84a pic with microbasic
portb=0
trisb=%11110000
delay_ms(200)
check:
if portb.7=1 then
setbit(portb,0)
end if
if portb.6=1 then
setbit(portb,1)
end if
if portb.5=1 then
setbit(portb,2)
end if
if portb.4=1 then
setbit(portb,3)
end if
goto check
end.

----------


## soulhealer

> γειά σας και πάλι.. τελικά όλα πάνε καλά (με τις απλές εφαρμογές), αλλά νομίζω ήρθε η ώρα για κάτι παραπάνω.. 
> προσπαθώ τώρα κάτι μέρες να κουνήσω με 16f84a ένα servo αλλά χωρίς αποτέλεσμα.. βασίλη μάλλον θα χρειαστώ τα φώτα σου πάλι (επειδή είδα ότι έχεις ασχοληθεί).
> βάζω παλμό "for x=1 to 75 -> portb.7=1 -> delay_us(3000) -> portb.7=0 -> delay_ms(20) next x "     αλλά δεν κουνιέται το μοτέρ με τίποτα.. που κάνω λάθος?? 
> to servo τροφοδοτήτε από διαφορετική πηγή από ότι ο πικ.. μόνο εντολή παίρνει από πικ..



λοιπόν το σερβό τελικά γύρισε μπρος και πίσω διορθώνοντας τα εξής:
1) τροφοδοσία σερβό από την ίδια πηγή..
 και κώδικας
program servocheck4

' Declarations section 
   dim x as integer
main:
'   Main program 
portb=0
trisb=%00000000

delay_ms(200)

check:

 for x=1 to 100
 setbit(portb,0)
 delay_ms(2)
 clearbit(portb,0)
 delay_ms(20)
 next x

 delay_ms(200)

 for x=1 to 100
 setbit(portb,0)
 delay_ms(1)
 clearbit(portb,0)
 delay_ms(20)
 next x
end.

το βάζετε σε microbasic kai ctrl+F9 δημιουργείται .hex και μεταφώρτωση σε προγράμμερ....
στο πορτβ.0 συνδέεται την εντολή του σερβό και δείτε το να γυρίζει..!!
επόμενο στάδιο οθόνες lcd.. οπλιστήτε με υπομονή γιατί θα επιστρέψω γεμάτος απορίες!!  :Wink:

----------


## billtech

ωραιος!!!!
μπραβο φιλε μου!!!
αντε και σιγα σιγα σε μεγαλυτερα πραματα!!!

----------


## DT200

Καλώς ήρθες στην παρέα με τους μ/ε φίλε Soulhealer !!!
καλή συνέχεια και καλή επιτυχία.

----------


## billtech

επ δασκαλε!!!!
καλος τον...
που σε χασαμε?

----------


## soulhealer

λοιπόν έχω φτιάξει τον παρακάτω κώδικα ώστε όταν ο αισθητήρας δόνησης ενεργοποιηθεί να με πάρει τηλέφωνο η μηχανή μου...
πως μπορώ να βάλω υπορουτίνα ώστε ο αισθητήρας δόνησης αν ενεργοποιηθεί 2 φορές μέσα σε 10 δευτερόλεπτα (10.000 msec) μόνο τότε να ξεκινήσει η διαδικασία
κλήσης από το κινητό τηλέφωνο?
ξέρω πως σίγουρα θα χρειαστώ καταχωρητή για να μου μετράει τις φορές που έδωσε σήμα ο αισθητήρας και να resetάρει αν περάσουν τα δέκα δεύτερα και δεν έχω δεύτερη δόνηση..

*program motoalarm

* dim i as integer

main:

portb=0
trisb=%00000000
trisa=%1111
delay_ms(200)
check:
portb.0=1             'standby led blinking
delay_ms(500)
portb.0=0
delay_ms(500)
if porta.0=0 then         'if vibration input trigged
  portb.1=1                'press "*" once for unlock
  delay_ms(50)
  portb.1=0
  delay_ms(500)
  portb.2=1                'press "ok" once  for unlock
  delay_ms(50)
  portb.2=0
  delay_ms(100)
  for i=1 to 2
  portb.3=1                'press "yes" button twice for call me
  delay_ms(50)
  portb.3=0
  next i
else
goto check
end if
end.

----------


## sotirianos

> λοιπόν έχω φτιάξει τον παρακάτω κώδικα ώστε όταν ο αισθητήρας δόνησης ενεργοποιηθεί να με πάρει τηλέφωνο η μηχανή μου...
> πως μπορώ να βάλω υπορουτίνα ώστε ο αισθητήρας δόνησης αν ενεργοποιηθεί 2 φορές μέσα σε 10 δευτερόλεπτα (10.000 msec) μόνο τότε να ξεκινήσει η διαδικασία
> κλήσης από το κινητό τηλέφωνο?
> ξέρω πως σίγουρα θα χρειαστώ καταχωρητή για να μου μετράει τις φορές που έδωσε σήμα ο αισθητήρας και να resetάρει αν περάσουν τα δέκα δεύτερα και δεν έχω δεύτερη δόνηση..
> 
> *program motoalarm
> 
> * dim i as integer
> 
> ...



Για να κάνεις αυτό που θες θα χρησιμοποιήσεις timers. Έτσι ξεκινάς ένα timer με την πρώτη ενεργοποίηση της δόνησης και εάν μέχρι να γίνει overflow ο timer έχεις και δεύτερη ενεργοποίηση κάνεις οτι χρειάζετε. 
Επίσης θα είναι καλό να δεις γενικότερα το πρόγραμμα σου και να σκεφτείς τη χρήση interrupts!

----------


## soulhealer

ένα μικρό παράδειγμα με timers?
kai interrupts?? τι είναι??

----------


## sotirianos

Interrupts είναι διακοπές κάτα την κανονική εκτέλεση του προγράμματος ή οποίες προκαλούνται απο τον μικροελεγκτή όταν συμβάινουν συγκεκριμένα πράγματα (πχ αλλάζει η κατάσταση κάποιας θύρας, κάνει overflow ένας timer κλπ) όταν συμβεί μια από αυτές τις διακοπές μεταφέρεται η εκτέλεση του προγράμματος σε άλλο σημείο, τις λεγόμενες Interrup Service Rutines. Έτσι έχεις πχ τον μικροελεγκτή να αναβοσβήνει ένα led και έχει ενργοποιήσει interrupt σε μια είσοδο στην οποία έχεις ενα push button. Στην ΙSR γράφεις κώδικα που σταματάει το led να αναβοσβήνει. Οπότε δεν χρειάζεται να ελεγχεις συνεχώς μέσα στο πρόγραμμα αν πατήθηκε το κουμπι για να σταματήσεις το led!

Για τους timers τώρα για πιο συγκεκριμένο παράδειγμα θα πρέπει να πεις τη μικροελεγκτή έχεις και σε τη συχνότητα. Πάντως είναι πολύ απλό και να κοιτάξεις λίγο το datasheet και κανένα site στο ίντερνετ θα μπεις στο νόημα. Γενικά θα δουλέψεις κάπως έτσι: Ο timer είναι ένας καταχωρητής που αυξάνει την τιμή του κατά ένα σε κάθε κύκλο μηχανής και όταν υπερχειλήσει μπορεί να ενεργοποιηθεί ένα interrupt. Οπότε ανάλογα με τη συχνότητα που τρέχεις βρίσκεις οτι για το χρόνο που θες πχ περνάνε 100 κύκλοι μηχανής. Αν έχεις 8bit timer λοιπόν του βάζεις αρχικά 155 και ενεργοποιείς το αντίστοιχο interrupt. Θα ξέρεις έτσι οτι οταν ενεργοποιηθεί το interrupt έχει περάσει ο χρόνος που θες.

----------


## billtech

αδεφρε ριξε μια ματια σε αυτο εδω
http://users.otenet.gr/~smpoulta/theoria_enotita_6.pdf
και αυτο
http://www.mikroe.com/eng/chapters/v...ntroller/#c3v4
και οτι θες ρωτα!!!

----------


## soulhealer

thanks!! θα το διαβάσω κ τα λέμε αν έχω απορία

----------


## soulhealer

ρε γμτ, δεν μπορώ να βγάλω άκρη... καταρχάς πως συντάσετε μια εντολή interrupt? δηλώνεται κάπου,ως τι?? *sub procedure interrupt* ....... *end sub*??
πχ. στον 16f84a που έχω εγώ με 4ΜΗ ρολόϊ, έστω ότι θέλω να αναβοσβήνει ένα λαμπάκι και όταν 
πατηθεί ένα μπουτόν να σταματήσει το λαμπάκι να αναβοσβήνει και να ανάψει ένα άλλο (ως ένδειξη πως πατήθηκε μπουτόν)..
πως θα συνταχθεί η εντολή interrupt?

την εντολή *interrupt* την φανταζόμουν σαν ένα *goto*, άρα γιατί να μην χρησιμοποιήσω *goto?*

----------


## billtech

γτ οταν ο Timer σου ας πουμε κανει overflow και εχεις ενεργοποιημενη τη σημαια για interrupt μολις κανει overflow τοτε απο μονος του ο επεξεργαστη θα παει στην υπορουτινα Interrupt. χωρις να καλεσεις την υπορουτινα εσυ.
σε αυτο που σου εδωσα να διαβασεις αμα δεις εχει ενα παραδειγμα ακριβως απο κατω για το πως γινετε ο κωδικας.
στο παραδειγμα σου.
θες να αρχικοποιησεις τον timer0 με ενα σταθερο ρυθμο να αναβοσβηνει ενα led.
οταν πατιθει ενα button τοτε σταματας τον τιμερ να μετραει και απλα αναβεις ενα αλλο led.

δηλαδη εσυ στη main σου απλα θα κοιτας αν πατηθηκε ενα button. το θεμα του αναβοσβησματος το αναλαμβανει ο timer.

----------


## billtech

για αρχη κανε ενα led να αναβοσβηνει με σταθερο ρυθμο πχ 1δευτερολεπτο με τον timer0.

----------


## soulhealer

Λοιπον αρχηγέ, για να μην σου λέω ψέμματα επειδή δεν έχω καταλάβει καν πως συντάσσονται οι εντολές ΤΜΡ0 και interrupt από την βοήθεια της μικρομπεισικ, έβγαλα αυτό το οποίο 
όντως μου αναβοσβήνει την πόρτα β... αλλά δεν καταλαβαίνω γιατί και πως... τι είναι η κάθε εντολή και πως βρίσκει τον χρόνο (π.χ. 1sec)

program timer0_interrupt
'- Turn on diodes on PORTB.
' *
dim counter as word

sub procedure Interrupt()
  Inc(counter)            ' Increment value of counter on every interrupt
  TMR0   = 96
  INTCON = 0x20           ' Set T0IE, clear T0IF
end sub

main:
  OPTION_REG = 0x84       ' Assign prescaler to TMR0
  TRISB = 0               ' PORTB is output
  PORTB = 0xFF            ' Initialize PORTB
  TMR0  = 96              ' Timer0 initial value
  INTCON = 0xA0           ' Enable TMRO interrupt
  counter = 0             ' Initialize counter

  while TRUE
    if (counter = 400) then
      PORTB = not PORTB      ' Toggle PORTB LEDs
      counter = 0            ' Reset counter
    end if
  wend
end.

----------


## billtech

program timer0_interrupt
'- Turn on diodes on PORTB.
' *
dim counter as word

σε αυτη την υπορουτηνα μπαινει ο επεξεργαστης απο μονος του μολις κανει overflow ο TMR0. δλδ μολις γινει η σημαια του TMR0 = 1
sub procedure Interrupt()
  Inc(counter)            ' Increment value of counter on every interrupt
  TMR0   = 96 'ξανα αρχικοποιεις  τον TMR0
  INTCON = 0x20           ' Set T0IE, clear T0IF  'ξανασεταρεις τον INTCON 
end sub


Σε αυτο το κομματι δηλωνεις τιμες στους καταχωρητες
main:
  OPTION_REG = 0x84       ' Assign prescaler to TMR0  'Εδω αρχικοποιεις τον TMR0.
  TRISB = 0               ' PORTB is output
  PORTB = 0xFF            ' Initialize PORTB
  TMR0  = 96              ' Timer0 initial value  'Εδω βαζεις τιμη στον TMR0 να ξεκινησει να μετραει απο το 96
  INTCON = 0xA0           ' Enable TMRO interrupt 'Εδω ενεργοποιεις τον επεξεργαστη να κανει διακοπη οταν κανει overflow ο TMR0.
  counter = 0             ' Initialize counter 

για να κανει inverse την πορταΒ πρεπει να κανει overflow ο TMR0 400 φορες.Αλλιως δεν κανει τιποτα
  while TRUE
    if (counter = 400) then
      PORTB = not PORTB      ' Toggle PORTB LEDs
      counter = 0            ' Reset counter
    end if
  wend


τους καταχωρητες: 
OPTION_REG
INTCON 
θα δεις το καθε μπιτ τους τι κανει απο το Datasheet.

----------


## soulhealer

οκ! και ευχαριστώ για τις επεξηγήσεις... δηλαδή το αναβόσβημα που βλέπω εγώ (περίπου κάθε 1sec) στην πόρτα Β είναι γιατί τόσος χρόνος χρειάζεται ο ΤΜΡ0 για overflow??
δηλαδή αν πω counter=100 θα αναβοσβήνει πιο γρήγορα?? και ποιος αυξάνει την τιμή του counter?από την στιγμή που δεν βλέπω counter=counter+1

----------


## billtech

αυτο εδω τι κανει αραγε?  :Tongue2:  :Tongue2: 
Inc(counter)            ' Increment value of counter on every interrupt

για 1sec θελεις
χρονος overflow * counter  *Preascaler= 1sec.

κανε ενα προγραμματακι για ενα δευτερολεπτο delay και αναβοσβηνε το πιν PortB.7.

θα το καταφερεις. αναιβασε το μολις το κανεις η αν εχεις καποια απορια...εντο ειμαστε.

ΥΓ. το PortB.7 ετσι μου ηρθε.για να δυσκολευτεις λιγο παραπανω.  :Tongue2:

----------


## soulhealer

το έχω καταλάβει τι σαδιστής είσαι :P.... χεχε!
οκ θα το παλεψω μόνάχος μου.. αλλά μπορεί να πάρει λίγο χρόνο γιατί έχω μπλέξει και με δουλειά..!!
ευχαριστώ πάντως για όλα![IMG]file:///C:/DOCUME%7E1/Teo/LOCALS%7E1/Temp/moz-screenshot-1.png[/IMG]

----------


## soulhealer

Δείτε τι διάβασα,
 "Interrupts can either from the overflowing of the TMR0 or external inputs. In the option registers, you can configure TMR0's properties, like the prescalar. Other useful settings like the PORTB pull-ups can be set here also.  So let's say you want to enable PORTB pull-ups and set the prescalar to 1:32. That means you need to set bit 0-2 and bit 7. The binary representation of that setting will be "10000100" and the hex representation will be "84". So in mikroBasic, you will declare with "OPTION_REG = $84" with the "$" indicating that it's in hex. Now you will have a TMR0 with a prescaler of 1:32. Assuming you have a 4MHz clock, and because instruction cycles are clock oscillation divided by 4, that means the TMR0 register will receive a frequency of 1MHz divided by 32 (prescaler 1:32) = 31.25kHz. That means TMR0 will trigger the interrupt every 256 / 31.25k (assuming TMR0 initial value is 0) = 8.192ms. TMR0 triggers the interrupt every time it counts till 256. You will know that the interrupt has been triggered if you monitor TMR0IF. The count is incremented every time it receives a clock signal. Most people will want to create a delay using the TMR0".

άρα η συνάρτηση που προτείνει ο βασίλης είναι η εξής: delay_sec = [ 256- (αρχική τιμή TMR0)] * prescaler / [clock Mhz / 4]
αλλά και πάλι δεν μου βγάινει...πολύ δεν είναι ΤΜR0=224???

Δλδ λέω σε δικό μου παράδειγμα: για 1sec= [[256-X] * 31,25khz] /  [4Mhz/4] = 
                                                           [[256-x] * 31,25khz] /  1Mhz =
                                                           256-x = 1Mhz /31,25khz 
                            ΤΜΡ0=Χ            θέλω χ= 256-32 => 224

----------


## billtech

φιλε μου καταφερες να με μπερδεψεις.οχι οτι θελω και πολυ δηλαδη  :Lol:  :Lol: 

ας το παμε βημα βημα.

                 άν εχουμε  ρυθμίσει τον Prescaler να διαιρεί :32,και κρυσταλλο 4ΜΗz τότε οι παλμοί (Hz) στην είσοδο του TMR0 θα είναι:

(4.000.000 : 4) : 32 = 31.250 Hz ανά Sec

που                  σημαίνει ότι το TMR0, θα φθάσει και πάλι στο μηδέν σε:

256                  : 31.250 = 0,008192 Sec (8,192 mSec)

Φυσικά          δεν είναι δυνατόν να βάλουμε το TMR0 να μετρήσει 31.250 φορές (μετράει          έως το 256) και εδω ερχεται και κολλαει η counter μεταβλητη που ορισαμε εμεις.

αρα τωρα αν βαλεις την τιμη 6 στον timer0 σου τι θα γινει?
255-6 αρα 250 σωστα?

αρα ποσες φορες πρεπει να μετρησεις εως το 250 για να εχεις 31250?
125 σωστα?
125*250=31250 σωστα? που υπολογισαμε πιο πανω.
ε το 125=counter που ειπαμε πιο πανω.

με δυο λογια για να εχεις ενα δευτερολεπτο με διαιρετη 32 πρεπει: 
255*250 και ο timer0=6


τωρα η που ξεμπερδευτικα εγω και μπερδεψα εσενα η που σε μπερδεψα περισοτερο.
το σιγουρο οτι εγω ξεμπερδευτικα.  :Tongue2:  :Tongue2:

----------


## soulhealer

τι άλλο μπορώ να πω από κατατοπιστικότατος
μόνο που νομίζω ότι θες να πείς 
256-6=250 
άρα τιμερ=6.. αν και κάπου διάβασα ότι για να τρέξει σωστά το πρόγραμμα ο τιμερ χάνει τους 2 πρώτους παλμούς.. άρα πρέπει να βάλω τον τιμερ να μετρά από 8.έχεις ακούσει κάτι εσύ γι αυτό???

----------


## billtech

οχι δεν ακουσα κατι τετοιο..δεν ξερω...λες?
ας μας πει κανεις αλλος αν ισχυει κατι τετοιο.

----------


## GeorgeVita

> ...κάπου διάβασα ότι για να τρέξει σωστά το πρόγραμμα ο τιμερ χάνει τους 2 πρώτους παλμούς...



Κάθε εγγραφή στο TMR0 (λ.χ. movwf TMR0 ή clrf TMR0) μηδενίζει το περιεχόμενο του prescaler και δημιουργεί 'κενό' 2 κύκλων στον TMR0 (δεν αυξάνει για τις επόμενες δύο εντολές). Οταν όμως χρησιμοποιείς prescaler επειδή μηδενίστηκε και αυτός, η επόμενη αύξηση του TMR0 θα γίνει 2 κύκλους μετά το 'γέμισμα' του prescaler.
Γενικά δεν είναι καλή πρακτική να πειράζεις συνέχεια το TMR0 και το prescaler.
Φιλικά,
Γιώργος

----------


## antonis_x

> τι άλλο μπορώ να πω από κατατοπιστικότατος
> .. αν και κάπου διάβασα ότι για να τρέξει σωστά το πρόγραμμα ο τιμερ χάνει τους 2 πρώτους παλμούς.. άρα πρέπει να βάλω τον τιμερ να μετρά από 8.έχεις ακούσει κάτι εσύ γι αυτό???



 soulhealer μια που ξεκινάς τώρα, να ξέρεις ότι το πρώτο εργαλείο που χρησιμοποιείς είναι το datasheet του μικροελεγκτή σου, το οποίο τα λέει όλα μέσα, κάποια βέβαια άμεσα και κάποια πρέπει να βγάκεις εσύ συμπέρασμα, το συγκεκριμένο που ρωτάς το λέει ξεκάθαρα:

If the TMR0 register is written, the increment is
inhibited for the following two instruction cycles. The
user can work around this by writing an adjusted value
to the TMR0 register.

φιλικά, Αντώνης.

----------


## soulhealer

> soulhealer μια που ξεκινάς τώρα, να ξέρεις ότι το πρώτο εργαλείο που χρησιμοποιείς είναι το datasheet του μικροελεγκτή σου, το οποίο τα λέει όλα μέσα, κάποια βέβαια άμεσα και κάποια πρέπει να βγάκεις εσύ συμπέρασμα, το συγκεκριμένο που ρωτάς το λέει ξεκάθαρα:
> 
> If the TMR0 register is written, the increment is
> inhibited for the following two instruction cycles. The
> user can work around this by writing an adjusted value
> to the TMR0 register.
> 
> φιλικά, Αντώνης.



Aντώνη γι αυτό το ρώτησα..Πιθανότατα εκεί το διάβασα γιατί διαβάζω και άλλα πράγματα ταυτόχρονα και δεν θυμάμαι που διαβασα τι... Αν και ακόμα δεν έχω καταφέρει να "διαβάσω" όλο το datasheet..κάποια σημεία και πίνακες μου φαίνονται εντελώς... κινέζικα..!!!
αλλά θα την παλέψουμε...

----------


## billtech

φιλε μου εγω ποτε δεν ειχα ξαναχρησημοποιεισει prescaler.
αλλα τα datasheet μπορει να εχουν οτι χρειαζεσε αλλα καποτε σε μπερδευουν λιγο.
μπορει να ειναι το δεξι σου χερι για εναν επεξεργαστη αλλα αμα σε μπερδεψει εστω και λιγο πανε ολα...
βεβαια για καποιους ειναι ευκολα..αλλα αμα δεν εχεις καλα τα αγγλικα χανεσε.
 :Wink:

----------


## soulhealer

> φιλε μου καταφερες να με μπερδεψεις.οχι οτι θελω και πολυ δηλαδη 
> 
> ας το παμε βημα βημα.
> 
>                  άν εχουμε  ρυθμίσει τον Prescaler να διαιρεί :32,και κρυσταλλο 4ΜΗz τότε οι παλμοί (Hz) στην είσοδο του TMR0 θα είναι:
> 
> (4.000.000 : 4) : 32 = 31.250 Hz ανά Sec
> 
> που                  σημαίνει ότι το TMR0, θα φθάσει και πάλι στο μηδέν σε:
> ...



δηλαδή αν κατάλαβα το σκεπτικό σου για 2sec τότε ο counter θα πρέπει να είναι στα 250??? με TMR=6  σωστά??

----------


## billtech

γιατι δεν το κανεις μια δοκιμη να δεις αν παιζει και μετα να κανεις και για 2 για να δεις αν στεκει το δικο σου σκεπτικο?
στον κωδικα υπαρχουν 1002 τροποι για να κανεις ενα πραμα. ο καθενας εχει τον δικο του.
αμα δεν κανεις δοκιμες πως θα μαθεις?
για καντο και πες μου αν ισχυει αυτο που ειπες.
 :Tongue2:  :Tongue2:  :Tongue2: 
Για το καλο σου ειναι  :Tongue2:  :Tongue2:

----------


## soulhealer

οκ... απλά δεν είμαι σπίτι και δεν έχω το πρόγραμμα να δοκιμάζω... και 
καταλαβαίνω πως το λες..!!!(για το καλό μου) +1

----------


## soulhealer

και ναι όντως δουλεύει... Δοκιμασμένο  :Wink:  δλδ κάποιος μπορεί να πει ΤΜΡ0=6, prescaler=$84, clock 4Mhz, counter=125 και υπολογισμός χρόνου καθυστέρησης σε sec= counter*delay
επίσης άλλαξα τον χρόνο σε ΤΜΡ0=106
και τον counter με στρογγυλοποίηση στο 208... το αποτέλεσμα πάλι 1sec delay...
άρα εδώ φαίνεται καθαρά αυτό που μου είπες πιο πάνω ο καθένας με τον δικό του τρόπο..
και vouala για 1sec:

program tmr0_1
'- Turn on diodes on PORTB.7
' *
dim counter as byte

sub procedure Interrupt()
  Inc(counter)            ' Increment value of counter on every interrupt
  TMR0   = 106              'reinitialize tmr0
  INTCON = $20           ' Set T0IE, clear T0IF
end sub

main:
  OPTION_REG = $84       ' Assign prescaler to TMR0
  TRISB = 0               ' PORTB is output
  PORTB = $FF            ' Initialize PORTB
  TMR0  = 106              ' Timer0 initial value
  INTCON = $A0           ' Enable TMRO interrupt
  counter = 0             ' Initialize counter

  while TRUE
    if (counter = 20 :Cool:  then
      PORTB.7 = not PORTB.7      ' Toggle PORTB.7 LEDs
      counter = 0            ' Reset counter
    end if
  wend
end.

----------


## billtech

ωραια.
τωρα επειδη interrupt δεν κανει μονο το timer0 αλλα και απο αλλους παραγοντες.
αν θες δοκιμασε το εξης:
μολις μπει στην interrupt() να ελεγξει αν η σημαια του timer0 εγινε=1 τοτε κανε το inc και τα υπολοιπα.
για να μπει βεβαια εγινε αλλα ποτε δεν ξερεις.επισης οπως ειπα και πριν οταν μπεις στην interrupt() και εχεις και αλλους παραγοντες που προκαλουν Interrupt πρεπει να βρεις ποιος το προκαλεσε.

----------


## soulhealer

Ωπ, τώρα σε τσίμπησα κ θα τα πεις όλα...λογικά θα πρέπει να τσεκάρω  TOIF=1, if true then increase values... και μετά ξαναενεργοποιώ το ΤΟΙΕ..
λοιπόν για να σου απαντήσω όμως σε αυτό που ρωτάς πρέπει πρώτα να καταλάβω τι ρωτάς... 
αρχίζω να λέω πως κατά την γνώμη μου "διαβάζει" το πρόγραμμα και όπου έχω λάθος με διορθώνεις..

1)ξεκινάει και θέτει τον counter as byte
2)προσπερνα το interrupt()
3)πάει στο main: και διαβάζει ton prescaler "1:32"
4)λέει στην πορτΒ να γίνει έξοδος
5)κάνει την πορτΒ high
6)λέει στον ΤΜΡ0 που να ξεκινήσει να μετράει π.χ. 106
7)τσεκαρει μέσω "ΙΝΤCON" αν ο ΤΜΡ πέρασε το 256
 :Cool: και συνεχίζοντας λέει στον counter=0
9)τσεκάρει το while-wend και ξαναπηγαίνει στο main:
10)στον επόμενο κύκλο ο τίμερ0=97 δεν έχω interrupt άρα δεν μπαίνω while-wend
11)κάνει τόσους κύκλους ώστε να κάνει 208 interrupt για να αυξηθεί κατάλληλα ο counter ώστε να μπει στην while-wend 
και να αλλάξει κατάσταση τελικά την πόρταΒ
σωστά??
Το ερώτημα που μου γεννάτε τώρα είναι το εξής:
κάθε φορά που έχει κάνει interrupt και έχει αυξήσει τον counter κατά "1", αν μετά ξαναπερνάει από το INTCON -> counter=0 -> και πριν μπει στην while-wend δεν θα μηδενίσει ο counter την άυξηση που έκανε από το προηγούμενο interrupt??

σε μπέρδεψα?? είναι γιατί είμαι κι εγώ μπερδεμένος.. :P

----------


## billtech

> Ωπ, τώρα σε τσίμπησα κ θα τα πεις όλα...λογικά θα πρέπει να τσεκάρω  TOIF=1, if true then increase values... και μετά ξαναενεργοποιώ το ΤΟΙΕ..
> λοιπόν για να σου απαντήσω όμως σε αυτό που ρωτάς πρέπει πρώτα να καταλάβω τι ρωτάς...



ναι αυτο σου λεω να κανεις...τι δεν καταλαβες? αφου το καταλαβες.





> αρχίζω να λέω πως κατά την γνώμη μου "διαβάζει" το πρόγραμμα και όπου έχω λάθος με διορθώνεις..
> 
> 1)ξεκινάει και θέτει τον counter as byte
> 2)προσπερνα το interrupt()
> 3)πάει στο main: και διαβάζει ton prescaler "1:32"
> 4)λέει στην πορτΒ να γίνει έξοδος
> 5)κάνει την πορτΒ high
> 6)λέει στον ΤΜΡ0 που να ξεκινήσει να μετράει π.χ. 106
> 7)τσεκαρει μέσω "ΙΝΤCON" αν ο ΤΜΡ πέρασε το 256
> ...



κατι εχεις καταλαβει λαθος εδω ομως.
οταν μπει στη while δεν βγαινει ποτε.παρα μονο οταν κανει interrupt που θα παει στην υπορουτηνα του interrupt και μετα ξαναεπιστρεφει εκει που σταματισε.δεν παει ξανα στη main και κανει αρχικοποιησεις.
το πιασες?

----------


## soulhealer

ωπ πάλι σε έχασα..!  :frown: 
καταλαβαίνω ότι από την στιγμή που θα μπει στην while(γιατί counter=208 ) και κάνει ότι είναι να κάνει
θα βγεί επειδή μέσα στην while έχω μηδενισμό του μετρητή counter=0 άρα πάυση της συνθήκης while.. 
μετά όμως από που θα συνεχίσει το πρόγραμμα??  δλδ όταν counter=0και βγει από την while θα ξαναμετράει ο τιμερ από το 106 μέχρι να ξαναμπεί στην while?
άρα στο main: για αρχικοποιήσεις θα μπεί μια φορά..στην αρχή έτσι??

----------


## billtech

```
while TRUE
    if (counter = 208) then
      PORTB.7 = not PORTB.7      ' Toggle PORTB.7 LEDs
      counter = 0            ' Reset counter
    end if
  wend
```


βαλε διπλα απο καθε γραμμη τι κανει. σχολια.

ποτε βγαινει απο την while εκτος απο την φορα που παει στην interrupt?

με λογια..
μπαινει στη while....και κοιταει...ειναι το counter=208? οχι...τι κανει μετα?
μπαινει στη while....και κοιταει...ειναι το counter=208? ναι...τι κανει μετα?

απαντα στις ερωτησεις μου και πιστευω θα σου λυθει η απορια απαντοντας μου.  :Tongue2:

----------


## soulhealer

while TRUE                           'όσο η συνθήκη (που ακολουθεί??) είναι αληθής 
    if (counter = 20 :Cool:  then          'αν ο μετρητής (interrupt) πήγε 208 φορές τότε
      PORTB.7 = not PORTB.7      ' αλλαγή κατάστασης στο πιν Β.7
      counter = 0            ' μηδενισμός μετρητή (interrupt)
    end if                    'τέλος συνθήκης...
  wend                        'ξανπήγαινε στην εντολή while

στην μικροbasic που δοκιμάζω δεν βγαίνει από while... άρα η εντολή true σε τι αναφέρεται??

----------


## billtech

ειναι κατι που του λεει:
οσο ειναι αληθεις.
και επειδη δεν λες τι μενει εκει μεσα. και κανει μονο οτι εχει η while.

----------


## soulhealer

> ειναι κατι που του λεει:
> οσο ειναι αληθεις.
> και επειδη δεν λες τι μενει εκει μεσα. και κανει μονο οτι εχει η while.



σαν να βγαίνει νόημα σιγά σιγά...  :Smile: 
άρα όσο αυτό είναι "εγκλωβισμένο" στην while
ταυτόχρονα ο TMR0 μετράει έτσι??? εγώ νόμιζα στο interrupt πως ο χρόνος παγώνει για λίγο κάνει την ρουτίνα reverse portB  και μετά αφού βγεί από την while (=λάθος σκεπτικό) 
θα ξεκινήσει ο TMR να μετράει ξανά (=πηγαίνοντας στο main:   πάλι λάθος σκεπτικό)

----------


## billtech

ωραια...για συνεχισε τωρα σιγα σιγα...

----------

