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

## DT200

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

άρα η νέα άσκηση είναι η εξής:

σε δύο πιν της πόρτας Β βάλε δύο μπουτόν και σε δύο πιν της πόρτας Β
βάλε δύο Led , αυτά θα πρέπει να ανάβουν το κάθε ένα από το δικό του
μπουτόν και μάλιστα να αναβοσβήνουν το ένα ανεξάρτητα από το άλλο. 

Υ.Γ. φυσικά σε αυτό το θέμα όλοι μπορείτε να επέμβετε με κάθε τρόπο.

----------


## billtech

δηλαδη οταν πατηθει το 7 πειραζι το μηδεν και οταν πατηθει το 6 να πειραζι το 1.
σωστα?

----------


## DT200

ναι, σωστά

----------


## billtech

αλλα δεν το θες οπως ειναι στα παραδειγματα ε?

----------


## DT200

Κάν'το πρώτα με οποιονδήποτε τρόπο και 
μετά με τον δύσκολο  :Cool:

----------


## billtech

program enoee

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

START:
delay_ms(200)
if portb.7=0 then goto aaa
else if portb.6=0 then goto bb
else goto start
  end if
  end if

  aaa:
  delay_ms(50)
  if portb.7=1 then
     portb=not(portb.0)
     goto start
     else goto aaa
  end if

  bb:
  delay_ms(50)
  if portb.6=1 then
     portb=not(portb.1)
     goto start
     else goto bb
  end if

 end.

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

----------


## DT200

Αυτό το προγραμματάκι δουλεύει , αλλά όχι 
τέλια, διότι έχει ένα λάθος που κάνει όλη τη ζημία.
το πρόβλημα είναι ότι ενώ το RB7 επηρεάζει μόνο το RB1,
το RB6 εναλλάσσει και τα δύο .
θα παρατηρήσεις όμως ότι και τα δύο κουμπιά έχουν ακριβός τον ίδιο 
κώδικα, είναι λίγο σπαζοκεφαλιά.  :Confused1: 
φυσικά η αποστολή σου είναι να βρεις το πρόβλημα και να το 
διορθώσεις και *μετά* να βάλεις και μία ρουτίνα ώστε 
το πρόγραμμα να περιμένει να αφήσεις το κουμπί και να μην 
τρέχει συνέχεια με το παρατεταμένο πάτημα του.



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

START:
  delay_ms(200)
  BUT=PORTB
  if BUT.7=1 then GOTO AAA end if
  if BUT.6=1 then GOTO ASD end if
  PORTB=LED
  GOTO START
  
ASD:
  IF LED.6=1 THEN LED.6=0 LED.0=0
  ELSE LED.6=1 LED.0=1
  GOTO TEST END IF

AAA:
  IF LED.7=1 THEN LED.7=0 LED.1=0
  ELSE LED.7=1 LED.1=1
  GOTO TEST END IF

TEST:
  PORTB=LED
  GOTO START
end.
```

----------


## soulhealer

[quote=DT200;282719]ελπίζω να μην παρεξηγηθώ από το forum με αυτή μου την κίνηση ,
αλλά ίσος να υπάρχει κάποιος που να θέλει να μάθει όπως ο billtech


γνώση για όλους??
+10 στο γιάννη.. απ'ότι φαίνεται έχουμε ίδια ιδεολογία.. 
μόλις καταφέρω να μπω κι εγώ μέσα στον Pic θα χρειαστώ τις συμβουλές σου..

----------


## DT200

σε ευχαριστώ φίλε !
για ότι χρειαστείς από MikroBasic, o Nemessis ,εγώ και μερικοί άλλοι
θα ήμαστε εδώ . :Biggrin:

----------


## kopla

Παντως δεν ξέρετε τι χανετε που δεν γράφετε σε assembly.  :Smile: 
Σκέφτεσαι ενα απλό πρόγραμμα -ή καλύτερα κομμάτι του- αρκετή ώρα, το γράφεις σιγα σιγά, πονοκεφαλιάζεις για ενα ακριβές delay ..μετρώντας κύκλους μηχανής. Για τους midrange και κατω μΕ προσέχεις να είσαι παντα στη σωστή bank και page + χίλια αλλα δυο γενικά. Στο τέλος, αφού το compile ειναι επιτυχές, φορτώνεις στον PIC το HEX σου, και  :W00t:  ......ο μΕ δεν κάνει τίποτα  :Lol: .

----------


## DT200

πόσο δίκιο έχεις  :Lol:  :Lol:  :Lol: 
εγώ μέχρι 350 εντολές κατάφερα να γράψω σε ένα πρόγραμμα 
και έγραφα μία εβδομάδα για να το καταφέρω !!! :Cursing:

----------


## billtech

> Αυτό το προγραμματάκι δουλεύει , αλλά όχι 
> τέλια, διότι έχει ένα λάθος που κάνει όλη τη ζημία.
> το πρόβλημα είναι ότι ενώ το RB7 επηρεάζει μόνο το RB1,
> το RB6 εναλλάσσει και τα δύο .
> θα παρατηρήσεις όμως ότι και τα δύο κουμπιά έχουν ακριβός τον ίδιο 
> κώδικα, είναι λίγο σπαζοκεφαλιά. 
> φυσικά η αποστολή σου είναι να βρεις το πρόβλημα και να το 
> διορθώσεις και *μετά* να βάλεις και μία ρουτίνα ώστε 
> το πρόγραμμα να περιμένει να αφήσεις το κουμπί και να μην 
> ...



να σου πω.σε αυτο το προγραμμα το λαθος πιο ειναι?γιατι εμενα που το ετρεξα το RB1 αναβοσβηνει συνεχεια οτι και να πατησω. το RB0 αναβοσβηνει οταν πατησω το RB7.αυτο ειναι χειροτερο και απο το δικο μου  :Smile: 
αυτο δεν ειναι σπαζοκεφαλια.ειναι να κοπαναω το κεφαλι μου στο τοιχο..χαχα

----------


## savnik

Κάνε το παρακάτω , είναι όμως σε picbasic - μετέτρεψε το σε microbasic.
Κάθε φορά που πατάς το κουμπί αλλάζει το led κατάσταση.



```

 PushButton var PortB.7
 TRISB=%11000000
    PortB.1=0
    
Loop:
 If PushButton=1 then
        toggle PortB.1
  Pause 10
  While Pushbutton=1:Wend
 endif
 
 Goto Loop
```

----------


## billtech

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

----------


## DT200

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



```
program enoee 
DIM BUT   AS BYTE
DIM LED AS BYTE
main:
  TRISB=%11000000
  LED  =%11000011
  PORTB=255
  DELAY_MS(500)
  PORTB=0
START:
  delay_ms(200)
  BUT=PORTB
  if BUT.7=1 then GOTO AAA end if
  if BUT.6=1 then GOTO ASD end if
  PORTB=LED
  GOTO START
  
ASD:
  IF LED.6=1 THEN LED.6=0 LED.0=0
  ELSE LED.6=1 LED.0=1
  END IF
  GOTO TEST

AAA:
  IF LED.7=1 THEN LED.7=0 LED.1=0
  ELSE LED.7=1 LED.1=1
  END IF
  GOTO TEST
  
TEST:
  PORTB=LED
  GOTO START
end.
```

----------


## billtech

συγνωμη αλλα αυτος ειναι ο σωστος?εμενα γιατι μου αναβοσβηνει το  RB1 συνεχεια και παιζει με το ζορι το RB0?
σορρυ κανω καπου λαθος?

----------


## DT200

το πρόγραμμα είναι για τον 16F84A @4MHz και τα πιν
θέλουν *θετικό* παλμό για να εκτελέσουν την εντολή.

σου στέλνω και το φάκελο του προγράμματος.

----------


## billtech

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

----------


## DT200

έτσι όπως είναι RB6,RB7 δεν υπάρχει περίπτωση 
να δουλέψει ποτέ ! 
θα βάλεις την μία άκρη της αντίστασης στην γη, την άλλη στο πιν του
μ/ε και όταν θα θέλεις να δόσεις σήμα θα δώσεις 5V πάνω στο 
πιν του μ/ε.
οι αντιστάσεις του  RB6,RB7 να είναι τουλάχιστον 1ΚΩ και των Led 
τουλάχιστον 470Ω.

----------


## billtech

λαθος σχεδιο ανεβασα.αυτο που ανεβασα τωρα ειναι που εχω.και οι αντιστασεις ειναι 10Κ και 330Ω.

----------


## DT200

αν μπορείς να το αλλάξεις ,καλό θα ήταν διότι 
εγώ πάντα δίνω θετικό παλμό ενώ εσύ αρνητικό.
αν δεν αλλάξεις το κύκλωμα σου τότε άλλαξε το πρόγραμμα .
if BUT.7=1 then... σε    if BUT.7=0 then ...

και να αλλάξεις τις αντιστάσεις των Led , το άκρο που έχεις στο +5V
βάλτο απευθείας στα πιν του μ/ε (υπάρχει κίνδυνος να κάψεις την πόρτα,
διότι δεν έχεις περιορισμό του ρεύματος)

----------


## Nemmesis

> λαθος σχεδιο ανεβασα.αυτο που ανεβασα τωρα ειναι που εχω.και οι αντιστασεις ειναι 10Κ και 330Ω.



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

----------


## billtech

γμτ!!!δυστηχως το εχω σε τυπωμενο.ειναι το παρακατω... :Sad:

----------


## Nemmesis

ε τοτε κανε αυτο που λεει ο Γιαννης και θα δουλεψει

----------


## DT200

αν αλλάξεις το πρόγραμμα έτσι όπως σου είπα 
θα παίξει , (το δοκίμασα)

----------


## billtech

παιδες δεν μου δουλευει.σταθερα αναβοσβηνει το RB1 και το RB0 μονο οσο το παταω αναβει.τα πεξα.αυριο παλι..δεν μπορω..δεν θελω να μου σπαζουν τα νευρα γιατι θα τα αμολισω μετα.

----------


## DT200

μάλλον δεν έχουν γη τα RB6,RB7 




```
program enoee    '16F84A @4MHz
DIM BUT   AS BYTE
DIM LED AS BYTE
main:
  TRISB=%11000000
  LED  =%11000011
  PORTB=255
  DELAY_MS(500)
  PORTB=0
