# Συζήτηση Κυκλωμάτων > Ψηφιακά Κυκλώματα > Μικροελεγκτές >  >  Μάθημα στην MikroBasic No4 (επικοινωνία I²C)

## DT200

ήρθε η ώρα να μάθουμε να επικοινωνούνε με τον δίαυλο I²C.
στην MikroBasic έχουμε δύο επιλογές 
1ον με Software I²C και 2ον με το hardwear  I²C που έχουν ορισμένου Pic.
εμείς αφού έχουμε επιλέξει τον 16F877 θα το κάνουμε με το ενσωματωμένο
περιφερειακό του (hardwear  I²C).

άρα ένωσε το και κάνε και ένα παράδειγμα επικοινωνίας.

----------


## billtech

γεια σου,
εκανα το παρακατω προγραμμα για τον PIC16F877A, δεν εκανα το κυκλωμα ακομα αλλα παλεψα λιγο το κωδικα.κοιταξε τον και πες μου που ειναι τα λαθη μου, αν εχω τπτ σωστο  :Smile: . για αρχη εμενα μου αρεσει χεχε  :Smile: 

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

program I2C_EXAMP

dim Dieuth, DEUT, LEPT, ORA as byte

main:
  I2C_Init(100000)
  TRISB = 0
  TRISC = 255

  Lcd_Config(PORTB, 3, 2, 1, 0, PORTB, 4, 6, 5)
  Lcd_Cmd(LCD_CLEAR)
  Lcd_Cmd(LCD_CURSOR_OFF)


  I2C_Start
  Dieuth = %00
  I2C_Wr(Dieuth)
  DEUT=I2C_Rd(0)

  Dieuth = %01
  I2C_Wr(Dieuth)
  LEPT=I2C_Rd(0)

  Dieuth = %02  <---------???
  I2C_Wr(Dieuth)
  ORA=I2C_Rd(0)

  I2C_Stop

  END.

----------


## briko

Μια που φτάσαμε στο σημείο επικοινωνίας με το RTC δεν είναι καλύτερο να χρησιμοποιήσουμε το Philips PCF8583 RTC αφού η microbasic έχει ήδη κάποια παραδείγματα με τον 877

----------


## billtech

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

----------


## briko

αν δεις το κυκλωμα που σου δινει η microe εχει και μπαταρια !

δες και το σχεδιο

και που θα το βρητε
http://www.futurlec.com/ICSFPhilips.shtml
http://www.futurlec.com/Mini_PCF8583.shtml

----------


## billtech

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

program led
main:
  PORTC = 0                
  TRISC = 0                 

  while TRUE
    PORTC = not PORTC       
    Delay_ms(1000)         
  wend
end.

----------


## DT200

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

το RTC θα το συνδέσω αύριο και θα τα πούμε με πράξεις 
και όχι στην θεωρία  :Wink: .

----------


## billtech

αυτος ειναι ο φακελος.θα κοιταξω μπας και παιζει κανενα λαθος στο κυκλωμα.
το εβαλα στον PI16LF877A.

----------


## DT200

> γεια σου,
> --και πες μου και για εκει που εβαλα ερωτηματικα γιατι δεν περνει την διευθυνση αφου στο datasheet  του ολοκληρωμενου αυτη λεει ειναι η διευθυνση.
> 
> 
>   Dieuth = %02  <---------???



ποιος αριθμός είναι αυτός ? (%02).
όταν βάζουμε το σύμβολο  %, σημαίνει ότι ο αριθμός που
θα γράψουμε είναι στο δυαδικό, Π.Χ. %11010001.
εσύ έγραψες μόνο δύο αριθμούς και ο ένας είναι το "2" !!!
που δεν υπάρχει στο δυαδικό !!!
τι ήθελες να σου κάνει ?  :W00t: 

η διεύθυνση του RTC είναι 1101000, είναι 7 ψηφία και το 8 είναι το R/W.

----------


## DT200

> αυτος ειναι ο φακελος..



μα δεν ανάρτησες τον φάκελο , αλλά την φωτογραφία του.

κάνε τον φάκελο Zip και ανάρτησε το ξανά.

----------


## billtech

ωχ...ο μακακας...εβαλα λαθος συμβολο.

program I2C_EXAMP
dim Dieuth, DEUT, LEPT, ORA as byte

main:
  I2C_Init(100000)
  TRISB = 0
  TRISC = 255

  Lcd_Config(PORTB, 3, 2, 1, 0, PORTB, 4, 6, 5)
  Lcd_Cmd(LCD_CLEAR)
  Lcd_Cmd(LCD_CURSOR_OFF)


  I2C_Start
  Dieuth = $00
  I2C_Wr(Dieuth)
  DEUT=I2C_Rd(0)

  Dieuth = $01
  I2C_Wr(Dieuth)
  LEPT=I2C_Rd(0)

  Dieuth = $02
  I2C_Wr(Dieuth)
  ORA=I2C_Rd(0)

  I2C_Stop
   END.

γιατι στο δυαδικο?να μην τα περνουμε στο δεκαεξαδικο απο το datasheet?δεν γινετε?

----------


## DT200

> γιατι στο δυαδικο?να μην τα περνουμε στο δεκαεξαδικο απο το datasheet?δεν γινετε?



άσε και κανά κενό βρε παιδάκι μου, μου έβγαλες τα μάτια !  :Tongue: 
δεν έχει σημασία το αριθμητικό σύστημα, απλά το έγραψα στο δυαδικό.
μετατροπές ξέρεις ?
ποιος αριθμός είναι αυτός (1101000) στο δεκαδικό και στο δεκαεξαδικό ?

----------


## billtech

1101000= 104 δεκαδικο, 68 δυαδικο.σ
σωστα?

----------


## DT200

68 στο δεκαεξαδικό εννοείς.

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

θα τα πούμε όλα σιγά σιγά.

----------


## billtech

ναι αυτο εννουσα. δεκαεξαδικο.

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

----------


## billtech

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

----------


## DT200

έκατσα 2 ώρες σήμερα στον πάγκο αλλά 
*δεν* τα κατάφερα να αποκτήσω επικοινωνία. 
δεν ξέρω αν θέλει να έχει και μπαταριά πάνω.

θα το ξανά πιάσω αύριο.

----------


## billtech

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

----------


## savnik

> έκατσα 2 ώρες σήμερα στον πάγκο αλλά 
> *δεν* τα κατάφερα να αποκτήσω επικοινωνία. 
> δεν ξέρω αν θέλει να έχει και μπαταριά πάνω.
> 
> θα το ξανά πιάσω αύριο.



Αν δεν βάλεις μπαταρία τότε γείωσε το πόδι που παίρνει τάση απο την μπαταρία.

----------


## billtech

η lcd μπορει να εμφανισει ΒCD σωστα?γιατι το ds1307 εχει τα δεδομενα σε BCD νομιζω.

----------


## DT200

δύστυχος και για τις επόμενες 3-4 ημέρες μην περιμένεις 
νέα μου , έχω πολύ δουλειά  :Blush: .

τα λέμε...

----------


## billtech

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

----------


## DT200

είμαι έτοιμος !!!!!!!!!!!!!!!!!! :Lol:  :Lol:  :Lol: 
μπορώ να πω ότι δεν ήταν πολύ δύσκολο 
αλλά είχε και αυτό τα μυστικά του...

λίγο θεωρία πρώτα:
το πρωτόκολλο I²C έχει έναν διάδρομο στον οποίο 
μπορούμε να σινδέσουμε πολλές συσκευές και να "μιλάμε"
μαζί τους μόνο με δύο καλώδια.
αφού όμως έχει κοινό διάδρομο για όλους, τότε θα πρέπει 
οι συσκευές να έχουν διευθύνσεις για να τις ξεχωρίζουμε και
να επικοινωνούμε κάθε φορά με την σωστή.   

άρα:

1ον:ο μ/ε στέλνει ένα σήμα εκκίνησης του διαδρόμου 
              για να ενημερώσει τις συσκευές ότι θα επικοινωνήσει με κάποια.

2ον:στέλνει την διεύθυνση τις συσκευής που θέλει (bit 7-1) και με το   
              bit0 ενημερώνει αν θέλει να γράψει (0) ή να διαβάσει (1).

3ον:στέλνει την θέση της μνήμης που θα προσπελάσει (εγγραφή ή ανάγνωση)

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

5ον: εκπέμπει ένα σήμα Stop για να ελευθερώσει τον διάδρομο.

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

    ελπίζω να μην έχω λάθος.

----------


## DT200

> Αν δεν βάλεις μπαταρία τότε γείωσε το πόδι που παίρνει τάση απο την μπαταρία.



σε ευχαριστώ πολύ φίλε savnik για την πληροφορία ! 
έχεις 100% δίκιο !!!

και για το λόγο του αληθές 




> If a backup supply is not required, VBAT must be grounded

----------


## DT200

αυτό που θα πρέπει να ξέρεις είναι ότι 
στην διεύθυνση $0 το bit7 θα πρέπει να το κάνεις 0 διότι δεν τρέχει το RTC.





> Bit 7 of Register 0 is the clock halt (CH) bit. When this bit is set to 1, the
> oscillator is disabled. When cleared to 0, the oscillator is enabled.

----------


## billtech

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

----------


## DT200

έλα που βρίσκεσαι (προγραμματιστικά) ,
ξεκίνα τα πειράματα.

----------


## billtech

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

----------


## billtech

λοιπον φιλε μου...
κοιταξα αυτο που μου ειπες για αυτο που  στέλνει την διεύθυνση τις συσκευής που θέλει (bit 7-1) και με το   bit0 ενημερώνει αν θέλει να γράψει (0) ή να διαβάσει (1).
βρηκα οτι ειναι: 
11010000 για να γραψει
11010001 για να διαβασει

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

----------


## DT200

σωστός ! εγώ για ευκολία το λέω 208 και 209 (δεκαδικό σύστημα) 
μέσα στην MikroBasic έχει τουλάχιστον ένα παράδειγμα για 
επικοινωνία με μία μνήμη 24C04  (I²C) και είναι αυτό



```
program I2c_Simple

main:
  PORTB = 0
  TRISB = 0                 

  I2C_Init(100000)          
  I2C_Start()              
  I2C_Wr($A2)              
  I2C_Wr(2)                
  I2C_Wr($F0)              
  I2C_Stop()              

  Delay_100ms()

  I2C_Start()             
  I2C_Wr($A2)              
  I2C_Wr(2)               
  I2C_Repeated_Start()    
  I2C_Wr($A3)             
  PORTB = I2C_Rd(0)        
  I2C_Stop()              
end.
```


για κάνε μία προσπάθεια και γράψε μου τι κάνει η κάθε εντολή του 
προγράμματος αυτού.

----------


## billtech

program I2c_Simple

main:
  PORTB = 0
  TRISB = 0                 

  I2C_Init(100000)       βαζουμε την συχνοτητα επικοινωνιας   
  I2C_Start()              στελνουμε σημα εναρξης επικοινωνιας
  I2C_Wr($A2)            του λεμε οτι θα γραψει  η θα διαβασει
  I2C_Wr(2)                την θεση μνημης που θα γραψει διαβασει
  I2C_Wr($F0)              τι θα γραψει 
  I2C_Stop()              στελνουμε σημα τερματισμου επικοινωνιας

  Delay_100ms()      καθυστερηση 100ms

  I2C_Start()            στελνουμε σημα εναρξης επικοινωνιας 
  I2C_Wr($A2)           του λεμε οτι θα γραψει  η θα διαβασει   
  I2C_Wr(2)              την θεση μνημης που θα γραψει διαβασει 
  I2C_Repeated_Start()    ?????
  I2C_Wr($A3)             ????
  PORTB = I2C_Rd(0)        διαβαζει και βαζει στη πορτα Β το περιεχομενο
  I2C_Stop()              στελνουμε σημα τερματισμου επικοινωνιας
end.


αυτα....νομιζω τα εκανα χαλια στο τελος...αλλα ΥΓΕΙΑ!!  :Smile:

----------


## DT200

καλό θα είναι να ψάχνεις στο help όταν έχεις απορίες, είναι πολύ
εύκολο .
τα σχόλια σου είναι σωστά.

I2C_Repeated_Start() = Issues repeated START signal = ας πούμε ότι σιγουρεύεται ότι η συσκευή είναι σε εγρήγορση.




> I2C_Wr($A2)            του λεμε οτι θα γραψει  η θα διαβασει



αφού ο αριθμός Α2 είναι ο %1010001*0* τότε θα γράψει.




> I2C_Wr($A3)



 αυτό τώρα ξέρεις τι είναι , σωστά ?




> PORTB = I2C_Rd(*0*)



 αυτό το 0 σημαίνει ότι ο μ/ε δεν 
θα αποστείλει σήμα επιβεβαιώσεις ότι έλαβε το δεδομένα.




> Reads one byte from the slave, and sends _not acknowledge_ signal if  parameter is 0, otherwise it sends _acknowledge_



τώρα όλα αυτά παραμετροποίησε τα και φτιαχτά για το RTC.

----------


## billtech

αν μπορεις πες μου κατι..
απο το RTC περνω BCD σωστα?πως τα ββγαζω στο LCD?οπως ειναι?ισως ειναι χαζη ερωτηση

----------


## briko

Μια ερώτηση για τον δίαυλο i2c 
 Εάν έχουμε περισσότερες συσκευές όπως μια eeprom για αποθήκευση δεδομένων ένα ds1307 η και κάποια αλλά περιφερειακά πως θα γινόταν το κύκλωμα και πως θα γινόταν οι αρχικές εντολές επικοινωνίας

----------


## DT200