START:
  delay_ms(200)
  BUT=PORTB
  if BUT.7=0 then GOTO AAA end if
  if BUT.6=0 then GOTO ASD end if

  PORTB=LED
  GOTO START
  
ASD:
  IF LED.6=1 THEN LED.6=0 LED.0=0
  ELSE LED.6=1 LED.0=1
  END IF
  GOTO TEST
AAA:
  IF LED.7=1 THEN LED.7=0 LED.1=0
  ELSE LED.7=1 LED.1=1
  END IF
  GOTO TEST
  
TEST:
  PORTB=LED
  GOTO START
  end.
```

----------


## billtech

program enoee    '16F84A @4MHz

DIM BUT   AS BYTE
DIM LED AS BYTE

main:
  TRISB=%11000000     'dilosis eisodon exodon
  LED  =%11000011     'vazoume sto kataxoriti LED tin timi C3

  PORTB=255           ' ********************************
  DELAY_MS(500)       'anavosvinei tis LED tis portas B
  PORTB=0             ' ********************************
'*************************************************  ************
START:
  delay_ms(200)
  BUT=PORTB            'vale tin porta B sto kataxoriti BUT
  if BUT.7=0 then GOTO AAA end if  'an paei sto 0 to RB7 tote pigene sto AAA
  if BUT.6=0 then GOTO ASD end if  'an paei sto 0 to RB7 tote pigene sto ASD

  PORTB=LED   'vale sto PORTB tin timi pou exei o kataxoritis LED
  GOTO START   'pigene sti arxi

ASD:
  IF LED.6=1 THEN LED.6=0 LED.0=0 'an to 6 bit tou kataxoriti LED einai 1 tote kane to 0 kai auto kai to 0 bit
  ELSE LED.6=1 LED.0=1 'allios kane kai to bit 6 kai to 0 bit asso
  END IF
  GOTO TEST

AAA:
  IF LED.7=1 THEN LED.7=0 LED.1=0 'an to 7 bit tou kataxoriti LED einai 1 tote kane to 0 kai auto kai to 1 bit
  ELSE LED.7=1 LED.1=1  'allios kane kai to bit 7 kai to 1 bit asso
  END IF
  GOTO TEST

TEST:
  PORTB=LED   'vale sto PORTB tin timi pou exei o kataxoritis LED
  GOTO START

'AA:
'  BUT=PORTB
'  IF BUT=%00111111 THEN GOTO START
'  ELSE GOTO AA END IF


end.

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

----------


## Acinonyx

> Παντως δεν ξέρετε τι χανετε που δεν γράφετε σε assembly. 
> Σκέφτεσαι ενα απλό πρόγραμμα -ή καλύτερα κομμάτι του- αρκετή ώρα, το γράφεις σιγα σιγά, πονοκεφαλιάζεις για ενα ακριβές delay ..μετρώντας κύκλους μηχανής. Για τους midrange και κατω μΕ προσέχεις να είσαι παντα στη σωστή bank και page + χίλια αλλα δυο γενικά. Στο τέλος, αφού το compile ειναι επιτυχές, φορτώνεις στον PIC το HEX σου, και  ......ο μΕ δεν κάνει τίποτα .



Δεν είναι τόσο τραγικά τα πράγματα όσο τα παρουσιάζεις.

Με τον assembler/linker της microchip δεν χρειάζεται να προσέχεις για bank. Πριν κάθε αλλαγή σε καταχωρητή χρησιμοποιείς την ψευδοεντολή banksel και ο linker προσθέτει τον κατάλληλο κώδικα (αν χρειάζεται) ώστε να αλλάξει το bank. Αντίστοιχα για indirect addressing χρησιμοποιείς την ψευδοεντολή bankisel ενω για αλλαγή σελίδας κώδικα την pagesel.

Επίσης, αν φτάνεις στο σημείο να μετράς 1-1 κύκλους μηχανής τότε η μέθοδος που ακολουθείς για να κάνεις delay είναι λάθος. Υποτίθεται ότι θα πρέπει να κάνεις έναν απλό πολλαπλασιασμό ΜΟΝΟ. Σε εφαρμογές που χρειάζεται υψηλή ακρίβεια delay υπάρχει ανάλογο περιφεριακό (TMR2) που μπορεί να χρησιμοποιηθεί. Τα πλεονεκτήματα είναι πολλά, με κυριότερο ότι δεν απασχολείται ο επεξεργαστής ο οποίος μπορεί να κάνει άλλες λειτουργίες κατά τη διάρκεια του delay.

----------


## kopla

> Δεν είναι τόσο τραγικά τα πράγματα όσο τα παρουσιάζεις.
> 
> Με τον assembler/linker της microchip δεν χρειάζεται να προσέχεις για bank. Πριν κάθε αλλαγή σε καταχωρητή χρησιμοποιείς την ψευδοεντολή banksel και ο linker προσθέτει τον κατάλληλο κώδικα (αν χρειάζεται) ώστε να αλλάξει το bank. Αντίστοιχα για indirect addressing χρησιμοποιείς την ψευδοεντολή bankisel ενω για αλλαγή σελίδας κώδικα την pagesel.
> 
> Επίσης, αν φτάνεις στο σημείο να μετράς 1-1 κύκλους μηχανής τότε η μέθοδος που ακολουθείς για να κάνεις delay είναι λάθος. Υποτίθεται ότι θα πρέπει να κάνεις έναν απλό πολλαπλασιασμό ΜΟΝΟ. Σε εφαρμογές που χρειάζεται υψηλή ακρίβεια delay υπάρχει ανάλογο περιφεριακό (TMR2) που μπορεί να χρησιμοποιηθεί. Τα πλεονεκτήματα είναι πολλά, με κυριότερο ότι δεν απασχολείται ο επεξεργαστής ο οποίος μπορεί να κάνει άλλες λειτουργίες κατά τη διάρκεια του delay.




Γεια σου φίλε.
Η τραγικότητα εξαρτάται. Προσωπικά, δεν είναι τραγική η assembly, αναφέρομαι γενικά, και ο μέσος όρος των ατόμων τη βρίσκει τραγική.

Βεβαίως χρησιμοποιώ BANKSEL για τις αλλαγες των banks, αντί για την απευθείας αλλαγή των bit του STATUS. Σε αυτό μας βοηθάει ο assembler και τα αλλα directives του. Ομοίως και για το PAGESEL.

Τωρα για το αν απασχολείται ο μΕ κατα το delay παίζει ρόλο πως θα το κατασκευάσεις. Αν θες ανεξαρτησία, τότε πρεπει να βαλει και καποιο module να κανει κατι, και αυτό είναι καποιος timer. Επίσης παίζει ρόλο αν θα τον αφήσεις να σε πάει στο interrupt vector ή αν θα κανεις polling τη σημαία TMRxIF. Οι μΕ τρεχουν σε μεγαλες ταχύτητες για τον ανθρωπο, οπότε ακόμη και να χρησιμοποιηθεί 16-μπιτος timer θα χρειαστεί και αλλη μεταβλητη για να μετραμε τις υπερχειλήσεις. Αυτό κυρίως αν θελουμε να κανουμε εφε με LED όπου η χρονοκαθυστέριση πρεπει να ειναι της ταξης των ms. (αναλογα τη συχνότητα ταλάντωσης του pic). Αν μεταφερθείς στο int.vector παίζει ρόλο που θα είναι η ρουτίνα εξυπηρέτησης της διακοπής. Αυτό αναλογα λιγο εως πολύ και την οικογένεια του PIC. Οι 16F και κατω έχουν 1 int.vector. Οι 18F έχουν υψηλής και χαμηλής προτεραιότητας. ΚΤΛ... 
Οι εντολές BTFSS και BTFSC κανουν 1 ή 2 κύκλους για την εκτέλεση τους. Πρέπει να υπολογίσεις και αυτό αν θες να είσαι ακριβής. ΚΤΛ ξανα...

Αναφέρεις και τον TMR2. Αυτός είναι 8-bit και εχει pre/post-scales. Σου παραθέτω κατι απο καποιο datasheet απλώς για να δεις ότι υπάρχουν καποιες παγίδες (σε περίπτωση που χρησιμοποιείς pre/post scalers και πες ότι στον τελευταίο κύκλο του delay σου θες να μετρήσεις όχι 00->FF αλλά κάτι κατι αλλο [θα χρειαστεί να γράψεις τον TRM2] ).

The prescaler and postscaler counters are cleared
when any of the following occurs:
•* a write to the TMR2 register
*• *a write to the T2CON register*
• any device Reset (POR, MCLR Reset, WDT
Reset or BOR)

*Κοινώς βλέπεις ότι υπάρχουν αρκετά να σκεφτείς, πολλοί τρόποι και συνδυασμοί.* Δεν λεω ότι είναι τραγική η assembly για σενα ή για τον Χ Υ ή εμενα. Οπως είπες, εχει πλεονεκτήματα - το εχω πει και εγω καπου- αλλά δεν είναι ευέλικτη. Αν γίνει γενικώς ευέλικτη.. τότε δεν θα είναι assembly! Θα έχει και σαβουρο-κώδικα. ( βλέπε NOT(assembly) :Wink:  )

Σορρυ για το μεγαλο ποστ.

----------


## billtech

what????τι ειναι αυτα ρε παιδια?κινεζικα μιλατε?  :Smile:

----------


## Acinonyx

> Γεια σου φίλε.
> Η τραγικότητα εξαρτάται. Προσωπικά, δεν είναι τραγική η assembly, αναφέρομαι γενικά, και ο μέσος όρος των ατόμων τη βρίσκει τραγική.



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

Εγώ το μόνο πλεονέκτημα που βρίσκω στις "υψηλές" γλώσσες είναι οι έτοιμες functions που μπορείς να χρησιμοποιήσεις. Αλλά ακόμη και για αυτό, δημιουργεις βιβλιοθήκες και όταν φτιάχνεις μία κοινή function να την πετάς μέσα και να την επαναχρησιμοποιείς σε άλλα προγράμματα σε assembly.





> Τωρα για το αν απασχολείται ο μΕ κατα το delay παίζει ρόλο πως θα το κατασκευάσεις. Αν θες ανεξαρτησία, τότε πρεπει να βαλει και καποιο module να κανει κατι, και αυτό είναι καποιος timer. Επίσης παίζει ρόλο αν θα τον αφήσεις να σε πάει στο interrupt vector ή αν θα κανεις polling τη σημαία TMRxIF.



Υπάρχουν πολλά προγραμματιστικά στυλ. Προσωπικά πιστεύω ότι polling, delays, κλπ είναι μπακάλικοι τρόποι. Κατά τη γνώμη μου, ο μικροελεγκτής δε θα πρέπει να κάνει τίποτα (= loop for ever) χωρίς διακοπή από κάποιο περιφερειακό.





> Οι εντολές BTFSS και BTFSC κανουν 1 ή 2 κύκλους για την εκτέλεση τους. Πρέπει να υπολογίσεις και αυτό αν θες να είσαι ακριβής. ΚΤΛ ξανα...



Όχι. Δεν χρειάζεται να το υπολογίσεις. Οι TMRX λειτουργούν συνεχώς και ανεξάρτητα από το αν σβήσεις ή ανάψεις το Interrupt Flag τους. Άρα η περίοδος είναι πάντα συγκεκριμένη. Μόνη εξαίρεση είναι η περίπτωση εξαιρετικά γρήγορου χρονιστή (>100kHz) όπου η περίοδος είναι συγκρίσιμη με τον χρόνο εκτέλεσης της ISR.





> Αναφέρεις και τον TMR2. Αυτός είναι 8-bit και εχει pre/post-scales. Σου παραθέτω κατι απο καποιο datasheet απλώς για να δεις ότι υπάρχουν καποιες παγίδες (σε περίπτωση που χρησιμοποιείς pre/post scalers και πες ότι στον τελευταίο κύκλο του delay σου θες να μετρήσεις όχι 00->FF αλλά κάτι κατι αλλο [θα χρειαστεί να γράψεις τον TRM2] ).



Από ότι κατάλαβα αναφέρεσαι σε εφαρμογή με επαναλαμβανόμενα "delays" (δηλαδή χρονιστή). Αυτό που λες περί γραψίματος του TMR2 είναι εντελώς λάθος. Μόνο και μόνο που θα γράψεις πάνω του, έχεις αλλοιώσει την περίοδο! Οι "παγίδες" που αναφέρει το datasheet είναι τα αυτονότητα. Ακόμη και στο πλυντήριο, πρώτα βάζεις το πρόγραμμα και μετά πατάς το κουμπί να ξεκινήσει. Την ώρα που δουλεύει ΔΕ πειράζεις τα κουμπιά. Αντίστοιχα και στους timers, πρώτα ρυθμίζεις prescaler, postscalers, κλπ και μετά τον χρησιμοποιείς. Αν αλλάξεις τις ρυθμίσεις ή πειράξεις τον Timer την ώρα που δουλέυει θα υπάρχουν "απρόβλεπτες" συνέπειες. Επίσης, οι ίδιες "παγίδες" ισχύουν και σε γλώσσες υψηλού επιπέδου. Ο προγραμματισμός σε γλώσσα υψηλού επιπέδου δεν καταργεί το datasheet!

Με μία γλώσσα υψηλού επιπέδου μπορείς έυκολα να ξεχάσεις να λάβεις υπόψιν σου λεπτομέρειες που με την assembly αναγκάζεσαι να κοιτάξεις.

----------


## kopla

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

Εγώ το μόνο πλεονέκτημα που βρίσκω στις "υψηλές" γλώσσες είναι οι έτοιμες functions που μπορείς να χρησιμοποιήσεις. Αλλά ακόμη και για αυτό, δημιουργεις βιβλιοθήκες και όταν φτιάχνεις μία κοινή function να την πετάς μέσα και να την επαναχρησιμοποιείς σε άλλα προγράμματα σε assembly.
*> Δεν διαφωνώ

*Υπάρχουν πολλά προγραμματιστικά στυλ. Προσωπικά πιστεύω ότι polling, delays, κλπ είναι μπακάλικοι τρόποι. Κατά τη γνώμη μου, ο μικροελεγκτής δε θα πρέπει να κάνει τίποτα (= loop for ever) χωρίς διακοπή από κάποιο περιφερειακό.*
> Με λίγα λόγια μας λες ότι παντα πρεπει ο μΕ να κανει GOTO $. Polling και delay είναι μπακαλομέθοδοι. Όπως νομίζεις. (το 'όπως νομίζεις' παει με το 'πάντα', για να μην παρεξηγηθείς)

*Όχι. Δεν χρειάζεται να το υπολογίσεις. Οι TMRX λειτουργούν συνεχώς και ανεξάρτητα από το αν σβήσεις ή ανάψεις το Interrupt Flag τους. Άρα η περίοδος είναι πάντα συγκεκριμένη. Μόνη εξαίρεση είναι η περίπτωση εξαιρετικά γρήγορου χρονιστή (>100kHz) όπου η περίοδος είναι συγκρίσιμη με τον χρόνο εκτέλεσης της ISR.
* > Αν θα το υπολογίσεις εξαρτάται απο τον τρόπο που θα κατασκευάσεις το delay. Προγραμματισμός είναι. Από τη στιγμή που θα ενεργοποιήσεις καποιον timer ναι, λειτουργεί συνεχώς. Πως θα εκμεταλλευτείς τη λειτουργία του αν δεν κατεβάσεις τη σημαία του όταν κανει υπερχείλιση ? Ασχετα με το αν κανεις polling ή θα πας στην ISR.

*Από ότι κατάλαβα αναφέρεσαι σε εφαρμογή με επαναλαμβανόμενα "delays" (δηλαδή χρονιστή). Αυτό που λες περί γραψίματος του TMR2 είναι εντελώς λάθος. Μόνο και μόνο που θα γράψεις πάνω του, έχεις αλλοιώσει την περίοδο!*
> Ναι, μιλάω για delays. Αν ο μΕ τρεχει με κρύσταλλο 20MHz σημαίνει ότι πραγματικά η καθε εντολή (εκτός απο αυτες που θελουν 2-χρόνους), το καθε NOP, το καθε 'τικ' ενός timer παίρνει 200nS. Αν θες αισθητό αποτελεσμα για ανθρώπους θα πρέπει να χρησιμοποιήσεις και αλλη μεταβλητη. Ωραία μεχρι εδω.
Λαθος είναι για σενα. Εγω που ξέρω τι θελω, θα γράψω στον timer2 και ναι φυσικά θα αλλαξει η περίοδος. Αυτό ακριβώς θέλω, να αλλαξει η περίοδος.

*Οι "παγίδες" που αναφέρει το datasheet είναι τα αυτονότητα.*
> Σωστά. Αν ομως ειχες δει "πρωτάρηδες" στην assembly για τους PIC, μαθητές, φοιτητές κτλ, θα ήξερες ότι παρόλο που τα γράφει το datasheet... δεν είναι πολύ αυτονόητα. Σαν να λέμε ότι ξεχνας αυτή την "παγίδα" (μεταξύ αλλων που υπάρχουν) και μετα ψάχνεσαι γιατί δεν κάνει αυτό θες.

Πανω κατω συμφωνω μαζί σου. Ανέφερα γενικά και ασύνδετα πράγματα για να μιλήσω για πολλές καταστάσεις. Δεν συνδέονται όλα εύκολα και σωστά. Αν πχ παρεις τον TMR2 και τις εντολές BTFSx τότε μπορεί να μην χρειαστεί να μερτήσεις κύκλους. Αφήνεις όμως έξω τον παράγοντα "ανθρωπο-προγραμματιστή" και την τεχνική του. Ίσως με τον τρόπο μου να πρέπει να μετρήσω και καποιους κύκλους!

Φιλικα  :Unsure: 



ΥΓ Δεν συνεχίζω γιατί το offtopic παει σύνεφο!

----------


## Nemmesis

παιδια το χεσ@με το γαιδαρο!!! off-topic και μπερδευουμε τον φιλο μας που προσπαθει να μαθει κατι συγκεκριμενο το οποιο ειναι η microbasic και οχι τα πλεονεκτιματα της assebly..

----------


## billtech

συμπερασμα?τα κοκκινα ποδιλατακια δεν εχουν καλα φρενα!!!!  :Smile:  :Smile: 

πλακα παιδια.

----------


## kopla

:Rolleyes: 
Παντως αν μπορεί καποιος admin/mod να τα μεταφερει σε αλλο thread ή και να τα σβήσει. (απο την πλευρά μου, για τα δικα μου μνματα δεν υπαρχει προβλημα) Αλλωστε δεν λεμε και καποιο νεο (για την assembly ..)

----------


## billtech

τωρα τι κανουμε?τι εχει το μενου?να προσπαθησουμε?

----------


## DT200

τι γίνετε ρε παιδιά , χαθήκαμε !
φίλε billtech σε τι κατάσταση βρίσκεσαι ?
την τελείωσες την άσκηση ?

----------


## billtech

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

----------


## DT200

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

δηλαδή αν πατήσεις το ένα κουμπί αλλάζει κατάσταση το ένα Led 
και αν πατήσεις το άλλο κουμπί αλλάζει κατάσταση το άλλο Led, 
χωρίς να έχουμε άλλες παρενέργειες.

----------


## billtech

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

----------


## DT200

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



καλά εσύ θα με τρελάνεις ! αφού στην σελίδα 12 του θέματος *pic16f84a clock alarm* http://www.hlektronika.gr/forum/show...16f84a&page=12
το είχες καταφέρει , που είναι το πρόβλημα ?
για δώσε κάποιο κώδικα να καταλάβουμε που έχεις φτάσει.

----------


## billtech

εσυ θα με τρελλανεις...εκεινο ηταν με αλλο κωδικα...αν μιλαμε για αυτον:
program koumpi 'gia pic16f84a

main:
TRISB=%11110000
PORTB=0

START:
if Button(PORTB, 7, 100, 0) then  goto aa
end if
goto start

aa:
while true
if Button(PORTB, 7, 100, 1) then
PORTB = not(PORTB)
goto start
end if
wend

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

END.

----------


## DT200

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

με μία πρόχειρη ματιά, νομίζω πως έχει λογική αυτό που λέω,
δεν είμαι και 100% σίγουρος.  :Crying:

----------


## billtech

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

----------


## billtech

program enoee    '16F84A @4MHz

DIM BUT   AS BYTE
DIM LED AS BYTE

main:
  TRISB=%11000000     'dilosis eisodon exodon
  LED  =%11000011     'vazoume sto kataxoriti LED tin timi C3

  PORTB=255           ' ********************************
  DELAY_MS(500)       'anavosvinei tis LED tis portas B
  PORTB=0             ' ********************************
'*************************************************  ************
START:
  delay_ms(200)
  BUT=PORTB            'vale tin porta B sto kataxoriti BUT
  if BUT.7=0 then GOTO AAA end if  'an paei sto 0 to RB7 tote pigene sto AAA
  if BUT.6=0 then GOTO ASD end if  'an paei sto 0 to RB7 tote pigene sto ASD

  PORTB=LED   'vale sto PORTB tin timi pou exei o kataxoritis LED
  GOTO START   'pigene sti arxi

ASD:
  IF LED.6=1 THEN LED.6=0 LED.0=0 'an to 6 bit tou kataxoriti LED einai 1 tote kane to 0 kai auto kai to 0 bit
    ELSE LED.6=1 LED.0=1 'allios kane kai to bit 6 kai to 0 bit asso
  END IF
  GOTO TEST1

AAA:
  IF LED.7=1 THEN LED.7=0 LED.1=0 'an to 7 bit tou kataxoriti LED einai 1 tote kane to 0 kai auto kai to 1 bit
    ELSE LED.7=1 LED.1=1  'allios kane kai to bit 7 kai to 1 bit asso
  END IF
  GOTO TEST1


TEST:
IF BUT.7=1 THEN
  PORTB=LED   'vale sto PORTB tin timi pou exei o kataxoritis LED
  END IF
  GOTO START

TEST1:
IF BUT.6=1 THEN
  PORTB=LED   'vale sto PORTB tin timi pou exei o kataxoritis LED
  END IF
  GOTO START

'AA:
'  BUT=PORTB
'  IF BUT=%00111111 THEN GOTO START
'  ELSE GOTO AA END IF
end.


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

----------


## DT200

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

1ο: και στις δύο περιπτώσεις στέλνεις το πρόγραμμα στο Test1



```
ASD:
  IF LED.6=1 THEN LED.6=0 LED.0=0 'an to 6 bit tou kataxoriti LED einai 1 tote kane to 0 kai auto kai to 0 bit
    ELSE LED.6=1 LED.0=1 'allios kane kai to bit 6 kai to 0 bit asso
  END IF
  GOTO TEST1

AAA:
  IF LED.7=1 THEN LED.7=0 LED.1=0 'an to 7 bit tou kataxoriti LED einai 1 tote kane to 0 kai auto kai to 1 bit
    ELSE LED.7=1 LED.1=1  'allios kane kai to bit 7 kai to 1 bit asso
  END IF
  GOTO TEST1
```


2o:δεν ενημερώνεις τον BUT για τυχών αλλαγές , δηλαδή  θα 
έπρεπε να γράψεις BUT=PORTB μετά το TEST1, επειδή δεν το κάνεις είναι 
φυσιολογικό ο BUT να έχει πάντα την τιμή BUT.6=0



```
TEST1:
IF BUT.6=1 THEN
  PORTB=LED   'vale sto PORTB tin timi pou exei o kataxoritis LED
  END IF
  GOTO START
```


βέβαια εδώ υπάρχουν και άλλα λάθη, διότι του λες τι να κάνει στην 
περίπτωση BUT.6=1 αλλά όχι τι να κάνει στην περίπτωση BUT.6=0 (μπορείς να γράψεις ELSE) .
και σε συνδυασμό με το προηγούμενο λάθος η ρουτίνα πάει κατευθείαν
στην εντολή GOTO START.
άρα δεν έχουμε έλεγχο του πότε αφήνουμε το κουμπί.

κάνε ακόμα μία προσπάθεια.

----------


## billtech

program enoee    '16F84A @4MHz

DIM BUT   AS BYTE
DIM LED AS BYTE

main:
  TRISB=%11000000     'dilosis eisodon exodon
  LED  =%11000011     'vazoume sto kataxoriti LED tin timi C3

  PORTB=255           ' ********************************
  DELAY_MS(500)       'anavosvinei tis LED tis portas B
  PORTB=0             ' ********************************
'*************************************************  ************
START:
  delay_ms(200)
  BUT=PORTB            'vale tin porta B sto kataxoriti BUT
  if BUT.7=0 then GOTO AAA end if  'an paei sto 0 to RB7 tote pigene sto AAA
  if BUT.6=0 then GOTO ASD end if  'an paei sto 0 to RB7 tote pigene sto ASD

  PORTB=LED   'vale sto PORTB tin timi pou exei o kataxoritis LED
  GOTO START   'pigene sti arxi

ASD:
  IF LED.6=1 THEN LED.6=0 LED.0=0 'an to 6 bit tou kataxoriti LED einai 1 tote kane to 0 kai auto kai to 0 bit
    ELSE LED.6=1 LED.0=1 'allios kane kai to bit 6 kai to 0 bit asso
  END IF
  GOTO TEST1

AAA:
  IF LED.7=1 THEN LED.7=0 LED.1=0 'an to 7 bit tou kataxoriti LED einai 1 tote kane to 0 kai auto kai to 1 bit
    ELSE LED.7=1 LED.1=1  'allios kane kai to bit 7 kai to 1 bit asso
  END IF
  GOTO TEST


TEST:
 BUT=PORTB
IF BUT.7=1 THEN
  PORTB=LED   'vale sto PORTB tin timi pou exei o kataxoritis LED
  else goto test
  END IF
  GOTO START

TEST1:
BUT=PORTB
IF BUT.6=1 THEN
  PORTB=LED   'vale sto PORTB tin timi pou exei o kataxoritis LED
  else goto test1
  END IF
  GOTO START

'AA:
'  BUT=PORTB
'  IF BUT=%00111111 THEN GOTO START
'  ELSE GOTO AA END IF
end.

γεια σου φιλε μου.
1.για το οτι εβαλα δυο φορες την ιδια υπορουτηνα ηταν καταλαθος.
2.με τις συμβουλες σου καταλαβα που ηταν τα λαθη μου και με τη μια τα διορθωσα και τωρα μου παιζει μια χαρα.νομιζω δεν εχει κανενα αλλο λαθος τωρα.

----------


## DT200

δεν το δοκίμασα αλλά πράγματι φαίνεται να δουλεύει κανονικά !  :Biggrin: 
τώρα αν θέλεις βρες ένα τρόπο να κάνεις αυτή τη ρουτίνα 
μικρότερη.



```
TEST:
 BUT=PORTB