εγώ έχω βρει δύο τρόπους αλλά ευτυχώς ο ένας 
είναι με εντολή μέσα από την MB και είναι TEMP = Bcd2Dec(JJ).
το περιεχόμενο το JJ που είναι σε μορφή BCD περνάει στον TEMP
σε μορφή δεκαδικού αριθμού , από εκεί μετά φυσικά WordToStr και στην LCD.

----------


## DT200

> Μια ερώτηση για τον δίαυλο i2c



το κύκλωμα δεν αλλάζει, όλα τα πιν SCL πάνε μαζί στο ίδιο καλώδιο 
και τα πιν SDA ξανά όλα μαζί. 

για να επικοινωνήσεις με ένα από τα δύο θα πρέπει μετά την εντολή 
I2C_Start να στείλεις την διεύθυνση της Π.Χ. EEPROM (Π.Χ. %1011111Χ)
και μετά κάνεις ότι θέλεις μέχρι να στείλεις την εντολή I2C_Stop,
από την στιγμή που θα στείλεις την εντολή I2C_Stop,  ο διάδρομος 
ελευθερώνεται.
και αν θέλεις ξανακάνεις το ίδιο για να "μιλήσεις"
με το RTC αλλά πρέπει φυσικά να στείλεις την διεύθυνση του RTC μετά την 
εντολή I2C_Start.

δεν μπορώ να το πω καλύτερα  :Blush:  sorry.

----------


## billtech

program RTC_roloi

dim text as string[16]
dim DS_adr, DS_MIN as byte

main:
  I2C_Init(100000)
  text = ("ROLOI:")
  Lcd_Config(PORTB,7,6,5,4,PORTB,2,1,3)
  LCD_Cmd(LCD_CLEAR)
  LCD_Cmd(LCD_CURSOR_OFF)
  LCD_Out(1,1, text)
  Delay_ms(1000)

ARXH:
     I2C_START
     I2C_WR(D1)
     DS_adr=$00
     I2C_WR(DS_adr)
     DS_MIN=I2C_Rd(0)
     I2C_STOP
     GOTO START

end.

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

----------


## DT200

> 1ον:ο μ/ε στέλνει ένα σήμα εκκίνησης του διαδρόμου 
>               για να ενημερώσει τις συσκευές ότι θα επικοινωνήσει με κάποια.
> 
> 2ον:*στέλνει την διεύθυνση τις συσκευής που θέλει (bit 7-1) και με το   
>               bit0 ενημερώνει ότι θέλει να γράψει * *(bit0**=0)*.
> 
> 3ον:στέλνει την θέση της μνήμης που θα προσπελάσει (εγγραφή ή ανάγνωση)
> 
> 4ον:αν θέλει εγγραφή αποστέλλει τα δεδομένα και τέλος.
> ...



δεν έχεις ακολουθήσει πιστά τα 5 βήματα.
το_ I2C_WR(D1)_ σημαίνει ότι θα διαβάσεις διότι το bit0 είναι 1 , αλλά
εσύ μετά αποστέλλεις την διεύθυνση και δεν μπορεί να δουλέψει .
ξανά προσπάθησε και αν θέλεις ανάρτησε το σχηματικό που έχεις 
κάνει στο RTC.

----------


## billtech

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

----------


## DT200

όχι , πρέπει να καταλάβεις ότι το RTC εκτελεί εντολές του μ/ε 
και πάντα του λέμε τι να κάνει.

άρα, πρώτα του *γράφεις* τον καταχωρητή που θέλεις να προσπελάσεις 
και μετά του λες ότι θέλεις να τον *διαβάσεις γράφοντας* του την εντολή
 I2C_Repeated_Start
 I2C_Wr(209).




```
  I2C_Start()             
  I2C_Wr($A2) 'εγραφή             
  I2C_Wr(2)   'εγραφή            
  I2C_Repeated_Start()    
  I2C_Wr($A3) 'εγραφή            
  PORTB = I2C_Rd(0)        
  I2C_Stop()
```

----------


## billtech

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

----------


## billtech

δηλαδη αυτο?