IF BUT.7=1 THEN
  PORTB=LED   'vale sto PORTB tin timi pou exei o kataxoritis LED
  else goto test
  END IF
  GOTO START
```






> 1.για το οτι εβαλα δυο φορες την ιδια υπορουτηνα ηταν καταλαθος.



αυτό το λάθος είναι συχνό, το κάνουμε όλοι .
την σοβαρότητα των λαθών δεν την έβαλα με την σειρά.

----------


## billtech

πλακα μου κανεις?πως να μικρινει αυτο?δεν γινετε αυτο.  :Smile:

----------


## DT200

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

----------


## billtech

TEST:
 BUT=PORTB
IF BUT=$C0 THEN
  PORTB=LED   'vale sto PORTB tin timi pou exei o kataxoritis LED
  ELSE GOTO TEST
  END IF
  GOTO START

με αυτο εδω δεν επρεπε να δουλεψει?να στελνω και τα 2 αντι στο TEST1 & TEST να τα στελνω και τα δυο στο TEST.

----------


## DT200

πολύ σωστή η σκέψη σου !!! 
αλλά η τιμή των εξόδων κατά την ανάγνωση, νομίζω είναι πάντα 1 
άρα %11111111.
αν δεν πετύχει ψάξτε λίγο το τεχνικό φυλλάδιο.

----------


## billtech

TEST:
 BUT=PORTB
IF BUT=$FF THEN
  PORTB=LED   'vale sto PORTB tin timi pou exei o kataxoritis LED
  ELSE GOTO TEST
  END IF
  GOTO START

μου λες γιατι δεν μου δουλευει αυτο που εκανα?
κοιταξα το datasheet του pic16f84a αλλα δεν βρηκα κατι(βεβαια και τα αγγλικα μου δεν ειναι και τελια) αλλα νομιζω δεν εχει κατι που να βοηθαει.

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

----------


## DT200

δεν δουλεύει διότι η τιμή BUT δεν είναι FF, έχουμε κάνει λάθος.
αν θέλεις να δεις, τι τιμή έχει ο BUT στην πραγματικότητα,
τότε εμφάνισε τον στην LCD.
αν δεν θέλεις να μπεις σε περιπέτειες τότε κάνε ένα κόλπο,
γράψε IF BUT>%10111111 THEN... την κατάλαβες τη πουστιά  :Cool: 

Υ.Γ. μετά από αυτό, μπορείς να μικρύνεις την ρουτίνα ακόμα λίγο...
      για καλό το λέω μην με βρίσεις  :Biggrin:

----------


## billtech

TEST:
 BUT=PORTB
IF BUT.7 and BUT.6 THEN    'an kai to BUT.7 kai to BUT.6  tote
     PORTB=LED   'vale sto PORTB tin timi pou exei o kataxoritis LED
  ELSE GOTO TEST
END IF

  GOTO START

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

----------


## DT200

αν δεν έχεις κάνει αλλαγές στο υπόλοιπο 
πρόγραμμα τότε μέσα σε αυτή τη ρουτίνα έχεις 
περιττές εντολές .

άρα, ψάξ'το λίγο και μετά ανάρτησε όλο το πρόγραμμα για τις
τελευταίες πινελιές.

η άσκηση τελείωσε, πάμε για την επόμενη  :Biggrin: .

----------


## billtech

program enoee    '16F84A @4MHz

DIM BUT   AS BYTE
DIM LED AS BYTE

main:
  TRISB=%11000000     'dilosis eisodon exodon
  LED  =%11000011     'vazoume sto kataxoriti LED tin timi C3

  PORTB=255           ' ********************************
  DELAY_MS(500)       'anavosvinei tis LED tis portas B
  PORTB=0             ' ********************************
'*************************************************  ************
START:
  delay_ms(200)
  BUT=PORTB            'vale tin porta B sto kataxoriti BUT
  if BUT.7=0 then
     GOTO AAA end if  'an paei sto 0 to RB7 tote pigene sto AAA

  if BUT.6=0 then
     GOTO ASD end if  'an paei sto 0 to RB7 tote pigene sto ASD

  PORTB=LED   'vale sto PORTB tin timi pou exei o kataxoritis LED
  GOTO START   'pigene sti arxi
'*************************************************  **************
ASD:
  IF LED.6=1 THEN
         LED.6=0 LED.0=0 'an to 6 bit tou kataxoriti LED einai 1 tote kane to 0 kai auto kai to 0 bit
    ELSE LED.6=1 LED.0=1 'allios kane kai to bit 6 kai to 0 bit asso
  END IF

    GOTO TEST
'        **************************************
AAA:
  IF LED.7=1 THEN
        LED.7=0 LED.1=0 'an to 7 bit tou kataxoriti LED einai 1 tote kane to 0 kai auto kai to 1 bit
    ELSE LED.7=1 LED.1=1  'allios kane kai to bit 7 kai to 1 bit asso
  END IF

    GOTO TEST
'*************************************************  ******************

TEST:
 BUT=PORTB
IF BUT.7 and BUT.6 THEN    'an kai to BUT.7 kai to BUT.6  tote
'     PORTB=LED   'vale sto PORTB tin timi pou exei o kataxoritis LED
  ELSE GOTO TEST
END IF

  GOTO START
'*************************************************  *********************
end.

αυτος ειναι ο κωδικας.εχω βαλει σαν σχολιο αυτο που αφαιρεσα και παλι δουλευει.μην μου πεις αφαιρειτε και τιποτε αλλο θα χαζεψω.
παρακατω τωρα?  :Smile: !!!!!!!!!!

----------


## DT200

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

program enoee '16F84A @4MHz
DIM BUT AS BYTE
DIM LED AS BYTE

main:
TRISB=%11000000
LED   =%11000011
PORTB=255
DELAY_MS(500)
PORTB=0
'*******************
START:
delay_ms(50) ' να προσέχεις την δειγματοληψία 
BUT=PORTB
if BUT.7=0 then GOTO AAA end if
if BUT.6=0 then GOTO ASD end if
PORTB=LED
GOTO START
'**************
ASD:
IF LED.6=1 THEN LED.6=0 LED.0=0
   ELSE LED.6=1  LED.0=1  END IF
GOTO TEST
' ****************
AAA:
IF LED.7=1 THEN LED.7=0 LED.1=0
   ELSE LED.7=1  LED.1=1  END IF
'******************
'εδώ δεν έχω γράψει GOTO TEST διότι πολύ απλά θα πάει μόνο του

TEST:
BUT=PORTB
IF BUT.7 and BUT.6 THEN NOP ' δεν είχες γράψει τίποτε να κάνει, είναι κακό αυτό
   ELSE GOTO TEST END IF
GOTO START
'***********************
end.

το όλο πρόγραμμα είναι 127 εντολές.

πάμε για το επόμενο, βέβαια όποιος έχει απορία ...

----------


## billtech

οχι που θα μου ελεγες ειναι σωστο τελιος!!  :Smile:  σε πειραζω!!

ωραια...τωρα που παμε?

----------


## DT200

ακόλουθα στο Νο2
http://www.hlektronika.gr/forum/showthread.php?t=42889

----------


## Στέφανος

PORTB=255
DELAY_MS(500)
PORTB=0

Καλησπερα τωρα ξεκινησα και εχω καποιες αποριες!!
Σε τι ακριβως χρησιμευουν οι παραπανω εντολες στο συγκεκριμενο προγραμμα αλλα και γενικοτερα?

----------


## georgz

> PORTB=255
> DELAY_MS(500)
> PORTB=0
> 
> Καλησπερα τωρα ξεκινησα και εχω καποιες αποριες!!
> Σε τι ακριβως χρησιμευουν οι παραπανω εντολες στο συγκεκριμενο προγραμμα αλλα και γενικοτερα?



*PORTB=255* το οποίο μεταφράζετε δυαδικά σε '11111111', στέλνει δηλαδή λογικό 1 στα πιν εξόδου της PORTB

*DELAY_MS(500)* τα λόγια είναι περιττά. Κάνει ότι λέει και το όνομα.

*PORTB=0* είναι το αντίθετο του PORTB=255. Λογικό 0 στα πιν εξόδου της PORTB

Αλήθεια γιατί μαθαίνετε MicroBasic?

----------


## billtech

PORTB=255           ' η πορταΒ γινετε ολη Hi
DELAY_MS(500)     'περιμενει 500ms
PORTB=0              ' η πορταΒ γινετε ολη Lo

----------


## Στέφανος

> *PORTB=255* το οποίο μεταφράζετε δυαδικά σε '11111111', στέλνει δηλαδή λογικό 1 στα πιν εξόδου της PORTB
> 
> *DELAY_MS(500)* τα λόγια είναι περιττά. Κάνει ότι λέει και το όνομα.
> 
> *PORTB=0* είναι το αντίθετο του PORTB=255. Λογικό 0 στα πιν εξόδου της PORTB
> 
> Αλήθεια γιατί μαθαίνετε MicroBasic?



Ναι αλλα για ποιο λογο γινεται ολο αυτο, ποιος ο σκοπος?
microbasic μαθαινω επειδη εχει πολλα παραδειγματα...

----------


## georgz

Ποιος είναι ο σκοπός του προγράμματος? Γίνε λίγο πιο συγκεκριμένος.

----------


## Στέφανος

To προγραμμα για να αναψει ενα led για τον pic16f84a που εκανα ειναι το παρακατω:

program red
dim le as byte
dim but as byte
main:
  TRISB=%11000000
  le  =%00000000
  PORTB=255
  DELAY_MS(500)
  PORTB=0

start:
but=PORTB
if but.6=1 then
le.1=1 le.6=1
end if
PORTB=le

end.

Ειναι σωστο?

Στο παρακατω(περιβαλον mikrobasic στο new project) τι επιλογες πρεπει να κανω?
http://img213.imageshack.us/i/88381651.jpg/

το κυκλωμα που φτιαχω στο ραστερ ειναι το παρακατω:
http://img84.imageshack.us/i/12437052.jpg/
Ειναι σωστο??

Στον περιβαλλον του προγραμματιστη πρεπει να κανω καποια αλλη επιλογη εκτος απο την επιλογη μικροελεγκτη???

http://img686.imageshack.us/i/83251383.jpg/

Λιγο βοηθεια ρε παιδια!!!!!!!!!

----------


## Στέφανος

> Ποιος είναι ο σκοπός του προγράμματος? Γίνε λίγο πιο συγκεκριμένος.



Ειναι το προγραμμα στη σελιδα 2. Αναφερεται γενικοτερα σε ολο το μαθημα Νο1.

----------


## billtech

> To προγραμμα για να αναψει ενα led για τον pic16f84a που εκανα ειναι το παρακατω:
> 
> program red
> dim le as byte
> dim but as byte
> main:
>   TRISB=%11000000
>   le  =%00000000
>   PORTB=255
> ...



ειναι σωστο ΑΛΛΑ δεν το νομιζω να προλαβεις να πατησεις το button σου αφου δεν 
κανεις ενα Loop να τρεχει συνεχεια ο κωδικας σου πχ



```
start:
but=PORTB
if but.6=1 then
le.1=1 le.6=1
end if
PORTB=le
goto start
end.
```






> Στο παρακατω(περιβαλον mikrobasic στο new project) τι επιλογες πρεπει να κανω?
> http://img213.imageshack.us/i/88381651.jpg/



αφου επιλεξεις κρυσταλλο, ονομα αρχειου,τοποθεσια αποθηκευσης και επεξεργαστη μετα απλα πατα default.






> το κυκλωμα που φτιαχω στο ραστερ ειναι το παρακατω:
> http://img84.imageshack.us/i/12437052.jpg/
> Ειναι σωστο??



γενικα το κυκλωμα σου ειναι σωστο αν γυρισεις αναποδα την led. εχεις αναποδα την led προς τα 5V. Και επισης νομιζω ξεχασες να σχεδιασεις τον κρυσταλλο σου πανω στα ποδια 15,16.





> Στον περιβαλλον του προγραμματιστη πρεπει να κανω καποια αλλη επιλογη εκτος απο την επιλογη μικροελεγκτη???
> 
> http://img686.imageshack.us/i/83251383.jpg/



εγω δεν χρησιμοποιω αυτο το προγραμμα αρα δεν μπορω να σε βοηθεισω.το winpic800 χρησιμοποιω εγω με την σειριακη αν θες να το χρησιμοποιεισεις. αλλιως.....ε βγαλτα περα μονος σου μετα....χαχαχαχχαχαχα :Tongue2:  :Tongue2:  :Lol:  :Lol: 
πλακα κανω.

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

----------


## Στέφανος

Λεγοντας ξεχασα τον κρυσταλλο τι εννοεις????  :Smile:

----------


## billtech

> Λεγοντας ξεχασα τον κρυσταλλο τι εννοεις????



στα ποδια 15,16 τι λεει το datasheet οτι ειναι?

----------


## Στέφανος

Βασικα κατσε λιγο γιατι μπερδευτικα. Ο ελεγκτης δεν περιμενει να παρει μια εισοδο για να σου δωσει μια εξοδο??? Ποιος ο λογος της "loopας"??? Μου το εξηγεις λιγο??? Και κατι αλλο! Υπαρχει καποιο προγραμμα που να σχεδιαζω το κυκλωμμα και μετα να βλεπω πως δουλευει σε πραγματικο χρονο? Ειναι λιγο μανικι να βαζω να βγαζω το ολοκληρωμενο για προγραμματισμο και μετα να το βαζω στ ραστερ!!!!

----------


## billtech

για τα απλα προγραμματα που θες τωρα κανει ο debugger την Mikroe.
ξαναποσταρε το κωδικα σου μαζι με σχολια σε καθε γραμμη. και θα σου λυθει η απορια γτ σου ειπα να βαλεις loop σε αυτο το προγραμμα.

----------


## Στέφανος

> στα ποδια 15,16 τι λεει το datasheet οτι ειναι?



δεν εχω φιλε μου...

----------


## Στέφανος

but=PORTB       Η μεταβλητη but να γινει ιση με το portb
if but.6=1 then  Αν η εισοδος 6 γινει 1 τοτε
le.1=1 le.6=1     το 1 bit της le να γινει 1 και το 6 να γινει επισης 1
end if               τελος if
PORTB=le          η portb να γινει ιση με τη μεταβλητη le.

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

----------


## georgz

Το Datasheet εδώ. Χρειάζεσαι ένα κρύσταλλο στα πιν OSC1 OSC2 μαζί με κεραμικούς πυκνωτές 20-30pf στην γείωση.

----------


## billtech

δες το ποστ #23 σε αυτο το θεμα.
εχω αναιβασει ενα σχηματικο.

----------


## georgz

> Ο ελεγκτης δεν περιμενει να παρει μια εισοδο για να σου δωσει μια εξοδο??? Ποιος ο λογος της "loopας"??? Μου το εξηγεις λιγο???



Ο ελεγκτής εκτελεί με την σειρά της εντολές. Ο βρόγχος κάνει το πρόγραμμα να μην τελειώσει ποτέ. Αν δηλαδή θέλεις να κάνεις ένα led να αναβοσβήνει πάει κάπως έτσι:
Αρχή
Άναψε led
Περίμενε 1s
Σβήσε led
περίμενε 1s
Πήγαινε στην αρχή. _<-- Ο βρόγχος_

Χωρίς τον βρόγχο το led θα αναβόσβηνε 1 μόνο φορά και μετά θα τελείωνε το πρόγραμμα και θα έπρεπε να το κάνεις επανεκκίνηση. 






> Υπαρχει καποιο προγραμμα που να σχεδιαζω το κυκλωμμα και μετα να βλεπω πως δουλευει σε πραγματικο χρονο? Ειναι λιγο μανικι να βαζω να βγαζω το ολοκληρωμενο για προγραμματισμο και μετα να το βαζω στ ραστερ!!!!



Ποιον προγραμματιστή έχεις?? Υπάρχουν προγραμματιστές που μπορείς να δουλέψεις πάνω στο κύκλωμα.

----------


## Στέφανος

Βρηκα εναν κρυσταλλο στα 8 MHZ να τον βαλω??? Εχω αυτον τον προγραμματιστη http://cgi.ebay.com/USB-PIC-Microcon...item230c7be6e1

----------


## georgz

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

----------


## Στέφανος

> Βάλτο απλά θα πρέπει να αλλάξεις τις καθυστερήσεις, .



Υπαρχει καπου να διαβασω για τις καθυστερισεις?? Πως βγαινουν τα νουμερα????? Δηλαδη για να κανω μια καθυστεριση 1s με α)8ΜΗΖ, β)10ΜΗΖ, γ)4ΜΗΖ κρυσταλλο τι θα πρεπει να γραψω?

----------


## georgz

Οι μικροελεγκτές pic απαιτούν 4 κύκλους για την ολοκλήρωση μια εντολής. Άρα αν χρησιμοποιούμε κρύσταλλο 20Mhz η συχνότητα θα διαιρεθεί δια 4 με αποτέλεσμα η πραγματική συχνότητα να είναι 5Mhz. Για να υπολογίσεις σε πόσο χρόνο θα εκτελεστεί μια εντολή κάνεις το εξής:

S=1/F(συχνότητα) => 

S=1/5Mhz(ή 5.000.000Ηz) = 0.0000002 δευτερόλεπτα ή 200ns/ανα κύκλο.

Για να δημιουργήσεις μια καθυστέρηση 1s με 20Mhz κρύσταλλο απαιτούνται 5.000.000 εντολές. Μπορείς απλά να βάλεις τoν μC να αφαιρεί αριθμούς.


Ξέχνα το παραπάνω υπογραμμισμένο. Αφού γράφεις σε basic  :Thumbdown:  το μόνο που έχεις να κάνεις είναι να γράψεις απλά ''DELAY_S/MS/US(και ότι καθυστέρηση θέλεις)'' και γίνεται μόνο του. Τόσο δύσκολο...... :Head:

----------


## Στέφανος

Παιδια παλι δε δουλευει. Δε ξερω τι μπορει να ειναι λαθος. Προσθεσα στο κυκλωμα τον κρυσταλο στα 8ΜΗΖ(μονο στα 8 ειχε) και τους πυκνωτες συν τη λουπα στο προγραμμα. Τι μπορει να ειναι λαθος????

----------


## billtech

> Παιδια παλι δε δουλευει. Δε ξερω τι μπορει να ειναι λαθος. Προσθεσα στο κυκλωμα τον κρυσταλο στα 8ΜΗΖ(μονο στα 8 ειχε) και τους πυκνωτες συν τη λουπα στο προγραμμα. Τι μπορει να ειναι λαθος????






```
program test