ARXH:
     I2C_START
     I2C_WR(D0)
     DS_adr=$00
     I2C_WR(DS_adr)
     I2C_Repeated_Start()
     I2C_WR(D0
     DS_MIN=I2C_Rd(0)
     I2C_STOP
     GOTO START

----------


## DT200

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

ARXH:
     I2C_START
     I2C_WR($D0)
DS_adr=$00 ' Αυτό δεν χρειάζεται 
     I2C_Wr(0)    'Μπορείς να γράφεις κατευθείαν τον αριθμό και σε δεκαδικό.
     I2C_Repeated_Start()
I2C_WR(209)
     DS_MIN=I2C_Rd(0)
     I2C_STOP
     GOTO START  'φυσικά χρειάζεσαι και άλλες εντολές για την LCD.

----------


## billtech

ARXH:
     I2C_START
     I2C_WR(D0)
     DS_adr=$00
     I2C_WR(DS_adr)
     I2C_Repeated_Start()
     I2C_WR(D1)
     DS_MIN=I2C_Rd(0)
     I2C_STOP
     GOTO START

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

----------


## DT200

> τι εννοεις για τις εντολες της LCD?
> εννοεις επειδη ειναι BCD και πρεπει να το μετατρεψω για να το εμφανισω?



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

είσαι πολύ κοντά στον στόχο σου !!!
περιμένω εξελίξεις  :Σκέψη:

----------


## billtech

word2str? γιατι οχι bcd2dec?
εχω κολλησει να βγαλω τα δεδομενα στη οθονη...κατι δεν σκεφτομαι σωστα...

----------


## DT200

ναι, θα κάνεις πρώτα bcd2dec
αλλά μετά word2str

----------


## billtech

program RTC_roloi

dim text as string[16]
dim DS_adr, DS_MIN,min as byte

main:
  I2C_Init(100000)
  text = ("ROLOI:")
  Lcd_Config(PORTB,7,6,5,4,PORTB,2,1,3)
  LCD_Cmd(LCD_CLEAR)
  LCD_Cmd(LCD_CURSOR_OFF)
  LCD_Out(1,1, text)
  Delay_ms(1000)

ARXH:
     I2C_START
     I2C_WR($D0)
     DS_adr=$00
     I2C_WR(DS_adr)
     I2C_Repeated_Start()
     I2C_WR($D1)
     DS_MIN=I2C_Rd(0)
     I2C_STOP

     min=bcd2dec(DS_MIN)
     LCD_chr(2,2, DS_MIN )

     GOTO ARXH

end.

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

----------


## DT200

επίτρεψέ μου κάποιες μικρο αλλαγές.



```
program RTC_roloi

dim text as string[6]
dim TEMP,min as byte

main:
  I2C_Init(100000)
  Lcd_Config(PORTB,7,6,5,4,PORTB,2,1,3)
  LCD_Cmd(LCD_CLEAR)
  LCD_Cmd(LCD_CURSOR_OFF)
  LCD_Out(1,1, "ROLOI:")
  Delay_ms(1000)
  
ARXH:
     I2C_START
     I2C_WR($D0)
     I2C_WR(00)
     I2C_Repeated_Start()
     I2C_WR($D1)
     TEMP=I2C_Rd(0)
     I2C_STOP
     
     min=bcd2dec(TEMP)
WordToStr(MIN,TEXT)
     LCD_chr(2,2, TEXT)
     GOTO ARXH
```






> min=bcd2dec(DS_MIN)
>      LCD_chr(2,2, DS_MIN )



εδώ έχεις δύο λάθει, 
1ον στέλνεις στην οθόνη κάτι που δεν 
είναι σε format string και 2ον αυτός που σε ενδιαφέρει 
είναι ο min που έχει το αποτέλεσμα του DS_MIN σε δεκαδικό.

αυτό το πρόγραμμα δεν πρέπει να παρήγαγε .hex διότι έχει την 
εντολή LCD_chr(2,2, DS_MIN ) λάθος.

επίσης είχα πει 




> αυτό που θα πρέπει να ξέρεις είναι ότι 
> στην διεύθυνση $0 το bit7 θα πρέπει να το κάνεις 0 διότι δεν τρέχει το RTC.



άρα γράψε στην θέση $0 τον αριθμό 0.

----------


## billtech

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

----------


## billtech

LCD_chr(2,1, TEXT[1]) 
ετσι μου δουλεψε..αλλα δεν μου βγαζει τα δευτερα...μονο τη λεξη στη πρωτη γραμμη...λες να μην κανει καλη επηκοινωνια με το ds1307?

----------


## DT200

LCD_chr(2,1, TEXT[1])
με αυτήν την εντολή θα πάρεις 
μονό ένα ψηφίο , δηλαδή 0-9 και ποτέ διψήφιο Π.Χ.10.

το λάθος που βλέπω είναι ότι δεν έχεις βάλει τις 
δύο αντιστάσεις Pull up 10Κ στον διάδρομο.

έγραψες στην θέση 0 τον αριθμό 0 ?

----------


## billtech

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

ARXH:
     I2C_START
     I2C_WR($D0)
     DS_adr=00
     I2C_WR(DS_adr)
     I2C_Repeated_Start()
     I2C_WR($D1)
     DS_MIN=I2C_Rd(0)
     I2C_STOP

     MIN=bcd2dec(DS_MIN)
     WordToStr(MIN,TEXT)
     LCD_chr(2,1, TEXT[1])
     GOTO ARXH

----------


## DT200

> ε τοτε πως να παρω διψηφιο?με μπερδεψες τωρα...αφου αμα βαλω μονο του το TEXT δεν τρεχει να βγαλει .hex



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

η εντολή LCD_chr εφαρμόζετε όταν θέλεις να πάρεις 
μόνο ένα χαρακτήρα από ένα string και αν θέλεις και
δεύτερο την ξανά χρησιμοποιής.

για να πάρεις όλο το string γράφεις Π.Χ. LCD_OUT(1,1,TEXT).
προσοχή το TEXT θα πρέπει να είναι δηλωμένο σαν string.





> ποια θέση να γράψω το 0?



αν εννοείς σε πιο καταχωρητή του RTC , είναι ο $00





> ARXH:
>      I2C_START
>      I2C_WR($D0)
> DS_adr=00 'γιατί δεν ξεφορτώνεσαι αυτήν την εντολή ???
>      I2C_WR(DS_adr)
>      I2C_Repeated_Start()
>      I2C_WR($D1)
>      DS_MIN=I2C_Rd(0)
>      I2C_STOP
> ...

----------


## billtech

program RTC_roloi

dim TEXT as string[6]
dim DS_MIN,MIN as byte

main:
  I2C_Init(100000)
  text = ("ROLOI:")
  Lcd_Config(PORTB,7,6,5,4,PORTB,2,1,3)
  LCD_Cmd(LCD_CLEAR)
  LCD_Cmd(LCD_CURSOR_OFF)
  LCD_Out(1,1, "Watch:")
  Delay_ms(1000)

ARXH:
     I2C_START
     I2C_WR($D0)
     I2C_WR(00)
     I2C_Repeated_Start()
     I2C_WR($D1)
     DS_MIN=I2C_Rd(0)
     I2C_STOP

     MIN=BCD2DEC(DS_MIN)
     WordToStr(MIN,TEXT)
     LCD_OUT(2,1, TEXT)
     GOTO ARXH
    end.

Ωχ...αρχισαμε τα ιδια παλι...παιρνω στη οθονη με το παραπανω προγραμμα σταθερα μια τιμη...80 μου βγαζει...και δεν αυξανει...
μου βγαζει δηλαδη:
Watch:
      80

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

----------


## DT200

δεν έχεις βάλει την τιμή 0 στον καταχωρητή 0
ώστε να ξεκινήσει το RTC.




> Bit 7 of Register 0 is the clock halt (CH) bit. When this bit is set to 1, the
> oscillator is disabled. When cleared to 0, the oscillator is enabled.



σου αναρτώ το .hex από το δικό μου 
πρόγραμμα @4MHz για να δεις αν όλα πάνε καλά.

Υ.Γ. κρύσταλλο έχεις βάλει στο RTC ?

----------


## billtech

ναι...αυτο δουλεψε...
συνεχιζω να μην καταλαβαινω αυτο με το 0 που λες...που δεν το εβαλα?

----------


## DT200

στο RTC, έχεις το δικαίωμα να γράψεις στους καταχωρητές του ,
Π.Χ. να φτιάξεις την ώρα .
οι καταχωρητές στο RTC, έχουν συγκεκριμένες θέσεις 
που μας βοηθάνε να τους προσπελάσουμε (εγράφη ή ανάγνωση),
αυτές οι θέσεις έχουν ονόματα και είναι αριθμοί.
ο πρώτος καταχωρητής είναι στην θέση $00
ο δεύτερος $01 και πάει λέγοντας ...

ο κατασκευαστής του RTC, έχει προβλέψει το RTC να έχει 
την επιλογή pause και αυτή η επιλογή είναι στο bit7 του καταχωρητή $00.

η επιλογή pause είναι ενεργή (bit7=1) όταν το RTC πάρει ρεύμα.

για να ξεκινήσει το RTC θα πρέπει να πας και να κάνεις το 
bit7 του καταχωρητή $00 μηδέν (0).

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

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

----------


## billtech

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

I2C_START
     I2C_WR($D0) 
     I2C_WR(0) 
     I2C_Repeated_Start()
     I2C_WR($D1)
     DS_MIN=I2C_Rd(0)
     I2C_STOP

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

----------


## DT200

διότι χρησιμοποιής την εντολή wordtostr και το μέγεθος 
ενός αριθμού word είναι 65.535 , και αυτά είναι 5 ψηφία.
άρα ο μ/ε στέλνει 5 ψηφία εκ των οποίων όσα είναι μπροστά , μπροστά 
και η αξία τους είναι 0 τότε δεν τα εμφανίζει άλλα πιάνουν θέσεις στην LCD.

για να λύσεις αυτό το πρόβλημα θα πρέπει να χρησιμοποιήσεις την
εντολή που σου επιτρέπει να "τσιμπήσεις" γράμματα μέσα από το string.

----------


## DT200

> I2C_START
>      I2C_WR($D0) 
>      I2C_WR(0) 
>      I2C_Repeated_Start()
>      I2C_WR($D1)
>      DS_MIN=I2C_Rd(0)
>      I2C_STOP
> 
> δεν καταλαβαινω κατι.που του λεμε οτι θα διαβασει δευτερα?και που του λεμε ξεκινα μετρα?



ακόμα λάθος το έχεις , το RTC τρέχει διότι του το "είπα"
εγώ από το δικό μου .hex που σου έστειλα.
αν κλείσεις το ρεύμα και το ξανά βάλεις, θα δεις ότι δεν δουλεύει.

κάνεις προγραμματισμό πάνω στο κύκλωμα 
χωρείς να αφαιρέσεις τον μ/ε , σωστά ?

----------


## DT200

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



του το λέμε όταν ζητάμε από το RTC να μας δώσει το 
περιεχόμενο του καταχωρητή $0.

θα το καταλάβεις καλύτερα στην σελίδα του τεχνικού φυλλαδίου 8

----------


## billtech

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

----------


## DT200

θα πήρε φόρα  :Biggrin: 

Υ.Γ. για βάλε και αυτό .hex ...θα το σταματήσει τώρα

----------


## billtech

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

----------


## DT200

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

δεν το λέω μόνο για το τελευταίο ποστ, αλλά είναι γενικό το θέμα.

τι να απαντήσω στο τελευταίο ποστ ? δεν καταλαβαίνω τι έκανες.

----------


## billtech

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

----------


## billtech

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



```
     I2C_START    ξεκινα την επικοινωνια
     I2C_WR($D0)  πες του οτι θα γραψει
     DS_ADR=0  στη θεση μνημης 0
     I2C_WR(DS_ADR)  
     DS_DATA=%00000000   κανε ολα τα bit 0 και του πρωτου που ειναι για μετρημα
     I2C_WR(DS_DATA)
     I2C_Repeated_Start() επανελαβε την εκκινηση επικοινωνιας
     I2C_WR($D1) πες του οτι θα διαβασω
     DS_MIN=I2C_Rd(0) διαβασε και βαλε τα στο DS_MIN
     I2C_STOP σταματα την επικοινωνια
```

----------


## DT200

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

αν το αφήσεις να λειτουργήσει 1 λεπτό, μάλλον θα σου γράψει τα λεπτά.
δεν ξέρω τι κάνεις με το υπόλοιπο πρόγραμμα για να σου πω με σιγουριά.

----------


## billtech

```
program RTC_roloi
'dilosi kataxoriton
dim TEXT as string[6]
dim DS_MIN,MIN, DS_ADR, DS_DATA as byte
'edo kano tis arxikopoiiseis
main:
  I2C_Init(100000)
  Lcd_Config(PORTB,7,6,5,4,PORTB,2,1,3)
  LCD_Cmd(LCD_CLEAR)
  LCD_Cmd(LCD_CURSOR_OFF)
  LCD_Out(1,1, "Watch:")
  Delay_ms(1000)
  'rithmisi toy ds1307 gia na metraei
  I2C_START
  I2C_WR($D0)
  DS_ADR=$0
  I2C_WR(DS_ADR)
  DS_DATA=%00000000
  I2C_WR(DS_DATA)
  I2C_STOP
'edo diavazo ta deyterolepta..
ARXH:
     I2C_START
     I2C_WR($D1)
     DS_ADR=$00
     I2C_WR(DS_ADR)
     DS_MIN=I2C_Rd(0)
     I2C_STOP
     'emfanisi sti othoni
     MIN=BCD2DEC(DS_MIN)
     WordToStr(MIN,TEXT)
     LCD_OUT(2,1, TEXT)
     
     GOTO ARXH
    end.
```


τωρα μπηκα να ανεβασω αυτο το ποστ και ειδα οτι ειχες κανει εσυ ποστ...
λοιπον...ακου αναλυτικα... :Smile: 
στη αρχη εχω βαλει τους καταχωρητες.
στο main εχω κανει τις αρχικοποιησεις.και εκει μεσα εχω κανει και την αρχικοποιηση για να ξεκινησει το sd1307 να μετραει.
μεσα στο ARXH τωρα απλα παω και διαβαζω τα δευτερολεπτα..
πες μου που ειναι το λαθος και μου βγαζει συνεχεια 0.
νομιζω κανω ολα τα βηματα.και τα εκανα με αυτο το τροπο ωστε να φαινονται και να τα καταλαβω και καλυτερα.

----------


## DT200

με αυτό το πρόγραμμα θα πρέπει να δουλέψει σωστά.

----------


## billtech

ναι...αυτο δουλευει!!κανονικα.
το δικο μου γιατι δεν δουλευει?αυτο που εκανα ποστ πριν?

----------


## DT200

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



(αν θέλεις μπορείς να γράψεις και ποιο απλά, κοίτα ένα παράδειγμα.)

το λάθος σου είναι το κλασικό, δεν έχεις αντιληφθεί
καλά την λογική το I²C.
στην κόκκινη εντολή του λες ότι στην επόμενη κίνηση απόστειλε μου 
τα δεδομένα διότι θέλω να κάνω ανάγνωση , αλλά εσύ στην επόμενη 
κίνηση αποστέλλεις πάλι δεδομένα (πράσινη εντολή) και γίνετε κομφούζιο  :W00t: 
αν θέλεις γράψε μου με λόγια τα βήματα που 
κάνουμε για την ανάγνωση της θέσεις $01, με αυτόν τον
τρόπο θα δω που έχεις μπερδευτεί.

program RTC_roloi
'dilosi kataxoriton
dim TEXT as string[6]
dim TEMP,MIN as byte
'edo kano tis arxikopoiiseis
main:
  I2C_Init(100000)
  Lcd_Config(PORTB,7,6,5,4,PORTB,2,1,3)
  LCD_Cmd(LCD_CLEAR)
  LCD_Cmd(LCD_CURSOR_OFF)
  LCD_Out(1,1, "Watch:")
  'rithmisi toy ds1307 gia na metraei
  I2C_START
  I2C_WR($D0)
  I2C_WR(0)
  I2C_WR(0)
  I2C_STOP
'edo diavazo ta deyterolepta..
ARXH:
     I2C_START
I2C_WR($D1)
I2C_WR(0)
     TEMP=I2C_Rd(0)
     I2C_STOP
     'emfanisi sti othoni
     MIN=BCD2DEC(TEMP)
     WordToStr(MIN,TEXT)
     LCD_OUT(2,1, TEXT)

     GOTO ARXH
    end.
σου αναρτώ του το .hex από το δικό σου 
πρόγραμμα έτσι για να το δεις να δουλεύει. :Smile:

----------


## billtech

```
program RTC_roloi
'dilosi kataxoriton
dim TEXT as string[6]
dim DS_MIN,MIN as byte
'edo kano tis arxikopoiiseis
main:
  I2C_Init(100000)
  Lcd_Config(PORTB,7,6,5,4,PORTB,2,1,3)
  LCD_Cmd(LCD_CLEAR)
  LCD_Cmd(LCD_CURSOR_OFF)
  LCD_Out(1,1, "Watch:")
  Delay_ms(1000)
  'rithmisi toy ds1307 gia na metraei
  I2C_START
  I2C_WR($D0)
  I2C_WR($00)
  I2C_WR(%00000000)
  I2C_STOP
'edo diavazo ta deyterolepta..
ARXH:
     I2C_START
     I2C_WR($D0)
     I2C_WR($00)
     I2C_Repeated_Start
     I2C_WR($D1)
     DS_MIN=I2C_Rd(0)
     I2C_STOP

     'emfanisi sti othoni
     MIN=BCD2DEC(DS_MIN)
     WordToStr(MIN,TEXT)
     LCD_OUT(2,1, TEXT)
     
     GOTO ARXH
end.
```


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

----------


## DT200

μπράβο ρε μάγκα τα κατάφερες  :Thumbup:   :Applause:   :Ψώνιο: 
η εντολή που τσιμπάς χαρακτήρες μέσα από ένα string 
είναι:  Π.Χ. Lcd_Chr(1, 7, TEXT[1])
το 1 είναι η θέση του χαρακτήρας που θέλεις μέσα από το string.
αυτή η εντολή εκτελείτε αφού έχεις κάνει WordToStr.

περιμένω την ανανεωμένη έκδοση ...

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

----------


## billtech

program RTC_roloi
'dilosi kataxoriton
dim TEXT as string[6]
dim DS_sec,sec,DS_min,min,DS_ores,ores as byte
'edo kano tis arxikopoiiseis
main:
  I2C_Init(100000)
  Lcd_Config(PORTB,7,6,5,4,PORTB,2,1,3)
  LCD_Cmd(LCD_CLEAR)
  LCD_Cmd(LCD_CURSOR_OFF)
  LCD_Out(1,1, "Watch:")
  Delay_ms(500)
  LCD_Out(1,8, "00:00:00")
  Delay_ms(1000)
  'rithmisi toy ds1307 gia na metraei
  I2C_START
  I2C_WR($D0)
  I2C_WR($00)
  I2C_WR(%00000000)
  I2C_Repeated_Start
  I2C_WR($D0)
  I2C_WR($01)
  I2C_WR(%00000000)
  I2C_Repeated_Start
  I2C_WR($D0)
  I2C_WR($02)
  I2C_WR(%00000000)
  I2C_STOP
'edo diavazo ta deyterolepta..
ARXH:
     I2C_START
     I2C_WR($D0)
     I2C_WR($00)
     I2C_Repeated_Start
     I2C_WR($D1)
     DS_sec=I2C_Rd(0)
     I2C_STOP

     I2C_START
     I2C_WR($D0)
     I2C_WR($01)
     I2C_Repeated_Start
     I2C_WR($D1)
     DS_min=I2C_Rd(0)
     I2C_STOP

     I2C_START
     I2C_WR($D0)
     I2C_WR($02)
     I2C_Repeated_Start
     I2C_WR($D1)
     DS_ores=I2C_Rd(0)
     I2C_STOP



     'emfanisi sti othoni (deyterolepta)
     sec=BCD2DEC(DS_sec)
     WordToStr(sec,TEXT)
     LCD_OUT(2,1, TEXT)

     'emfanisi sti othoni  (lepta)
     min=BCD2DEC(DS_min)
     WordToStr(min,TEXT)
     LCD_OUT(2,4, TEXT)

      'emfanisi sti othoni  (ores)
     ores=BCD2DEC(DS_ores)
     WordToStr(ores,TEXT)
     LCD_OUT(2,6, TEXT)

     GOTO ARXH
end.

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

----------


## DT200

το πρόγραμμα τρέχει σωστά αλλά, 
δεν έχεις επιλέξει σωστά τις θέσεις των αριθμών, 
με αποτέλεσμα να έχεις επικαλύψει και να μην
φαίνεται τίποτα.
οι σωστές θέσεις είναι 
LCD_OUT(2, 1, TEXT)
LCD_OUT(2, 6, TEXT)
LCD_OUT(2,11, TEXT)

αν θέλεις βάλε και ένα delay_ms(500) για να 
μην τρέχει τσάμπα το πρόγραμμα.

----------


## billtech

δεν καταλαβα....η μαλλον δεν καταλαβες τι ηθελα να πω..
μου εμφανιζει την ωρα και τα λεπτα και τα δευτερα οπως τα εχω...
δηλαδη:
τα δευτερα βγαινουν στις θεσεις 4-5
τα λεπτα στις 7-8
και οι ωρες στα 9-10
εγω θελω να το κανω οπως ειναι το δικο σου που ειχες κανει και τα εβγαζε ας πουμε απο την 1,1 μεχρι την 1,8.
να μην εχει το string εκεινα τα κενα μπροστα καταλαβες?χτες μου ειπες να τσιμπω απο το string τους χαρακτηρες που θελω.αλλα πως?αυτο δεν καταλαβα.

που να βαλω το delay_ms(500)?και γιατι αυτο?

----------


## DT200

> μου εμφανιζει την ωρα και τα λεπτα και τα δευτερα οπως τα εχω...
> δηλαδη:
> τα δευτερα βγαινουν στις θεσεις 4-5
> τα λεπτα στις 7-8
> και οι ωρες στα 9-10



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


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




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



σου είπα τι πρέπει να κάνεις , χρησιμοποίησε την εντολή 
Lcd_Chr(1, 7, TEXT[1]) , Lcd_Chr(1, 7, TEXT[2]), ...

----------


## billtech

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

----------


## DT200

για δείξε μου τον κώδικα σου.

----------


## billtech

program RTC_roloi
'dilosi kataxoriton
dim TEXT as string[6]
dim DS_sec,sec,DS_min,min,DS_ores,ores as byte
'edo kano tis arxikopoiiseis
main:
  I2C_Init(100000)
  Lcd_Config(PORTB,7,6,5,4,PORTB,2,1,3)
  LCD_Cmd(LCD_CLEAR)
  LCD_Cmd(LCD_CURSOR_OFF)
  LCD_Out(1,1, "Watch:")
  Delay_ms(500)
  LCD_Out(1,8, "00:00:00")
  Delay_ms(1000)
  'rithmisi toy ds1307 gia na metraei
  I2C_START
  I2C_WR($D0)
  I2C_WR($00)
  I2C_WR(%00000000)
  I2C_Repeated_Start
  I2C_WR($D0)
  I2C_WR($01)
  I2C_WR(%00000000) 'midenizo ta lepta
  I2C_Repeated_Start
  I2C_WR($D0)
  I2C_WR($02)
  I2C_WR(%00000000) 'midenizo tis ores
  I2C_STOP


ARXH:
     'edo diavazo ta deyterolepta..
     I2C_START
     I2C_WR($D0)   'toy dixno tin thesi mnimis
     I2C_WR($00)   'pou thelo
     I2C_Repeated_Start
     I2C_WR($D1)  'tou leo diavase...tin thesi poy sou ipa pano.
     DS_sec=I2C_Rd(0)
     I2C_STOP

     'edo diavazo ta lepta..
     I2C_START
     I2C_WR($D0)
     I2C_WR($01)
     I2C_Repeated_Start
     I2C_WR($D1)
     DS_min=I2C_Rd(0)
     I2C_STOP

     'edo diavazo tis ores..
     I2C_START
     I2C_WR($D0)
     I2C_WR($02)
     I2C_Repeated_Start
     I2C_WR($D1)
     DS_ores=I2C_Rd(0)
     I2C_STOP

     'emfanisi sti othoni (deyterolepta)
     sec=BCD2DEC(DS_sec)
     WordToStr(sec,TEXT)
     LCD_chr(2,2, TEXT[1])
     LCD_chr(2,2, TEXT[2])

         'emfanisi sti othoni  (lepta)
     min=BCD2DEC(DS_min)
     WordToStr(min,TEXT)
     LCD_OUT(2,4, TEXT)

        'emfanisi sti othoni  (ores)
    ores=BCD2DEC(DS_ores)
     WordToStr(ores,TEXT)
     LCD_OUT(2,6, TEXT)

     GOTO ARXH
end.

----------


## DT200

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




> LCD_chr(2,2, TEXT[1])
>      LCD_chr(2,2, TEXT[2])



εμφανίζεις και τους δύο χαρακτήρες στην ίδια θέση. 

αλλά και οι πράσινοι αριθμοί δεν είναι σωστοί , αλλά αυτό δεν το ήξερες .
αν ο αριθμός στο string ήταν 54321 τότε το 5 θα ήταν TEXT[0]
και το 1 θα ήταν TEXT[4].
μέσα στο πρόγραμμα έχω βάλει ένα παράδειγμα για να το 
καταλάβεις καλύτερα.


program RTC_roloi
'dilosi kataxoriton
dim TEXT as string[6]
dim DS_sec,sec,DS_min,min,DS_ores,ores as byte
dim TEMP AS WORD
'edo kano tis arxikopoiiseis
main:
    I2C_Init(100000)
    Lcd_Config(PORTB,7,6,5,4,PORTB,2,1,3)
    LCD_Cmd(LCD_CLEAR)
    LCD_Cmd(LCD_CURSOR_OFF)
    LCD_Out(1,1, "Watch:")
    Delay_ms(500)
    'LCD_Out(1,8, "00:00:00")
    Delay_ms(1000)
    'rithmisi toy ds1307 gia na metraei
    I2C_START
    I2C_WR($D0)
    I2C_WR($00)
    I2C_WR(0)
    I2C_Repeated_Start
    I2C_WR($D0)
    I2C_WR($01)
    I2C_WR(0) 'midenizo ta lepta
    I2C_Repeated_Start
    I2C_WR($D0)
    I2C_WR($02)
    I2C_WR(0) 'midenizo tis ores
    I2C_STOP
    TEMP=54321

ARXH:
    'edo diavazo ta deyterolepta..
    I2C_START
    I2C_WR($D0) 'toy dixno tin thesi mnimis
    I2C_WR($00) 'pou thelo
    I2C_Repeated_Start
    I2C_WR($D1) 'tou leo diavase...tin thesi poy sou ipa pano.
    DS_sec=I2C_Rd(0)
    I2C_STOP

    'edo diavazo ta lepta..
    I2C_START
    I2C_WR($D0)
    I2C_WR($01)
    I2C_Repeated_Start
    I2C_WR($D1)
    DS_min=I2C_Rd(0)
    I2C_STOP

    'edo diavazo tis ores..
    I2C_START
    I2C_WR($D0)
    I2C_WR($02)
    I2C_Repeated_Start
    I2C_WR($D1)
    DS_ores=I2C_Rd(0)
    I2C_STOP

    'emfanisi sti othoni (deyterolepta)
    sec=BCD2DEC(DS_sec)
    WordToStr(sec,TEXT)
    LCD_chr(2,2, TEXT[3])
    LCD_chr(2,3, TEXT[4])




   ' 'emfanisi sti othoni (lepta)
    min=BCD2DEC(DS_min)
    WordToStr(min,TEXT)
    LCD_OUT(2,5, TEXT)

    'emfanisi sti othoni (ores)
    ores=BCD2DEC(DS_ores)
    WordToStr(ores,TEXT)
    LCD_OUT(2,7, TEXT)

    WordToStr(TEMP,TEXT)
    LCD_chr(1,12, TEXT[0])
    LCD_chr(1,13, TEXT[1])
    LCD_chr(1,14, TEXT[2])
    LCD_chr(1,15, TEXT[3])
    LCD_chr(1,16, TEXT[4])

    Delay_ms(500)
    GOTO ARXH
end.

----------


## billtech

κατι τελευταιο.σε ευχαριστω για αυτο..δεν το ηξερα..οπως και τα αλλα που εμαθα...
τα εμαθα ομως...
απλα το προβλημα μου τωρα ειναι οταν εμφανιστει η ωρα με τη παρακατω μορφη:
00:00:00 τοτε  μολις ξεκινησει να μετραει γινεται αυτο --> 0: 0: 1 δηλαδη μου αφαιρει το πρωτο και μετα οταν πρεπει να εμφανιστει εμφανιζεται κανονικα..απλα εγω το θελω να ειναι εκει το μηδενικο και να το σβηνει μετα που θα γραψει πανω του.ισως να ειναι απλο αλλα να μην το σκεφτομαι..

----------


## DT200

η λύση στο πρόβλημα σου είναι εύκολη διότι,
η ΜΒ έχει πολλά "εργαλεία"  :Biggrin: 

η εντολή είναι, WordToStrWithZeros(TEMP,TEXT)

----------


## billtech

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

----------


## billtech

το εκανα φιλεμου...τωρα πηγα λιγο παρακατω...

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




```
program RTC_roloi
'dilosi kataxoriton
dim TEXT as string[6]
dim DS_sec,sec,DS_min,min,DS_ores,ores,BUT_D as byte
   'edo kano tis arxikopoiiseis
main:
  TRISD=255
  PORTD=255
  
  I2C_Init(100000)
  Lcd_Config(PORTB,7,6,5,4,PORTB,2,1,3)
  LCD_Cmd(LCD_CLEAR)
  LCD_Cmd(LCD_CURSOR_OFF)
  LCD_Out(1,1, "Watch:")
  Delay_ms(500)
  LCD_Out(1,8, "00:00:00")
  Delay_ms(1000)
   'rithmisi toy ds1307 gia na metraei
  I2C_START
  I2C_WR($D0)
  I2C_WR($00)
  I2C_WR(%00000000)
  I2C_STOP


ARXH:
   'elegxo an patithike to koumpi kai etsi pao kai katharizo tin ora kai ta lepta kai ta stelno sto 0
     BUT_D=PORTD
     DELAY_MS(50)
     IF BUT_D.7=0 THEN GOTO SET1 END IF
   
   
   'edo diavazo ta deyterolepta..
     I2C_START
     I2C_WR($D0)   'toy dixno tin thesi mnimis
     I2C_WR($00)   'pou thelo
     I2C_Repeated_Start
     I2C_WR($D1)  'tou leo diavase...tin thesi poy sou ipa pano.
     DS_sec=I2C_Rd(0)
     I2C_STOP

    'edo diavazo ta lepta..
     I2C_START
     I2C_WR($D0)
     I2C_WR($01)
     I2C_Repeated_Start
     I2C_WR($D1)
     DS_min=I2C_Rd(0)
     I2C_STOP

    'edo diavazo tis ores..
     I2C_START
     I2C_WR($D0)
     I2C_WR($02)
     I2C_Repeated_Start
     I2C_WR($D1)
     DS_ores=I2C_Rd(0)
     I2C_STOP

    'emfanisi sti othoni (deyterolepta)
     sec=BCD2DEC(DS_sec)
     WordToStrWithZeros(sec,TEXT)
     LCD_chr(1,14, TEXT[3])
     LCD_chr(1,15, TEXT[4])

    'emfanisi sti othoni  (lepta)
     min=BCD2DEC(DS_min)
     WordToStrWithZeros(min,TEXT)
     LCD_chr(1,11, TEXT[3])
     LCD_chr(1,12, TEXT[4])

    'emfanisi sti othoni  (ores)
     ores=BCD2DEC(DS_ores)
     WordToStrWithZeros(ores,TEXT)
     LCD_chr(1,8, TEXT[3])
     LCD_chr(1,9, TEXT[4])

     GOTO ARXH

SET1:
  I2C_START
  I2C_WR($D0)
  I2C_WR($01)
  I2C_WR(%00000000) 'midenizo ta lepta
  I2C_Repeated_Start
  I2C_WR($D0)
  I2C_WR($02)
  I2C_WR(%00000000) 'midenizo tis ores
  I2C_STOP

  GOTO ARXH
     
end.
```


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

----------


## DT200

το πρόγραμμα είναι εντάξει ...
αλλά δεν έχεις βάλει pull up αντίσταση στο RD7  :Tongue2:

----------


## billtech

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

----------


## billtech

μολις εκανα ενα πειραματακι.εβαλα μια λεξη μεσα στο set1 να την εμφανιζει στο lcd αφου πατηθει το κουμπι...και μολις το εβαζα την εμφανιζε...με συνεπεια να σκεφτω να μετρησω το ποδαρακι(30) του επεξεργαστη και να δω οτι ειναι συνεζεια 0.αρα το προγραμμα δεν παει ποτε στο σημειο που διαβαζει τα δευτερολεπτα.

----------


## DT200

αν διαγράψεις την εντολή 
IF BUT_D.7=0 THEN GOTO SET1 END IF
δουλεύει σωστά ?
αν ναι τότε θέλει pull up, δηλαδή για να ήμαστε σίγουροι τι λέμε, 
το ένα άκρο στο RD7 και το άλλο άκρο στο +5V  και 
φυσικά ο διακόπτης να κάνει pull down.

προσοχή το RD7 είναι το δέκατο πιν από κάτω και δεξιά ! (κάτω από το GND)

----------


## billtech

το εκανα φιλε μου...και παλι παει στο 0.αμα το ποδαρακι ειναι το αερα τι δυναμικο εχει?5 η 0? γιατι οταν το κανω ολο αυτο και δεν δουλευει και τοτε βγαλο το καλωδιο που παει στη αντισταση και το διακοπτη και το βαλω στα 5βολτ αμεσως μου βγαζει το χρονο που εχει εκεινη τη στιγμη το ds1307. η μονη δηλαδη περιπτωση που δεν βλεπει 0 ο επεξεργαστης ειναι οταν το καρφωσω στα 5 βολτ.η αντισταση μου ειναι 10Κ

----------


## DT200

θα το πω τρίτη φορά μέσα σε 10 λεπτά.

με τον τρόπο που έχεις συντάξει το IF , ο μ/ε θέλει να 
βλέπει 5V στο pin RD7 για να τρέχει το πρόγραμμα και 
να βλέπεις την ώρα.
τα 5V στο pin RD7 θα πρέπει να δοθούν μέσω μίας αντίστασης Π.Χ. 10ΚΩ.

η εντολή IF θα εκτελεστεί όταν το pin RD7 γειωθεί μέσω του 
διακόπτη .

ο διακόπτης έχει δύο άκρα το ένα άκρο βάλτο στο pin RD7 και το 
άλλο στην γη.

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

δείξε μου το σχηματικό σου.

----------


## billtech

δεν εχω κανει λαθος συνδεσμολογια...
εχω μια αντισταση 10Κ που το ενα της ποδι παει στα 5βολτ και το αλλο παει στο ποδαρακι 30.εχω και ενα διακοπτη που παει το ενα του ποδι στη γη και το αλλο στο ποδαρακι 30.
αρα εχω 3 ποδια μαζι...το 30, το ενα του διακοπτη, και το ενα της αντιστασης...και για να ειμαι σιγουρος μετρησα και την ταση.
οταν εχω ενωμενα τα ποδαρακια της αντιστασης με το διακοπτη χωρις το 30 τοτε εχω στα ακρα της αντιστασης 5βολτ...(ταση -αντισταση,διακοπτης-γη)

οταν ενωσω και τα 3 ποδια μαζι τοτε πεφτει κατευθειαν στο 0 η ταση στα ακρα της αντιστασης.(ταση-αντισταση,30,διακοπτης-γη).

δεν εχω λαθος συνδεσμολογια...κατι αλλο ειναι..

----------


## DT200

έτσι όπως τα λες φαίνεται να έχεις δίκιο !  :Blushing: 
σου στέλνω το δικό μου .hex να κάνεις μία δοκιμή.

----------


## billtech

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

----------


## DT200

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

αυτό που σου στέλνω τώρα θέλει 0 για να εκτελέσει την εντολή.

----------


## billtech

οχι φιλε μου διστυχως και παλι τιποτα...
μολις ομως παω το ποδαρακι 30 στα 5βολτ δουλευει.
οταν εχω στον αερα η στη αντισταση με το διακοπτη το 30...δηλαδη σε 2 πριπτωσεις μου δειχνει 0 βολτ στο ποδαρακι 30.κατι παιζει πιστευω με την αρχικοποιηση της πορτας D.
αλλα δεν ξερω τι.εχω δει οτι η πορτα D ειναι ST/TTL και εμεις αν καταλαβα καλα και λογω αγγλικων θελουμε ST. αν παιζει σε TTL τοτε εκει ειναι.ισως να θελει μεσω Software να αλλαξουμε αυτη τη κατασταση.

----------


## billtech

TRISD=%11111111
PORTD=255

να σε ρωτησω και κατι αλλο?με αυτες τις 2 εντολες δεν του λεω οτι θελω την πορτα D σαν εισοδο και του λεω μετα να την κανει high?
γιατι αμα τον βαλω στο κυκλωμα χωρις να ενωσω κατι πανω στο ποδαρακι 30 τοτε μου δειχει ταση 0βολτ.δεν επρεπε να δειχνει 5βολτ?

----------


## savnik

> TRISD=%11111111
> PORTD=255
> 
> να σε ρωτησω και κατι αλλο?με αυτες τις 2 εντολες δεν του λεω οτι θελω την πορτα D σαν εισοδο και του λεω μετα να την κανει high?
> γιατι αμα τον βαλω στο κυκλωμα χωρις να ενωσω κατι πανω στο ποδαρακι 30 τοτε μου δειχει ταση 0βολτ.δεν επρεπε να δειχνει 5βολτ?



Διαβασε και κανενα datasheet , θα σε βοηθήσουν αρκετά :Wink:

----------


## billtech

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

----------


## savnik

> εχω δει οτι η πορτα D ειναι ST/TTL και εμεις αν καταλαβα καλα και λογω αγγλικων θελουμε ST. αν παιζει σε TTL τοτε εκει ειναι.ισως να θελει μεσω Software να αλλαξουμε αυτη τη κατασταση.



TRISE.4=0 για ST

----------


## billtech

αυτο φιλε μου το δοκιμασα και εγω...
οχι ετσι ακριβως αλλα το δοκιμασα...
εγω ειχα κανει TRISE=%00000000 για σιγουρια αλλα δεν μου επαιζε. και νομιζα οτι ειχα κανει λαθος...αλλα και τωρα που το δοκιμασα οπως μου ειπες εσυ παλι τα ιδια..καμια διαφορα.

----------


## DT200

το πρόβλημα σου δεν νομίζω ότι είναι προγραμματιστικό,
διότι εμένα τρέχει κανονικά.
θέλω να σου κάνω μία ερώτηση ακόμα και να το κάνεις στην *πράξη* , μην
μου πεις τι έχεις παρατηρήσει μέχρι εδώ ! θέλω να 
συνδέσεις *μόνο* την αντίσταση στο + και το πιν 30 και να δεις
τη τάση έχει το πιν 30 .
μετά από αυτό, κάνε το ίδιο με μία αντίσταση 1ΚΩ, πάντα *χωρίς* διακόπτη.





> TRISD=%11111111
> PORTD=255
> 
> με αυτες τις 2 εντολες δεν του λεω οτι θελω την πορτα D σαν εισοδο και του λεω μετα να την κανει high?
> γιατι αμα τον βαλω στο κυκλωμα χωρις να ενωσω κατι πανω στο ποδαρακι 30 τοτε μου δειχει ταση 0βολτ.δεν επρεπε να δειχνει 5βολτ?



όχι, δεν θα σου δείξει ποτέ 5V.
η εντολή PORTD=255 είναι άχρηστη , διότι η πόρτα είναι είσοδος,
με αποτέλεσμα να μην υπακούει σε εντολές.

----------


## billtech

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

----------


## DT200

άλλον Pic 16F877Α έχεις ?
το συμπέρασμα μου είναι ότι έχεις κάψει το πιν 30 ,
αν δεν έχεις άλλο μ/ε τότε άλλαξε πιν, βάλε κάποιο άλλο.

----------


## savnik

> η ταση στο 30 με 1Κ ειναι 2,68βολτ.



Δεν είναι φυσιολογικό

----------


## billtech

εχω τον PIC16LF877A.θα δοκιμασω αλλο πιν και βλεπουμε.

----------


## billtech

ναι με αλλο Pin δουλεψε...εβαλα το D0(19)

----------


## DT200

ωραία !

άλλον PIC16LF877A έχεις, για να κάνεις την δοκιμή σου ?

----------


## billtech

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

----------


## billtech

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

----------


## DT200

πες μας λίγο , τι θέλεις ακριβός να κάνεις...(το όλο project)  
τες τα με λεπτομέρειες.

----------


## billtech

λοιπον..
εχω ενα ρολοι το οποιο δεν χρειαζετε απαραιτητα να εμφανιζετε στη οθονη,και θελω να ρυθμισω ενα relay και καποτε 2 να κανουν καποιο ανοιγμα για καποια συγκεκριμενη διαρκεια...το ρολοι το εμφανιζω στη οθονη μαζι με την ημερομινια γιατι οαν ρυθμισω την ωρα που θελω να ανοιγει το relay και να κλεινει τοτε δεν εχω κατι αλλο να βλεπω και ετσι βλεπω την ωρα και την ημερομηνια...τα relay θα τα οδηγω με ενα bc547 γιατι θα λειτουργουν και τα 2 με 12βολτ αλλα το ενα θα περναει απο τις επαφες ταση περιπου 24βολτ για ενα κηνητιρα και το αλλο θα περνανε κανονικα 240βολτ.το προβλημα μου εμενα ηταν το ρολοι.τα relay τα ξερω αρκετα καλα.
συνοψιζοντας...εγω θα βλεπω στη lcd την ωρα και την ημερομηνια και οταν παταω ενα κουμπι θα με περναει να ρυθμιζω το πρωτο relay και να το ενεργοποιω.οταν το ξαναπατησω να με περναει στο δευτερο relay.δεν με νοιαζει ποσα κουμπια θα μπουν.αυτο ειναι στη επιλογη μας.

----------


## billtech

```
program RTC_roloi

'dilosi kataxoriton
dim TEXT as string[6]
dim DS_sec,sec,DS_min,min,DS_ores,ores,BUT_D,INC_HOURS as byte

main:
 'edo kano tis arxikopoiiseis
  TRISD=%11111111
  PORTD=255
  TRISE.4=0

  I2C_Init(100000)
  Lcd_Config(PORTB,7,6,5,4,PORTB,2,1,3)
  LCD_Cmd(LCD_CLEAR)
  LCD_Cmd(LCD_CURSOR_OFF)
  LCD_Out(1,5, "00:00:00")
  Delay_ms(500)
  INC_HOURS=0

   'rithmisi toy ds1307 gia na metraei
  I2C_START
  I2C_WR($D0)
  I2C_WR($00)
  I2C_WR(%00000000)
  I2C_STOP

ARXH:
   'elegxo an patithike to koumpi kai etsi pao kai katharizo tin ora kai ta lepta kai ta stelno sto 0
     BUT_D=PORTD
     DELAY_MS(50)
     IF BUT_D.1=0 THEN GOTO SET1 END IF
'-------------------------------------------------------------------------------------------------------
   'edo diavazo ta deyterolepta..
     I2C_START
     I2C_WR($D0)   'toy dixno tin thesi mnimis
     I2C_WR($00)   'pou thelo
     I2C_Repeated_Start
     I2C_WR($D1)  'tou leo diavase...tin thesi poy sou ipa pano.
     DS_sec=I2C_Rd(0)
     I2C_STOP

    'edo diavazo ta lepta..
     I2C_START
     I2C_WR($D0)
     I2C_WR($01)
     I2C_Repeated_Start
     I2C_WR($D1)
     DS_min=I2C_Rd(0)
     I2C_STOP

    'edo diavazo tis ores..
     I2C_START
     I2C_WR($D0)
     I2C_WR($02)
     I2C_Repeated_Start
     I2C_WR($D1)
     DS_ores=I2C_Rd(0)
     I2C_STOP

    'emfanisi sti othoni (deyterolepta)
     sec=BCD2DEC(DS_sec)
     WordToStrWithZeros(sec,TEXT)
     LCD_chr(1,11, TEXT[3])
     LCD_chr(1,12, TEXT[4])

    'emfanisi sti othoni  (lepta)
     min=BCD2DEC(DS_min)
     WordToStrWithZeros(min,TEXT)
     LCD_chr(1,8, TEXT[3])
     LCD_chr(1,9, TEXT[4])

    'emfanisi sti othoni  (ores)
     ores=BCD2DEC(DS_ores)
     WordToStrWithZeros(ores,TEXT)
     LCD_chr(1,5, TEXT[3])
     LCD_chr(1,6, TEXT[4])

     GOTO ARXH
     
     
     
 '-----------------------------------------------------------------------------------------------
'rithmizo tis ores
SET1:

  if Button(PORTD, 0, 100, 1) then 'sto podaraki 0 ,periodos 100ms,energo ginete otan paei sto ena

  INC_HOURS=INC(INC_HOURS)
  if INC_HOURS=24 then INC_HOURS=0 end if

  I2C_START
  I2C_WR($D0)
  I2C_WR($02)
  I2C_WR(INC_HOURS) 'rithmizo tis ores
  I2C_STOP
  
  GOTO ARXH
  ELSE GOTO SET1
  END IF
'---------------------------------------------------------------------------------------------------
end.
```


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

----------


## DT200

είναι απλό ... 
εσύ το γράφεις σε δεκαδικό INC_HOURS=*INC*(INC_HOURS)
ενώ το διαβάζεις σεBCD    DS_ores=I2C_Rd(0) , ores=*BCD2DEC*(DS_ores).
για εμένα η λύση είναι ή να έχεις το ίδιο αριθμητικό σύστημα κατά
την εγράφη/ανάγνωση ή να φτιάξεις μία ρουτίνα που το δεκαδικό 
να το γράφεις στο RTC σε BCD.

----------


## billtech

δηλαδη?πως να το κανω?μου το εξηγας αυτο λιγακι?

----------


## DT200

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

----------


## billtech

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

----------


## DT200

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



στο help κοίταξες ?

----------


## billtech

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

----------


## billtech

> program RTC_roloi
> 
> 'dilosi kataxoriton
> dim TEXT as string[6]
> dim DS_sec,sec,DS_min,min,DS_ores,ores as byte
> dim BUT_D,INC_hour,BCD_hour,INC_min,BCD_min as byte
> 
> main:
>  'edo kano tis arxikopoiiseis
> ...



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

----------


## billtech

λοιπον..σκεφτηκα...να εχουμε ενα κουμπι που να μας περνει απο το run mode στα alarm mode's. στα alarm mode's να βαζουμε την ωρα εναρξης και τερματισμου και μετα με το πρωτο κουμπι που ειπαμε να πηγαινουμε πισω στο Run mode και να βλεπουμε την ωρα.και ενα συμβολο οτι δουλευει καποιο alarm  απο τα 2.και παραλληλα να ελεγχετε αν εχουμε ωρα για alarm.οταν και τα 2 alarm ειναι δεν χρησιμοποιουνται να μην ελεγχει αν εχουμε alarm.και επισης με ενα κουμπακι να μπλοκαρουμε τα alarm.δηλαδη να εχουμε τις ωρες περασμενες αλλα να μην δουλευευον αν δεν τους δωσουμε το οκ με αυτο το κουμπακι.
αν και η αληθεια σαν ιδεα φενεται εφικτη (και για καποιους ειναι)  :Smile:  εγω δεν μπορω να σκεφτω πως να το υλοποιησω.
ποιο πανω εχω αναιβασει το κωδικα που εκανα και ρυθμισω την ωρα και τα λεπτα.

----------


## DT200

σου δίνω συγχαρητήρια για το πρόγραμμα σου , είναι καλό !

εγώ για το Menu έχω μία κλασική ιδέα ...
ένα μπουτόν θα κάνει κύκλο το Menu, δηλαδή, 
τρέχων ώρα => 1ο Alarm => 2o Alarm => ρύθμιση ώρας => τρέχων ώρα...
για το κουμπί επιτρέψεις των Alarms μπορούμε να βάλουμε ένα διακόπτη
σε κάποιο ελεύθερο πιν και να γίνει η δουλειά.
Για την εισαγωγή των ωρών θέλουμε ένα μπουτόν.
Για την εισαγωγή των λεπτών θέλουμε ακόμα ένα μπουτόν.

για εμένα η πρώτη σου κίνηση είναι να φτιάξεις το Menu, δηλαδή 
(τρέχων ώρα => 1ο Alarm => 2o Alarm => ρύθμιση ώρας => τρέχων ώρα...)
μετά βλέπουμε...

----------


## billtech

κατι τετοιο εννουσα και εγω πριν...
για την εισαγωγη των ωρων και λεπτων των alarm  δεν μπορουμε να χρησιμοποιησουμε αυτα που εχουμε ηδη?
αλλα ολο αυτο εμενα μου ειναι λιγο δυσκολο..θελω λιγη(παρα πολλη) βοηθεια)  :Smile:

----------


## DT200

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



ναι μπορούμε αλλά είναι λίγο τσαπατσούλικο  :Blush: .

για κάνε μερικές προσπάθειες με το Menu και εδώ ήμαστε να σε βοηθήσουμε.

----------


## billtech

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

----------


## DT200

ας προσπαθήσουμε να το εκφράσουμε με λόγια...
πρώτα από όλα θα πούμε ότι έχουμε 3 μπουτόν.
1ο αλλαγή Menu, 2o αύξηση ωρών, 3ο αύξηση λεπτών.

καθώς η οθόνη "λέει" την ώρα, κάπου κάπου "κοιτάμε" αν έχει πατηθεί
το μπουτόν 1, αν έχει πατηθεί πάμε στην οθόνη Alarm1 και εκεί παρακολουθούμε 
αν θα πατηθεί το μπουτόν 2 ή το μπουτόν 3 και πράττουμε καταλλήλως,
σε αυτήν την οθόνη μένουμε μέχρι να *ξανά* πατηθεί το μπουτόν 1, αφού
το μπουτόν 1 πατηθεί τότε πάμε στην οθόνη Alarm2 και εκεί κάνουμε τα 
ίδια με την οθόνη Alarm1.

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

και τέλος στο 4ο πάτημα του μπουτόν 1, η οθόνη δείχνει την ώρα 
και περιμένουμε να "χτυπήσουν" τα Alarms.