dim le as byte
dim but as byte
main:
TRISB=%11000000
le =%00000000
PORTB=255
DELAY_MS(500)
PORTB=0

start:
but=PORTB
if but.6=1 then
le.1=1 le.6=1
end if
PORTB=le
goto start

end.
```


Και σου αναιβαζω και το hex να το δοκιμασεις.
ειναι ο PIC16F84A 8MHz κρυσταλλο.

----------


## Στέφανος

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

----------


## Στέφανος

Βασικα το προγραμμα που μου εστελες ειναι το ιδιο μ αυτο που σου ανεβασα. Εκτος απ αυτο μετρησα με πολυμετρο την εξοδο και τελικα ειχα(!!!), αλλα η ταση ηταν 0,5V και γι αυτο τοσο καιρο δεν αναβε το led. Οποτε μαλλον ειμαι οκ απο την ασκηση 1. μηπως εχεις να προτεινεις κατι για να μου δεινει την ιδια ταση με τησ εισοδου και στην εξοδο????

----------


## georgz

Θα στο χαλάσω αλλά... με 0,5V δεν έχεις λογικό 1. Κάτι κάνεις λάθος, έπρεπε να σου δίνει 4,5-5V για να έχεις έξοδο.

----------


## billtech

Οπως προ-ειπε ο Γιωργος κατι δεν παει καλα.
ξανα κοιταξε το κυκλωμα σου.
αν δεν τον εχεις βρει αναιβασε εδω ενα σχεδιο οπως ακριβως το εκανες και δοκιμαζεις.
με ολα τα εξαρτηματα.

----------


## Στέφανος

To κυκλωμα ειναι το παρακατω ακριβως οπως το φτιαχνω σε ραστερ απλα επειδη δεν ημουν σιγουρος καποια στιγμη εβαλα αναποδα το led. To ολοκληρωμενο δεν ειναι ο pic , τα ποδαρακια ομως ειναι σωστα σαν νουμερα!!!

http://img838.imageshack.us/i/23492882.jpg/

----------


## billtech

8kHz κρυσταλλο εβαλες οπως λες στο σχεδιο? Οχι 8MHz?
6V ταση εδωσες?αν δεν κανω λαθος ο επεξεργαστης παει μεχρι 5.5V ταση.

το μεγαλυτερο λαθος!! δεν βλεπω να εβαλες μια pull-up στο MCLR. αρα ο επεξεργαστης δεν ξεκιναει ΠΟΤΕ!!!στο ποδι 4 δηλαδη.

στο ποστ #77 σου ειχα πει να δεις το ποστ #23 που ειναι ενα κυκλωμα που εχω βαλει και ειναι μια χαρα. να δεις το σχηματικο.

----------


## Στέφανος

Εβαλα την αντισταση στο MCLR αλλαξα και την ταση στα 5V αλλα παλι τιποτα :Sad: 
Κατι δεν παει καλα... Στην εξοδο μου βγαζει παλι 2,5V και το λαμπακι αναβει οταν χτυπαω το ποδι του κρυσταλου με το prob του πολυμετρου και σβηνει με το μπουτον στον MCLR....κουφο????? Ο κρυσταλος γραφει πανω 8,0000Η5J εγω για 8ΜΗΖ ζητησα....

----------


## billtech

αν θες ξαναπηγαινε και παρε εναν αλλον..ισως να εχει προβλημα. αν θες βγαλε 1-2 φωτος απο το κυκλωμα σου καθαρες να τις δουμε.
το κυκλωμα που σου ειπα να δεις στο ειδες?στο #23 νομιζω.
το ειδες?

----------


## georgz

> σβηνει με το μπουτον στον MCLR....κουφο?????



Καθόλου, του πιν MCLR χρησιμοποιείτε για reset της συσκευής.

----------


## Στέφανος

Την ειδα την #23 αλλα το αφησα το θεμα λογο αλλων υποχρεωσεων!!! 
Το κουφο πηγαινε στο στο οτι αναβει με την επαφη του prob στον κρυσταλλο  :Lol: 
Φωτο θα αναιβασω μολις ξεκινησω παλι να ασχολουμαι με το θεμα!!!
Κατι τελευταιο!!! Ευχαριστω πολυ ολους σας για την βοηθεια και την καθοδηγιση και καλη χρονια!!!!!!

----------


## J.V

Καλησπέρα σας,
Έχω μια εργασία που θα πρεπει να παραδώσω στο εργαστήριο ΜΙΧΑΤΡΟΝΙΚΗΣ με μικροελεγκτές και γλώσσα microbasic.
Υπάρχει κάποιος που θα μπορούσε να βοήθησει?
Ψάχνω ένα έυκολο κυκλώμα,και το  πρόγραμμα του κύκλώματος σε mikrobasic.

----------


## Diogenis29

Καλημέρα, αν και ηλεκτρονικός πολλά χρόνια δεν έχω ποτέ ασχοληθεί με προγραμματισμό  θα ήθελα να κάνω μια ερώτηση σαν αρχάριος που είμαι  έχω έναν κώδικα σε mikrobasic(χχχχ.pbas) έχω επίσης φτιάξει το jdm programmer (http://www.hlektronika.gr/forum/showthread.php?t=36287) προσπαθώ μέσω του προγράμματος "mikrobasic pro for pc" να προγραμματίσω έναν PIC αλλά δεν το βλέπει το jdm, μάλλον θέλει usb jdm programmer. Προσπαθώ να  φτιάξω ένα project χωρίς φυσικά να το έχει δει το jdm και να περάσω τον κώδικα (και οποιωνδήποτε κώδικα) μου βγάζει πρόβλημα. Mε άλλα προγράμματα τον βλέπει τον jdm (π.χ. PICPgm Programmer) αλλά θέλει hex και δεν ξέρω πως να το μετατρέψω από .pbas σε .hex. Τι να κάνω ΒΟΗΘΕΙΑ!!!!!

----------


## briko

1 αντιγράφεις τον κώδικα (στην σελίδα που δίνω ) με control c  η και με αντιγραφη.
2  ανοίγεις την mikrobasic -όχι την pro.
3 πας στο project.  Αν εχεις επιλογή πατάς το close project , υπάρχει περίπτωση να εχει στην μνήμη παλιό.
4 πας στο new project και στο name βάζεις κάποιο δικό σου όνομα - στην δεύτερη γραμμή βάζεις που θα το αποθηκεύσεις  στην 4η γραμμή επιλέγεις τον επεξεργαστή ,  στο clock βάζεις την συχνότητα 008.000000 , πατάς το default 
 5 σου ανοίγει το κεντρικό παράθυρο - διαγραφεις αυτό που εχει γράψει (μόνον σ΄αυτή την περίπτωση) και με ένα control V  η επικολληση εχεις επικολλήσει το κείμενο του προγράμματος που αντέγραψες στην αρχή.
6 στο project τώρα εχει μια επιλογή build all.  αν την πατήσεις  δημιουργεί στο φάκελο που εχεις ορίσει όλα τα αρχεία μαζί και το .HEX  που θέλεις.

----------


## Diogenis29

Καλησπέρα έχω μόνο την PRO, που μπορώ να βρω την microbasic να την κατεβάσω, διότι κατέβασα μια από το επίσημο site αλλά μου βγάζει demo limit.

----------


## billtech

> Καλησπέρα έχω μόνο την PRO, που μπορώ να βρω την microbasic να την κατεβάσω, διότι κατέβασα μια από το επίσημο site αλλά μου βγάζει demo limit.



http://www.sendspace.com/file/b6pxpj

----------


## Diogenis29

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

IMAG0006.jpgIMAG0007.jpgIMAG0008.jpg

----------


## briko

Διογένη το πρόγραμμα που δίνω είναι το βασικό, μπορείς να κάνεις *όλους* τους ελέγχους *ΑΛΛΑ* τις ρυθμίσεις των θερμοκρασιών και των χρόνων τις βάζεις με το χέρι. Το πρόγραμμα με τα μενού και με τις εισαγωγές στοιχείων είναι περίπου 5 φορές μεγαλύτερο από αυτό και δεν το δίνω.

Αν θες μπορείς να κάνεις εσύ κάποια προσπάθεια και μπορώ να σε βοηθήσω. 
Ευχαριστώ

----------


## Diogenis29

Καλησπερα εχω κανει αρκετη προοδο απο χθες  εχω ομως καποια προβληματα (α. το χρονο που θα αλλαζει η portd 2,3(psp2,psp3) ωστε τα ρελε να δινουν μια 12v και μια -12v (μοτερ)) πως την ρυθμιζω? β. πως μπωρο να δωσο εντολες ωστε στην υγρασια να μην μου βγαζει το (-) μπροστα?

Στην εντολη TMROL=    μου βγαζει προβλημα την αφερεσα και μου τρεχει κανονικα αλλα πιστευω οτι κατι δεν δουλευει.

Ευχαριστω πολυ.

----------


## briko

```
sub procedure interrupt

  conhour = conhour + 1        'metrame thn ora
  if conhour >= 18000 then          ' ean h ora einai megalyterh apo ayti poy theloyme ***bazoyme ta deyterolepta ths oras
    consec = consec + 1  portd.2=1       'prosuetoyme deyterolepta
   if consec > 5 then                       'ean ta deyterolepta teliosoyn
    consec = 0 conhour = 0   ' conbit = conbit + 1  'midenizoyme ta deytera tin ora
     portd.2=0       'teleyteo bit  kai midenizoyme tis portes ejodoy
  end if
  end if
```


 το 18000 ειναι τα δευτερόλεπτα που θα κάνει για να γυρίσει και το consec 5 είναι τα δευτερόλεπτα που θα γυρνάει.
 δηλ. κάθε 18000 (5ωρες) θα ενεργοποιείτε για 5sec.




```
TMR0L = 247         'times l kai h gia tmr0 1 sec
  TMR0H = 194
  INTCON.TMR0IF = 0   ' reset and start TMR0 interrupt cycle
```


με αυτές τις εντολές εχεις ρυθμίσει τον pic να μετράει sec.

----------

Diogenis29 (22-02-13)

----------


## Diogenis29

Τελικά είχες δίκιο ο pic16f877a δεν δέχεται των παρακάτω κώδικα
έβαλα στην mikrobasic των PIC18F452 και τον φορτώνει κανονικά περιμένω με αγωνία τον pic απο ebay να το τεστάρω.
Γιατί όμως δεν το τρέχει με το 877a?



TMR0L = 247         'times l kai h gia tmr0 1 sec  TMR0H = 194  INTCON.TMR0IF = 0   ' reset and start TMR0 interrupt cycle

----------


## briko

γιατί ο 16f... δεν εχει timer0 σε 16bit .δεν βγαίνουν οι διαιρέσεις.
Αν είναι να μπει ο 16f... τότε θα πρέπει να έχουμε αντί 18000 , 1800000

----------


## Diogenis29

Καλησπερα, σε εχω ζαλισει αλλα θελω πολυ να μαθω, το ic4 μου στελνει ενδειξεις ενω το ic1 οχι, το κυκλωμα το εχω ελεξη 2 φορες αλλαξα ακομα και to ds αλλα τιποτα, το προγραματισμο τον ελεξα ειναι σωστα, διοτι εβαλα porta 5 σε ολλα και μου εδειχνε και στα δυο την ιδια θερμοκρασια του ic4 ενω οταν βαζω porta 0 που ειναι και το σωστο μου βγαζει μηδενικα HELP!!!!!!

----------


## Diogenis29

Το εχω κανει ολα αυτα που βρηκα απο ενα site μα μου βγαζει συνεχως προβλημα στο TMROL, σου στελνω και μια φωτο να δεις.

klosomixani.jpg





> γιατί ο 16f... δεν εχει timer0 σε 16bit .δεν βγαίνουν οι διαιρέσεις.
> Αν είναι να μπει ο 16f... τότε θα πρέπει να έχουμε αντί 18000 , 1800000

----------


## briko

από το δεύτερο .
προσπαθείς να κάνεις το πρόγραμμα με 16 σειρά ενώ και μόνος σου είπες με τον 18 δουλεύει.
για το πρώτο  αφού άλλαξες το ds πιθανών να εχεις κάποιο κόψιμο από το ds έως την επαφή του pic .
μέτρατο με πολυμετρο από την μια άκρη έως την άλλη.
Άλλη περίπτωση που μου έκατσε είναι να έκαψα την πόρτα του pic . Εκεί αλλάζεις τις παραμέτρους που αναφέρονται στο PORTA,0 με π.χ. PORTA,1 αφού όμως θα επεμβεις και στο κύκλωμα για να στείλεις το ds στην PORTA,1
έτσι όπως βλέπω το κύκλωμα η έξοδος του ic1 περνάει κάτω από την γη του πυκνωτή C6 ... Δεν πιστεύω να την εχεις συνδεση με την γη

----------


## Diogenis29

Καλησπερα τελικα και τα δυο pic16f877a που ειχα η πορτα 0 ηταν καμενη  :Confused1:  το εβαλα στην πορτα 1 και δουλευει κανονικα. κατι αλλο θα μπωρεσης να μου πεις καποιους κωδικες που χρησιμοποιουμε για μπορουμε να βαζουμε ρυθμισεις απο το sv1? Ο χαρακτηρας ''C'' στο lcd γιατι τρέμοπαιζει?

----------


## briko

μονον αυτος?            ?????





```
if Button(PORTd,4,2000,1) then if button(portd,5,100,1)then data=0 Lcd_Cmd(LCD_CLEAR) Lcd_Out(1,13,"MENU")
                                                 portd.0=0  goto elegxo end if  end if