εύκολο δεν "ακούγεται" ? 
κάνε μερικά πειράματα και μετά ανάρτησε ένα κώδικα να το δούμε μαζί

----------


## billtech

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

----------


## DT200

ναι , έχεις δίκιο.

----------


## savnik

Και τώρα αρχίζουν τα δύσκολα.

----------


## DT200

+ 16bit στον φίλο savnik , και μάλιστα όλα άσσοι !!!  :Biggrin:

----------


## savnik

Καλό θα είναι να δείχνει και την ημερομηνία για να μπορεί να ρυθμίζει όποια μέρα θέλει τα alarm.

----------


## billtech

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

----------


## billtech

```
  program RTC_roloi
   
  'dilosi kataxoriton
  dim TEXT as string[6]
  dim DS_sec,sec,DS_min,min,DS_ores,ores,d1,BUT_D as byte
  dim alarm1_str_hour,alarm1_str_min,alarm1_stp_hour,alarm1_stp_min as byte
   
  main:
   'edo kano tis arxikopoiiseis
    TRISD=%11111111
    PORTD=255
    TRISE.4=0
   
    I2C_Init(100000)
    Lcd_Config(PORTB,7,6,5,4,PORTB,2,1,3)
    LCD_Cmd(LCD_CLEAR)
    LCD_Cmd(LCD_CURSOR_OFF)
    LCD_Out(1,5, "00:00:00")
    Delay_ms(500)
   
    d1=0
    alarm1_str_hour=0
    alarm1_str_min=0
    alarm1_stp_hour=0
    alarm1_stp_min=0
   
    'rithmisi toy ds1307 gia na metraei
    I2C_START
    I2C_WR($D0)
    I2C_WR($00)
    I2C_WR(%00000000)
    I2C_STOP
   
  ARXH:
     'elegxo an patithike kapoio koumpi
       BUT_D=PORTD
       DELAY_MS(50)
       IF BUT_D.0=0 THEN GOTO mode END IF
      '-------------------------------------------------------------------------------------------------------
      LCD_Cmd(LCD_CLEAR)
      LCD_Out(1,5, "00:00:00")
   
     'edo diavazo ta deyterolepta..
       I2C_START
       I2C_WR($D0)   'toy dixno tin thesi mnimis
       I2C_WR($00)   'pou thelo
       I2C_Repeated_Start
       I2C_WR($D1)  'tou leo diavase...tin thesi poy sou ipa pano.
       DS_sec=I2C_Rd(0)
       I2C_STOP
   
      'edo diavazo ta lepta..
       I2C_START
       I2C_WR($D0)
       I2C_WR($01)
       I2C_Repeated_Start
       I2C_WR($D1)
       DS_min=I2C_Rd(0)
       I2C_STOP
   
      'edo diavazo tis ores..
       I2C_START
       I2C_WR($D0)
       I2C_WR($02)
       I2C_Repeated_Start
       I2C_WR($D1)
       DS_ores=I2C_Rd(0)
       I2C_STOP
   
        'emfanisi sti othoni (deyterolepta)
       sec=BCD2DEC(DS_sec)
       WordToStrWithZeros(sec,TEXT)
       LCD_chr(1,11, TEXT[3])
       LCD_chr(1,12, TEXT[4])
   
      'emfanisi sti othoni  (lepta)
       min=BCD2DEC(DS_min)
       WordToStrWithZeros(min,TEXT)
       LCD_chr(1,8, TEXT[3])
       LCD_chr(1,9, TEXT[4])
   
      'emfanisi sti othoni  (ores)
       ores=BCD2DEC(DS_ores)
       WordToStrWithZeros(ores,TEXT)
       LCD_chr(1,5, TEXT[3])
       LCD_chr(1,6, TEXT[4])
   
       GOTO ARXH
       
       
       
   '-----------------------------------------------------------------------------------------------
  mode:
       if Button(PORTD, 0, 100, 1) then
          d1=inc(d1)
          if d1=1 then goto set1 end if
          if d1=2 then goto set2 end if
          if d1=3 then goto set3 end if
          if d1=4 then goto set4 end if
          if d1=5 then goto set5 end if
          if d1=6 then
             d1=0
             goto ARXH
             end if
          else goto mode
       end if
  '---------------------------------------------------------------------------------------------
   
  set1:
       LCD_Cmd(LCD_CLEAR)
       LCD_Cmd(LCD_CURSOR_OFF)
       LCD_Out(1,1, "Alarm1 Start")
       delay_ms(100)
       LCD_Out(2,5,"00:00:00")
       if BUT_D.1=0 then goto a1 end if
       if BUT_D.2=0 then goto a2 end if
       goto set1
       
  a1:
       if Button(PORTD, 1, 100, 1) then
          alarm1_str_hour=inc(alarm1_str_hour)
          if alarm1_str_hour=24 then alarm1_str_hour=0
          LCD_Out(2,6, alarm1_str_hour)
          goto a1
          else goto set1
          end if
        end if
  a2:
       if Button(PORTD, 2, 100, 1) then
          alarm1_str_min=inc(alarm1_str_min)
          if alarm1_str_min=60 then alarm1_str_min=0
          LCD_Out(2,9, alarm1_str_min)
          goto a2
          else goto set1
          end if
        end if
  '---------------------------------------------------------------------------------------------
   
  set2:
       LCD_Cmd(LCD_CLEAR)
       LCD_Cmd(LCD_CURSOR_OFF)
       LCD_Out(1,1, "Alarm1 Stop")
       delay_ms(100)
       LCD_Out(2,5,"00:00:00")
       if BUT_D.1=0 then goto a3 end if
       if BUT_D.2=0 then goto a4 end if
       goto set2
   
  a3:
       if Button(PORTD, 1, 100, 1) then
          alarm1_stp_hour=inc(alarm1_stp_hour)
          if alarm1_stp_hour=24 then alarm1_stp_hour=0
          LCD_Out(2,6,alarm1_stp_hour)
          goto set1
          else goto a3
          end if
        end if
  a4:
       if Button(PORTD, 2, 100, 1) then
          alarm1_stp_min=inc(alarm1_stp_min)
          if alarm1_stp_min=60 then alarm1_stp_min=0
          LCD_Out(2,9,alarm1_stp_min)
          goto set1
          else goto a4
          end if
        end if
  '---------------------------------------------------------------------------------------------
  end.
```


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