```


με αυτή την εισαγωγή μπαίνεις στο μενού πατώντας τα πλήκτρα d4 και d5

----------


## Diogenis29

Καλησπέρα τόσο καιρό προσπαθώ να μάθω γιατί δεν τρέχει ο κώδικας σε 16f, έκανα της μετατροπές για τον 16f αλλά τζίφος έβαλα 3600 στο χρόνο που δίνει εντολή στο ρελε για να μπορώ να βλέπω και να μετράω την έξοδο πιο γρήγορα αλλά δεν μου δίνει ενδείξεις. plz help προσπαθω πολυ να μαθω, εχω το datasheet του pic16f877a 






> program onewire
> 
> ' Set TEMP_RESOLUTION to the corresponding resolution of your DS18x20 sensor:
> '  18B20: 12
> 'const TEMP_RESOLUTION as byte = 12
> 
> 
> dim
>   j1 ,j2 , consec as byte
> ...

----------


## briko

TMR1L = 247 'times l kai h gia tmr0 1 sec
 TMR1H = 194
 INTCON.TMR0IF = 0 ' reset and start TMR0 interrupt cycle

στην  16 σειρα ο τιμερ εχει μονον TMR1 ενω η 18 σειρα εχει και L και H δηλ. ειναι 16bit

----------


## Diogenis29

Εγώ νόμιζα ότι είναι δυο 8bit καταχωριτες ο TMR1L και ο TMR1H και το αναγνωρίζει, μου φαίνεται ότι τα έχω μπερδέψει λίγο HELP!!!!!

----------


## Diogenis29

Καλησπερα ο κωδικας αυτος ειναι για το ενα ρελε 





> sub procedure interrupt
> 
>   conhour = conhour + 1        'metrame thn ora
>   if conhour >= 60 then          ' ean h ora einai megalyterh apo ayti poy theloyme ***bazoyme ta deyterolepta ths oras
>     consec = consec + 1  portd.2=1       'prosuetoyme deyterolepta
>    if consec > 5 then                       'ean ta deyterolepta teliosoyn
>     consec = 0 conhour = 0   ' conbit = conbit + 1  'midenizoyme ta deytera tin ora
>      portd.2=0       'teleyteo bit  kai midenizoyme tis portes ejodoy
>   end if
>   end if



portd.2

γραφω το ιδιο και για το δευτερο ρελε αλλα βαζω portd.3???

γιατι τωρα μου ενεργοποιει το ενα ρελε και δινει 12v καθε 1 λεπτο και κραταει για 5 δευτερα
το δευτερο ρελε θελω να αρχιζει μετα απο 1 ωρα απο την ωρα που τελιωσε το πρωτο και να κραταει 5 δευτερα και να εχει -12v ωστε το moter να γυριζει αναστροφα.





> sub procedure interrupt
> 
>   conhour = conhour + 1        'metrame thn ora
>   if conhour >= 3600 then          ' ean h ora einai megalyterh apo ayti poy theloyme ***bazoyme ta deyterolepta ths oras
>     consec = consec + 1  portd.3=1       'prosuetoyme deyterolepta
>    if consec > 5 then                       'ean ta deyterolepta teliosoyn
>     consec = 0 conhour = 0   ' conbit = conbit + 1  'midenizoyme ta deytera tin ora
>      portd.3=0       'teleyteo bit  kai midenizoyme tis portes ejodoy
>   end if
>   end if



ειναι σωστος ο κωδικας???

----------


## briko

όχι. βάζεις ένα καταχωρητη ο οποίος γίνετε μόνον 1 και 0 και όταν είναι 1 γυρνάει η portd2 και όταν είναι 0 να γυρνάει η portd3.

----------


## Diogenis29

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

----------


## briko

μια λεξη - φραση που στην αρχη λες στο προγραμμα οτι ειναι bit byte word κτλ




> j1 ,j2 , consec as byte
>   temp1 ,temp2 ,conhour as word
>   tair , eair ,twet ,ewet , eoliko ,rh as float
>    apotelesmarh ,tairstring ,twetstring as string[5]

----------


## Diogenis29

Έφτιαξα αυτό αλλά δεν ξέρω εάν το εννοούσες έτσι έβαλα δυο καταχωρητες των dos1 και dos2.





> dim
> j1 ,j2 , consec ,dos2  as byte
> temp1 ,temp2 ,conhour ,dos1 as word
> tair , eair ,twet ,ewet , eoliko ,rh as float
> apotelesmarh ,tairstring ,twetstring as string[5]
> 
> 
> sub procedure interrupt
> 
> ...







> όχι. βάζεις ένα καταχωρητη ο οποίος γίνετε μόνον 1 και 0 και όταν είναι 1 γυρνάει η portd2 και όταν είναι 0 να γυρνάει η portd3.

----------


## briko

controlbit as byte
conhour = conhour + 1        
  if conhour >= 18000 then   
    consec = consec + 1 
εδω θα βαλουμε εναν ελεγχο σε ενα controlbit εαν ειναι 0 να ανοιγει την πρωτη πορτα και εαν ειναι 1 να ανοιγει την δευτερη

  if consec > 5 then        
    consec = 0 conhour = 0
εδω θα προσθετουμε στο controlbit +1 οποτε θα εχουμε παντα η 0 η 1 
επειδη ομως δεν υπαρχει ορισμος bit βαζουμε μια εντολη controlbit = controlbit and 1 
     portd.2=0       εδω θα μηδενιζουμε και τις 2 πορτες
  end if
  end if

----------


## Diogenis29

Καλημέρα δεν μου βγαίνει με τίποτα,  έτσι πως μπορώ εγώ εφόσον τελείωση ο χρόνος τον 5 δευτερόλεπτων τον όπιον είναι ανοιχτή η πόρτα 2 (+12V)να αρχίσει να μετρά 1 ώρα και να ανοίξει η πόρτα 3 (-12V)για 5 δεύτερα να αρχίσει μετά πάλη να μετρά ο χρόνος τις μιας ώρας κ.τ.λ. το προγραμμάτισα αλλά μου μπέρδεψε τούς χρόνους και κάποια στιγμή μου έφερε + και - και έκανε βραχυκύκλωμα. μήπως θα ήταν καλλίτερο κάθε φορά που φτιάχνω τον προγραμματισμό πριν το δοκιμάσω να στο δείχνω εάν δεν σε πειράζει.

----------


## Diogenis29

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

controlbit as byte


conhour = conhour + 1 
if conhour >= 18000 then 
consec = consec + 1 
if controlbit=0 then 
portd.2=1
if controlbit=1 then
portd.3=1



if consec > 5 then 
consec = 0 conhour = 0
controlbit=controlbit + 1
portd.2=0 , portd.3=0
end if
end if

----------


## briko

controlbit as byte


conhour = conhour + 1 
if conhour >= 18000 then 
consec = consec + 1 
if controlbit=0 then 
 portd.2=1   end if
if controlbit=1 then
 portd.3=1   end if



if consec > 5 then 
consec = 0 conhour = 0
controlbit=controlbit and 1
portd.2=0 , portd.3=0
end if
end if

----------


## Diogenis29

Καλησπέρα χρειαζετε και κάποια άλλη παράμετρος ώστε να δουλέψει; διότι κάθε 5 ώρες ανοίγει και τις δυο πόρτες αλλά στην έξοδο τον rele παίρνω συνέχεια -12V για 5 δευτερόλεπτα. Υπάρχει περίπτωση να έχω κάνει κάποιο λάθος στην συνδεσμολογια;





> controlbit as byte
> 
> 
> conhour = conhour + 1 
> if conhour >= 18000 then 
> consec = consec + 1 
> if controlbit=0 then 
>  portd.2=1   end if
> if controlbit=1 then
> ...

----------


## briko

if controlbit=0 then 
 portd.2=1 end if
 if controlbit=1 then
 portd.3=1 end if


όπως βλέπεις ΔΕΝ γίνετε να είναι ανοικτές και η πόρτα 2 και η πόρτα 3 ταυτόχρονα .

βάλε αντί για 18000     30 ώστε να ανοίγει το κύκλωμα κάθε 30 sec για να κάνεις τους ελέγχους και μέτρα απευθείας στις επαφές του Pic.
πρέπει να εχεις μια φορά την 2 και μια την 3 on

----------


## Diogenis29

Το μέτρησα και μονο η πορτα 2 ανοιγει καθε 30sec και για 5sec.





> if controlbit=0 then 
>  portd.2=1 end if
>  if controlbit=1 then
>  portd.3=1 end if
> 
> 
> όπως βλέπεις ΔΕΝ γίνετε να είναι ανοικτές και η πόρτα 2 και η πόρτα 3 ταυτόχρονα .
> 
> βάλε αντί για 18000     30 ώστε να ανοίγει το κύκλωμα κάθε 30 sec για να κάνεις τους ελέγχους και μέτρα απευθείας στις επαφές του Pic.
> πρέπει να εχεις μια φορά την 2 και μια την 3 on

----------


## briko

_if controlbit=0 then_ 
_portd.3=1 end if_
_if controlbit=1 then_
_portd.2=1 end if_
_για να δεις αν εκαψες καμιά πόρτα βάλτο έτσι._
_αν ειναι καμένη η 3 τότε στο πρόγραμμα βάλε_ 
_portd.4=1 end if και κανε μια αλλαγη στο κύκλωμα την 3 με την 4_

----------


## Diogenis29

Καλησπέρα δυστυχώς τίποτα το μόνο που μου ανοίγει είναι η πόρτα d.2 κάθε 30 δεύτερα και για 5 δεύτερα, δεν ξέρω τι γίνεται, πάντως στο κύκλωμα όλα είναι οκ.

----------