----------


## savnik

Απο τα set πρέπει να επιστρέφεις στο mode αλλιώς μένεις εκεί για πάντα.
Και στο κυριο πρόγραμμα πρέπει να ελέγχεις συνέχεια την τρέχουσα ώρα με τις ρυθμίσεις που έβαλες στα alarm.
Δεν έχεις βάλει τα menu για να ρυθμίζεις τις ώρες και τα λεπτά.

----------


## billtech

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

----------


## savnik

```
  mode:
       if Button(PORTD, 0, 100, 1) then
          d1=inc(d1)
          delay_ms(50)    -   ΘΑ ΤΟ ΔΕΙΣ ΣΤΗΝ ΠΡΑΞΗ ΠΟΣΟ ΘΕΛΕΙ
          if d1=1 then goto set1 end if
          if d1=2 then goto set2 end if
          if d1=3 then goto set3 end if
          if d1=4 then goto set4 end if
          if d1=5 then goto set5 end if
          if d1=6 then
             d1=0
             goto ARXH
             end if
          else goto mode
       end if
  '---------------------------------------------------------------------
   
  set1:
       LCD_Cmd(LCD_CLEAR)
       LCD_Cmd(LCD_CURSOR_OFF)
       LCD_Out(1,1, "Alarm1 Start")
       delay_ms(100)
       LCD_Out(2,5,"00:00:00")
       if BUT_D.1=0 then goto a1 end if
       if BUT_D.2=0 then goto a2 end if
       if BUT_D.0=0 then goto mode end if   --------------------------
       goto set1
```

----------


## savnik

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

----------


## billtech

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

----------


## savnik

> Μην ξεχασεις ότι τους καταχωρητές για τα alarm πρέπει να τους γράφεις στη μνήμη του pic γιατί αν γίνει διακοπή θα τους χάσεις.



Εκτός αν δουλέψεις τον pic με μπαταρία.

----------


## billtech

```
  program RTC_roloi
   
  'dilosi kataxoriton
  dim TEXT as string[6]
  dim DS_sec,sec,DS_min,min,DS_ores,ores,d1,BUT_D as byte
  dim alarm1_str_hour,alarm1_str_min,alarm1_stp_hour,alarm1_stp_min as byte
  dim alarm2_str_hour,alarm2_str_min,alarm2_stp_hour,alarm2_stp_min as byte
  dim INC_hour,BCD_hour,INC_min,BCD_min as byte
   
  main:
   'edo kano tis arxikopoiiseis
    TRISD=%11111111
    PORTD=255
    TRISE.4=0
   
    I2C_Init(100000)
    Lcd_Config(PORTB,7,6,5,4,PORTB,2,1,3)
    LCD_Cmd(LCD_CLEAR)
    LCD_Cmd(LCD_CURSOR_OFF)
    LCD_Out(1,5, "00:00:00")
    Delay_ms(500)
   
    d1=0
    alarm1_str_hour=00
    alarm1_str_min=00
    alarm1_stp_hour=00
    alarm1_stp_min=00
    alarm2_str_hour=00
    alarm2_str_min=00
    alarm2_stp_hour=00
    alarm2_stp_min=00
   
    'rithmisi toy ds1307 gia na metraei
    I2C_START
    I2C_WR($D0)
    I2C_WR($00)
    I2C_WR(%00000000)
    I2C_STOP
   
  ARXH:
     'elegxo an patithike kapoio koumpi
       BUT_D=PORTD
       DELAY_MS(50)
       IF BUT_D.0=0 THEN GOTO mode END IF
      '-------------------------------------------------------------------------------------------------------
   
     'edo diavazo ta deyterolepta..
       I2C_START
       I2C_WR($D0)   'toy dixno tin thesi mnimis
       I2C_WR($00)   'pou thelo
       I2C_Repeated_Start
       I2C_WR($D1)  'tou leo diavase...tin thesi poy sou ipa pano.
       DS_sec=I2C_Rd(0)
       I2C_STOP
   
      'edo diavazo ta lepta..
       I2C_START
       I2C_WR($D0)
       I2C_WR($01)
       I2C_Repeated_Start
       I2C_WR($D1)
       DS_min=I2C_Rd(0)
       I2C_STOP
   
      'edo diavazo tis ores..
       I2C_START
       I2C_WR($D0)
       I2C_WR($02)
       I2C_Repeated_Start
       I2C_WR($D1)
       DS_ores=I2C_Rd(0)
       I2C_STOP
   
        'emfanisi sti othoni (deyterolepta)
       sec=BCD2DEC(DS_sec)
       WordToStrWithZeros(sec,TEXT)
       LCD_chr(1,11, TEXT[3])
       LCD_chr(1,12, TEXT[4])
   
      'emfanisi sti othoni  (lepta)
       min=BCD2DEC(DS_min)
       WordToStrWithZeros(min,TEXT)
       LCD_chr(1,8, TEXT[3])
       LCD_chr(1,9, TEXT[4])
   
      'emfanisi sti othoni  (ores)
       ores=BCD2DEC(DS_ores)
       WordToStrWithZeros(ores,TEXT)
       LCD_chr(1,5, TEXT[3])
       LCD_chr(1,6, TEXT[4])
   
       GOTO ARXH
       
       
       
   '-----------------------------------------------------------------------------------------------
  mode:
       if Button(PORTD, 0, 100, 1) then
          d1=inc(d1)
          if d1=1 then goto set1 end if 'alarm 1  start
          if d1=2 then goto set2 end if 'alarm 1  stop
          if d1=3 then goto set3 end if 'alarm 2  start
          if d1=4 then goto set4 end if 'alarm 2  stop
          if d1=5 then goto set5 end if 'set time
          if d1=6 then
             d1=0
             LCD_Cmd(LCD_CLEAR)
             LCD_Out(1,7, ":")
             LCD_Out(1,10, ":")
             goto ARXH
             end if
          else goto mode
       end if
  '---------------------------------------------------------------------------------------------
   
  set1:
       LCD_Cmd(LCD_CLEAR)
       LCD_Cmd(LCD_CURSOR_OFF)
       LCD_Out(1,1, "Alarm1 Start")
       delay_ms(100)
       LCD_Out(2,5,"00:00:00")
       Lcd_chr(2,6,alarm1_str_hour)
       LCD_chr(2,9, alarm1_str_min)
      '--------------------------------------
       if BUT_D.1=0 then goto a1 end if
       if BUT_D.2=0 then goto a2 end if
       IF BUT_D.0=0 THEN GOTO check END IF
       goto set1
      '--------------------------------------
  a1:
       if Button(PORTD, 1, 100, 1) then
          alarm1_str_hour=inc(alarm1_str_hour)
          if alarm1_str_hour=24 then alarm1_str_hour=0
          LCD_chr(2,6, alarm1_str_hour)
          goto a1
          else goto set1
          end if
        end if
  a2:
       if Button(PORTD, 2, 100, 1) then
          alarm1_str_min=inc(alarm1_str_min)
          if alarm1_str_min=60 then alarm1_str_min=0
          LCD_chr(2,9, alarm1_str_min)
          goto a2
          else goto set1
          end if
        end if
  '---------------------------------------------------------------------------------------------
   
  set2:
       LCD_Cmd(LCD_CLEAR)
       LCD_Cmd(LCD_CURSOR_OFF)
       LCD_Out(1,1, "Alarm1 Stop")
       delay_ms(100)
       LCD_Out(2,5,"00:00:00")
       LCD_chr(2,6,alarm1_stp_hour)
       LCD_chr(2,9,alarm1_stp_min)
       '-------------------------------
       if BUT_D.1=0 then goto a3 end if
       if BUT_D.2=0 then goto a4 end if
       IF BUT_D.0=0 THEN GOTO check END IF
       goto set2
       '---------------------------------
  a3:
       if Button(PORTD, 1, 100, 1) then
          alarm1_stp_hour=inc(alarm1_stp_hour)
          if alarm1_stp_hour=24 then alarm1_stp_hour=0
          LCD_chr(2,6,alarm1_stp_hour)
          goto set1
          else goto a3
          end if
        end if
  a4:
       if Button(PORTD, 2, 100, 1) then
          alarm1_stp_min=inc(alarm1_stp_min)
          if alarm1_stp_min=60 then alarm1_stp_min=0
          LCD_chr(2,9,alarm1_stp_min)
          goto set1
          else goto a4
          end if
        end if
  '---------------------------------------------------------------------------------------------
  set3:
       LCD_Cmd(LCD_CLEAR)
       LCD_Cmd(LCD_CURSOR_OFF)
       LCD_Out(1,1, "Alarm2 Start")
       delay_ms(100)
       LCD_Out(2,5,"00:00:00")
       Lcd_chr(2,6,alarm2_str_hour)
       LCD_chr(2,9, alarm2_str_min)
      '--------------------------------------
       if BUT_D.1=0 then goto a21 end if
       if BUT_D.2=0 then goto a22 end if
       IF BUT_D.0=0 THEN GOTO check END IF
       goto set3
      '--------------------------------------
  a21:
       if Button(PORTD, 1, 100, 1) then
          alarm2_str_hour=inc(alarm2_str_hour)
          if alarm2_str_hour=24 then alarm2_str_hour=0
          LCD_chr(2,6, alarm2_str_hour)
          goto a21
          else goto set3
          end if
        end if
  a22:
       if Button(PORTD, 2, 100, 1) then
          alarm2_str_min=inc(alarm2_str_min)
          if alarm2_str_min=60 then alarm2_str_min=0
          LCD_chr(2,9, alarm2_str_min)
          goto a22
          else goto set1
          end if
        end if
  '---------------------------------------------------------------------------------------------
   
  set4:
       LCD_Cmd(LCD_CLEAR)
       LCD_Cmd(LCD_CURSOR_OFF)
       LCD_Out(1,1, "Alarm2 Stop")
       delay_ms(100)
       LCD_Out(2,5,"00:00:00")
       LCD_chr(2,6,alarm2_stp_hour)
       LCD_chr(2,9,alarm2_stp_min)
       '-------------------------------
       if BUT_D.1=0 then goto a23 end if
       if BUT_D.2=0 then goto a24 end if
       IF BUT_D.0=0 THEN GOTO check END IF
       goto set4
       '---------------------------------
  a23:
       if Button(PORTD, 1, 100, 1) then
          alarm2_stp_hour=inc(alarm2_stp_hour)
          if alarm2_stp_hour=24 then alarm2_stp_hour=0
          LCD_chr(2,6,alarm2_stp_hour)
          goto set4
          else goto a3
          end if
        end if
  a24:
       if Button(PORTD, 2, 100, 1) then
          alarm2_stp_min=inc(alarm2_stp_min)
          if alarm2_stp_min=60 then alarm2_stp_min=0
          LCD_chr(2,9,alarm2_stp_min)
          goto set4
          else goto a24
          end if
        end if
  '---------------------------------------------------------------------------------------------
  set5:
       LCD_Cmd(LCD_CLEAR)
       LCD_Cmd(LCD_CURSOR_OFF)
       LCD_Out(1,1, "Set Time")
       delay_ms(100)
       LCD_Out(2,5,"00:00:00")
   
       'edo diavazo ta lepta..
       I2C_START
       I2C_WR($D0)
       I2C_WR($01)
       I2C_Repeated_Start
       I2C_WR($D1)
       DS_min=I2C_Rd(0)
       I2C_STOP
   
      'edo diavazo tis ores..
       I2C_START
       I2C_WR($D0)
       I2C_WR($02)
       I2C_Repeated_Start
       I2C_WR($D1)
       DS_ores=I2C_Rd(0)
       I2C_STOP
   
      'emfanisi sti othoni  (lepta)
       min=BCD2DEC(DS_min)
       WordToStrWithZeros(min,TEXT)
       LCD_chr(2,8, TEXT[3])
       LCD_chr(2,9, TEXT[4])
   
      'emfanisi sti othoni  (ores)
       ores=BCD2DEC(DS_ores)
       WordToStrWithZeros(ores,TEXT)
       LCD_chr(2,5, TEXT[3])
       LCD_chr(2,6, TEXT[4])
  set51:
       '-------------------------------
       if BUT_D.1=0 then goto a55 end if
       if BUT_D.2=0 then goto a56 end if
       IF BUT_D.0=0 THEN GOTO check END IF
       goto set51
       '---------------------------------
  a55:
       if Button(PORTD, 1, 100, 1) then
          INC_hour=INC(INC_hour)
          if INC_hour=24 then INC_hour=0 end if
   
          BCD_hour=Dec2Bcd(INC_hour)
   
          I2C_START
          I2C_WR($D0)
          I2C_WR($02)
          I2C_WR(BCD_hour) 'rithmizo tis ores
          I2C_STOP
          
          goto set5
        ELSE GOTO a55
       end if
  a56:
       if Button(PORTD, 2, 100, 1) then
          INC_min=INC(INC_min)
          if INC_min=60 then INC_min=0 end if
   
          BCD_min=Dec2Bcd(INC_min)
   
          I2C_START
          I2C_WR($D0)
          I2C_WR($01)
          I2C_WR(BCD_min) 'rithmizo ta lepta
          I2C_STOP
   
          goto set5
        ELSE GOTO a56
        end if
  '---------------------------------------------------------------------------------------------
   
  check:
        BUT_D=PORTD
       DELAY_MS(50)
       IF BUT_D.0=0 THEN GOTO mode END IF
       goto check
  end.
```


λοιπον..εκανα αυτο...ειναι χωρις την ασφαλεια που ειπε ο φιλος savnik.
αλλα εκτος των λαθων που σιγουρα εχει εχω αλλο ενα προβλημα που νομιζω ειναι σοβαρο..οταν το κανω built μου βγαζει μυνημα κατω οτι 
"Linker error: demo Limit".
αν μπορειται δοκιμαστε το καποιος και πειτε μου αν σας το βγαζει και εσας.

----------


## billtech

ενταξει το προβλημα με το Linker.διορθωθηκε.  :Wink:

----------


## billtech

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

----------


## billtech

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



```
  program RTC_roloi
   
  'dilosi kataxoriton
  dim TEXT as string[6]
  dim DS_sec,sec,DS_min,min,DS_ores,ores,d1,BUT_D as byte
  dim alarm1_str_hour,alarm1_str_min,alarm1_stp_hour,alarm1_stp_min as byte
  dim alarm2_str_hour,alarm2_str_min,alarm2_stp_hour,alarm2_stp_min as byte
  dim INC_hour,BCD_hour,INC_min,BCD_min as byte
   
  main:
   'edo kano tis arxikopoiiseis
    TRISD=%11111111
    PORTD=255
    TRISE.4=0
   
    I2C_Init(100000)
    Lcd_Config(PORTB,7,6,5,4,PORTB,2,1,3)
    LCD_Cmd(LCD_CLEAR)
    LCD_Cmd(LCD_CURSOR_OFF)
    LCD_Out(1,5, "00:00:00")
    Delay_ms(500)
   
    d1=0
    alarm1_str_hour=00
    alarm1_str_min=00
    alarm1_stp_hour=00
    alarm1_stp_min=00
    alarm2_str_hour=00
    alarm2_str_min=00
    alarm2_stp_hour=00
    alarm2_stp_min=00
   
    'rithmisi toy ds1307 gia na metraei
    I2C_START
    I2C_WR($D0)
    I2C_WR($00)
    I2C_WR(%00000000)
    I2C_STOP
   
  ARXH:
     'elegxo an patithike kapoio koumpi
       BUT_D=PORTD
       DELAY_MS(50)
       IF BUT_D.0=0 THEN GOTO mode END IF
      '-------------------------------------------------------------------------------------------------------
   
     'edo diavazo ta deyterolepta..
       I2C_START
       I2C_WR($D0)   'toy dixno tin thesi mnimis
       I2C_WR($00)   'pou thelo
       I2C_Repeated_Start
       I2C_WR($D1)  'tou leo diavase...tin thesi poy sou ipa pano.
       DS_sec=I2C_Rd(0)
       I2C_STOP
   
      'edo diavazo ta lepta..
       I2C_START
       I2C_WR($D0)
       I2C_WR($01)
       I2C_Repeated_Start
       I2C_WR($D1)
       DS_min=I2C_Rd(0)
       I2C_STOP
   
      'edo diavazo tis ores..
       I2C_START
       I2C_WR($D0)
       I2C_WR($02)
       I2C_Repeated_Start
       I2C_WR($D1)
       DS_ores=I2C_Rd(0)
       I2C_STOP
   
        'emfanisi sti othoni (deyterolepta)
       sec=BCD2DEC(DS_sec)
       WordToStrWithZeros(sec,TEXT)
       LCD_chr(1,11, TEXT[3])
       LCD_chr(1,12, TEXT[4])
   
      'emfanisi sti othoni  (lepta)
       min=BCD2DEC(DS_min)
       WordToStrWithZeros(min,TEXT)
       LCD_chr(1,8, TEXT[3])
       LCD_chr(1,9, TEXT[4])
   
      'emfanisi sti othoni  (ores)
       ores=BCD2DEC(DS_ores)
       WordToStrWithZeros(ores,TEXT)
       LCD_chr(1,5, TEXT[3])
       LCD_chr(1,6, TEXT[4])
   
       GOTO ARXH
       
       
       
   '-----------------------------------------------------------------------------------------------
  mode:
       if Button(PORTD, 0, 100, 1) then
          d1=inc(d1)
          if d1=1 then goto set1 end if 'alarm 1  start
          if d1=2 then goto set2 end if 'alarm 1  stop
          if d1=3 then goto set3 end if 'alarm 2  start
          if d1=4 then goto set4 end if 'alarm 2  stop
          if d1=5 then goto set5 end if 'set time
          if d1=6 then
             d1=0
             LCD_Cmd(LCD_CLEAR)
             LCD_Out(1,7, ":")
             LCD_Out(1,10, ":")
             goto ARXH
             end if
          else goto mode
       end if
  '---------------------------------------------------------------------------------------------
   
  set1:
       LCD_Cmd(LCD_CLEAR)
       LCD_Cmd(LCD_CURSOR_OFF)
       LCD_Out(1,1, "Alarm Start 1:")
       delay_ms(100)
       LCD_Out(2,5,"00:00:00")
       Lcd_chr(2,6,alarm1_str_hour)
       LCD_chr(2,9, alarm1_str_min)
      '--------------------------------------
  set11: BUT_D=PORTD
       DELAY_MS(50)
       if BUT_D.1=0 then goto a1 end if
       if BUT_D.2=0 then goto a2 end if
       IF BUT_D.0=0 THEN GOTO check END IF
       goto set11
      '--------------------------------------
  a1:
       if Button(PORTD, 1, 100, 1) then
          alarm1_str_hour=inc(alarm1_str_hour)
          if alarm1_str_hour=24 then alarm1_str_hour=0
          LCD_chr(2,6, alarm1_str_hour)
          goto a1
          else goto set11
          end if
        end if
  a2:
       if Button(PORTD, 2, 100, 1) then
          alarm1_str_min=inc(alarm1_str_min)
          if alarm1_str_min=60 then alarm1_str_min=0
          LCD_chr(2,9, alarm1_str_min)
          goto a2
          else goto set11
          end if
        end if
  '---------------------------------------------------------------------------------------------
   
  set2:
       LCD_Cmd(LCD_CLEAR)
       LCD_Cmd(LCD_CURSOR_OFF)
       LCD_Out(1,1, "Alarm Stop 1:")
       delay_ms(100)
       LCD_Out(2,5,"00:00:00")
       LCD_chr(2,6,alarm1_stp_hour)
       LCD_chr(2,9,alarm1_stp_min)
       '------------------------------
  set22:BUT_D=PORTD
       DELAY_MS(50)
       if BUT_D.1=0 then goto a3 end if
       if BUT_D.2=0 then goto a4 end if
       IF BUT_D.0=0 THEN GOTO check END IF
       goto set22
       '---------------------------------
  a3:
       if Button(PORTD, 1, 100, 1) then
          alarm1_stp_hour=inc(alarm1_stp_hour)
          if alarm1_stp_hour=24 then alarm1_stp_hour=0
          LCD_chr(2,6,alarm1_stp_hour)
          goto set22
          else goto a3
          end if
        end if
  a4:
       if Button(PORTD, 2, 100, 1) then
          alarm1_stp_min=inc(alarm1_stp_min)
          if alarm1_stp_min=60 then alarm1_stp_min=0
          LCD_chr(2,9,alarm1_stp_min)
          goto set22
          else goto a4
          end if
        end if
  '---------------------------------------------------------------------------------------------
  set3:
       LCD_Cmd(LCD_CLEAR)
       LCD_Cmd(LCD_CURSOR_OFF)
       LCD_Out(1,1, "Alarm Start 2:")
       delay_ms(100)
       LCD_Out(2,5,"00:00:00")
       Lcd_chr(2,6,alarm2_str_hour)
       LCD_chr(2,9, alarm2_str_min)
      '--------------------------------------
  set33:BUT_D=PORTD
       DELAY_MS(50)
       if BUT_D.1=0 then goto a21 end if
       if BUT_D.2=0 then goto a22 end if
       IF BUT_D.0=0 THEN GOTO check END IF
       goto set33
      '--------------------------------------
  a21:
       if Button(PORTD, 1, 100, 1) then
          alarm2_str_hour=inc(alarm2_str_hour)
          if alarm2_str_hour=24 then alarm2_str_hour=0
          LCD_chr(2,6, alarm2_str_hour)
          goto a21
          else goto set33
          end if
        end if
  a22:
       if Button(PORTD, 2, 100, 1) then
          alarm2_str_min=inc(alarm2_str_min)
          if alarm2_str_min=60 then alarm2_str_min=0
          LCD_chr(2,9, alarm2_str_min)
          goto a22
          else goto set33
          end if
        end if
  '---------------------------------------------------------------------------------------------
   
  set4:
       LCD_Cmd(LCD_CLEAR)
       LCD_Cmd(LCD_CURSOR_OFF)
       LCD_Out(1,1, "Alarm Stop 2:")
       delay_ms(100)
       LCD_Out(2,5,"00:00:00")
       LCD_chr(2,6,alarm2_stp_hour)
       LCD_chr(2,9,alarm2_stp_min)
       '-------------------------------
  set44:BUT_D=PORTD
       DELAY_MS(50)
       if BUT_D.1=0 then goto a23 end if
       if BUT_D.2=0 then goto a24 end if
       IF BUT_D.0=0 THEN GOTO check END IF
       goto set44
       '---------------------------------
  a23:
       if Button(PORTD, 1, 100, 1) then
          alarm2_stp_hour=inc(alarm2_stp_hour)
          if alarm2_stp_hour=24 then alarm2_stp_hour=0
          LCD_chr(2,6,alarm2_stp_hour)
          goto set44
          else goto a3
          end if
        end if
  a24:
       if Button(PORTD, 2, 100, 1) then
          alarm2_stp_min=inc(alarm2_stp_min)
          if alarm2_stp_min=60 then alarm2_stp_min=0
          LCD_chr(2,9,alarm2_stp_min)
          goto set44
          else goto a24
          end if
        end if
  '---------------------------------------------------------------------------------------------
  set5:
       LCD_Cmd(LCD_CLEAR)
       LCD_Cmd(LCD_CURSOR_OFF)
       LCD_Out(1,1, "Set Time:")
       delay_ms(100)
       LCD_Out(2,5,"00:00:00")
   
       'edo diavazo ta lepta..
       I2C_START
       I2C_WR($D0)
       I2C_WR($01)
       I2C_Repeated_Start
       I2C_WR($D1)
       DS_min=I2C_Rd(0)
       I2C_STOP
   
      'edo diavazo tis ores..
       I2C_START
       I2C_WR($D0)
       I2C_WR($02)
       I2C_Repeated_Start
       I2C_WR($D1)
       DS_ores=I2C_Rd(0)
       I2C_STOP
   
      'emfanisi sti othoni  (lepta)
       min=BCD2DEC(DS_min)
       WordToStrWithZeros(min,TEXT)
       LCD_chr(2,8, TEXT[3])
       LCD_chr(2,9, TEXT[4])
   
      'emfanisi sti othoni  (ores)
       ores=BCD2DEC(DS_ores)
       WordToStrWithZeros(ores,TEXT)
       LCD_chr(2,5, TEXT[3])
       LCD_chr(2,6, TEXT[4])
  set51:
       '-------------------------------
       BUT_D=PORTD
       DELAY_MS(50)
       if BUT_D.1=0 then goto a55 end if
       if BUT_D.2=0 then goto a56 end if
       IF BUT_D.0=0 THEN GOTO check END IF
       goto set51
       '---------------------------------
  a55:
       if Button(PORTD, 1, 100, 1) then
          INC_hour=INC(INC_hour)
          if INC_hour=24 then INC_hour=0 end if
   
          BCD_hour=Dec2Bcd(INC_hour)
   
          I2C_START
          I2C_WR($D0)
          I2C_WR($02)
          I2C_WR(BCD_hour) 'rithmizo tis ores
          I2C_STOP
          
          goto set51
        ELSE GOTO a55
       end if
  a56:
       if Button(PORTD, 2, 100, 1) then
          INC_min=INC(INC_min)
          if INC_min=60 then INC_min=0 end if
   
          BCD_min=Dec2Bcd(INC_min)
   
          I2C_START
          I2C_WR($D0)
          I2C_WR($01)
          I2C_WR(BCD_min) 'rithmizo ta lepta
          I2C_STOP
   
          goto set51
        ELSE GOTO a56
        end if
  '---------------------------------------------------------------------------------------------
   
  check:
        BUT_D=PORTD
       DELAY_MS(50)
       IF BUT_D.0=0 THEN GOTO mode END IF
       goto check
  end.
```


πως σας φενεται?

----------


## DT200

έχω να σου κάνω μία παράξενη ερώτηση,

οι αριθμοί : %00000000 , $00 , $0 , 0, 00 είναι διαφορετικοί μεταξύ τους ή 
είναι απλά ο αριθμός μηδέν, σε πέντε διαφορετικές εκδοχές ?

αν είναι ίσοι μεταξύ τους, τότε γιατί  στα προγράμματα σου
δεν γράφεις απλά το  0 ? 
είναι ποιο εύκολο.

----------


## billtech

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

----------


## DT200

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




> Lcd_*chr*(2,6,alarm1_str_hour)
>        LCD_*chr*(2,9, alarm1_str_min)



αυτή η εντολή είναι για να πάρεις *ένα*  χαρακτήρα από 
ένα καταχωρητή και να τον στείλεις στην οθόνη,
αλλά με την προϋπόθεση ότι το περιεχόμενο του καταχωρητή είναι 
είναι σε *format string*.

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

----------


## DT200

> δεν εχω αλλον 877A. εχω ομως 887. πειτε μου παιδια οτι μπορουμε να μεταφερουμε το κωδικα σε αυτο τον επεξεργαστη γιατι θα χαζεψω.



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

για βάλε στον 877 ένα πρόγραμμα που θα αναβοσβήνει όλες
τις πόρτες του και δοκίμασε με ένα Led και κοίτα τι κάνει.

----------


## billtech

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

----------


## billtech

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

----------


## DT200

> θελω την βοηθεια σου για να καταλαβω τις διαφορες string Lcd_chr  Lcd_out γιατι τις διαβασα και μπερδευομαι.



Π.Χ. dim temp as word 
       dim txt     as string[6]

για το παράδειγμα τώρα θα πούμε ότι ο κατ/της  temp=2378
αν προσπαθήσω να στείλω τον temp όπως είναι στην οθόνη 
τότε το αποτέλεσμα θα είναι κινέζικα. 
αυτό συμβαίνει διότι ο κατ/της temp δεν έχει format string , δηλαδή κείμενο.
για να γίνει κείμενο θα πρέπει να εκτελέσω την εντολή wordtostr,
με αυτήν την εντολή στέλνω το περιεχόμενο του κατ/τη temp στον 
κατ/τη txt .
τώρα ο αριθμός 2378 είναι σε μορφή κειμένου και έχω δύο επιλογές 
ή τον στέλνω στην οθόνη ολόκληρο lcd_out(1,1,txt) ή
παίρνω μόνο τον αριθμό που με ενδιαφέρει π.χ. το 2 ,
σε αυτήν την περίπτωση θα γράψω lcd_chr(1,1,txt[ 2])

ελπίζω να είναι κατανοητά όλα αυτά.







> το πρωτο πιο σιμαντικο ειναι ο επεξεργαστης...τι κανουμε τωρα?



κάνε προσπάθειες με τον άλλον που έχεις,
πρώτα κάτι απλό για να τον "ανάψεις" και μετά όλο το πρόγραμμα.

----------


## DT200

> καμια ιδεα?



πάτα το κουμπί που λέει ολική διαγραφή μήπως και το ξεπεράσει.
κάνε και μία επανεκκίνηση στο PC.

και έλεγξε και τις τάσεις σου στο κύκλωμα με την οθόνη.

----------


## billtech

το πατησα...τιποτα...τα ιδια...
ποιες τασεις? για τον 877α? τις κοιταξα και φαινοντε κανονικες..
τον 887 γμτ γιατι δεν τον διαβαζει?

----------


## billtech

αν κανω ενα μεγαλο σφαλμα πειραζι?αν χρησειμοποιησω ενα πυραυλο για ενα μιρμυγκι θα φταιω?
εχω στη διαθεση μου..σπιτι...τον pic1f452 και αυτον το winpic800 τον βρισκει...αν δουλεψουμε με αυτον ωσπου να δουμε τι θα κανω με τον 877Α?να το κανομε ετσι?

----------


## briko

επρεπε να το εχεις κανει ιδη

----------


## billtech

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

----------


## billtech

αυτος ειναι ο κωδικας που προσπαθησα να κανω...
αν μπορειται κοιταξτε απο το set1 εως το set2 ειναι για τη ρυθμηση οπως θα δειτε του  start1 alarm. δηλαδη η πρωτη οθονη..
εμενα οταν το τρεξω το κουμπι που ειναι για τις ωρες δεν κανει τπτ στη οθονη και το αλλο των λεπτων κανει παλαβα...αλλαζει τις οθονες απο μονο του οταν το πατησω και διαφορα τετοια..τι φταιει?

----------


## billtech

λοιπον παιδια...επειδη εχει ολο το απογευμα ασχολουμε με αυτο το πραμα και μου εχουν σπασει τα νευρα αναιβαζω τον κωδικα που εκανα εγω.οποιος θελει και μπορει να βοηθεισει καλως αλλιως εγω δεν την παλευω αλλο..
εκει που ολα εδειχναν να προχωρουν καλα και ειχα τελειωσει με το set5 και ρυθμιζοταν οι ωρες και τα λεπτα καλα.οταν πηγα να κανω αυτο που μου ειπε ο φιλος DT200 με το wordtostr που εγω το δοκιμασα και αυτο και το wordtostrwithzeros και εμφανιζονταν καλα στη οθονη οι χρονοι του set1 τοτε οταν πατουσα για τις ωρες ειχα πληρεις απαθεια και οταν πατουσα τα λεπτα ειχα κατι τρελλα του τυπου ετρεχε ολα τα μενου απο μονο του και πηγαινε στο τελευταιο..και το πιο ωραιο? οι ωρες ενω εχουν περιορισμο το 24  και τα λεπτα το 60 στο set5 πηγαιναν εως το 70!!!
εδω αναιβαζω ενα κωδικα που εκανα πριν να εχω ολα αυτα τα παλαβα.
οποιος μπορει και θελει να το κοιταξει και να κανει καποιες διορθωσεις καλως..αλλιως εγω αν και εχω υπομονη σε αυτο εξαντληθηκε!!!
ευχαριστω.

----------


## briko

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

----------


## billtech

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

----------


## briko

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

----------


## billtech

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

----------


## DT200

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

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

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

----------


## billtech

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

καλο κουραγιο φιλε μου...και σε ευχαριστω και παλι

----------


## DT200

εγώ θα στο "διορθώσω" αλλά θα πρέπει να ξεκινήσεις να το 
κόβεις σε κομμάτια , δεν μπορώ να κάθομαι και να μελετάω 
κάθε μέρα ένα πρόγραμμα με 350 εντολές  :W00t:  είναι σκότωμα.

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

----------


## DT200

σε αυτό το τόπικ που γράφουμε ήμαστε εκτός 
θέματος, η επικοινωνία με το RTC πραγματοποιήθηκε ,
άρα καλό θα είναι να φύγουμε από εδώ και 
να πάμε εδώ 
http://www.hlektronika.gr/forum/show...=42583&page=15
τα λέμε ...

----------


## viper

Νομίζω πως εδώ πρέπει να καταθέσω την ερώτησή μου.

Προσπαθώ να φτιάξω ένα project στο οποίο 2 PIC16F877A θα επικοινωνούν μεταξύ τους.(master - slave)
Ακολουθώντας τις πολύτιμες συμβουλές του DT200 και προσπαθώντας να κατανοήσω το datasheet του PIC16F877A κατέληξα στα εξής παρακάτω : 

Ο κώδικας για τον MASTER





> main:
>   I2C_Init(100000)
>   I2C_Start()
>   I2C_Wr($22)
>   I2C_Wr(2)
>   I2C_Wr($F0)
>   I2C_Stop()
> 
> End.




Ο κώδικας για τον SLAVE





> program I2C_SLAVE_EXPERIMENT1
> 
> Sub procedure interrupt
> 
> if PIR1.SSPIF = 1  then
>     PORTB=%00000000
> end if
> 
> End sub
> ...




Θεωρητικά ο slave όταν ξεκινάει θα πρέπει να έχει ένα LED αναμένο και όταν γίνει Address match και το bit SSPIF γίνει 1 τότε θα σβύνει το LED. Στην πράξη όμως δέν γίνεται τίποτα. Μετά από μερικές δοκιμές διαπίστωσα οτι ο κώδικας του MASTER παγώνει στην εκτέλεση της εντολής *I2C_Wr($22)*. 
Φίλε DT200 θα σου ήμουν ευγνώμον αν μπορούσες να με βοηθήσεις. Προσπαθώ τόσες μέρες και είμαι στο παρα πέντε να τα παρατήσω.  :Sad:

----------

