# Συζήτηση Κυκλωμάτων > Κυκλώματα Εκπομπής & Λήψης > Ταλαντωτές >  >  SAA1057 control

## leosedf

Καλησπέρα.
Ήθελα να ρωτήσω κάποια πράγματα σχετικά με το πρωτόκολλο του 1057 μιας και δεν το έχω χρησιμοποιήσει ποτέ.
Τελικά είναι I2C η SPI?
Μπορεί κάποιος να εξηγήσει το initialization? Πρώτα στέλνεις το word B μετά ξανά το Word B και τέλος το Word A? Κάτι δεν έχω καταλάβει από το datasheet.

Επίσης αν έχει κανείς υπ' όψιν του κάποιο linear για AM 10-15-20W με τρανζίστορ.

----------


## chip

δεν το έχω χρησιμοποιήσει ποτέ αλλά αυτό που καταλαβαίνω είναι οτι δεν είναι Ι2C αλλά έχει τον δικό του τρόπο επικοινωνίας...
Αυτό που καταλαβαίνω είναι οτι όταν ξεκινά θέλει μια αρχικοποίηση σαν ρεσετ που μπορεί είτε να είναι 10 παλμοί clk είτε να στείλεις το B information αλλα δεν θα το κρατήσει οπότε πρέπει να το ξαναστείλεις και μετά το Α. Απλά η αρχικοποίηση αν δεν γίνει με 10 παλμούς αλλά γίνει με "σκουπίδια" αυτό πρέπει να είναι τύπου Β και όχι τύπου Α

----------

leosedf (05-01-14)

----------


## leosedf

Χμμμ λέει Η 10 παλμοί ρολογιού να περάσουν στο CLB Η να σταλεί το word Β για initialization.
Και από κάτω για ολοκληρωμένη αρχικοποίηση πρέπει να ακολουθήσει το word B και εκεί είναι που το χάνω.

----------


## sigmacom

Κι εγώ δεν το έχω δουλέψει ποτέ! Πάντως SPI θα το χαρακτήριζα. 

Ζητάει ότι από την στιγμή που θα ξεκινήσεις να του στέλνεις data (σηκώνοντας High το DLEN), το CLB πρέπει να είναι ήδη καρφωμένο σε High ή Low και να μην κάνει transition επί του χρόνου tLZsu, γιατί θα παρεξηγηθούν τυχόν άλλες συσκευές I2C που θα κάνουν κοινή χρήση των γραμμών CLB & DATA (θα το θεωρήσουν START ή STOP condition). Εφ' όσον δεν θα έχεις συσκευές I2C παράλληλα πάνω στα CLB+DATA, δεν πρέπει να σε απασχολεί (αλλά τι χελώνα είναι αυτή? Το CLB πρέπει να είναι <100kHz!)

Το init γίνεται στέλνοντας το data word B και μετά το word A (το word A το ξαναστέλνεις κάθε φορά που θες να πάει σε καινούρια συχνότητα). 
Όμως η φιλενάδα Philips λέει ότι πρίν στείλεις το word B πρέπει να πρώτα να ξεπλυθούν οι registers και για να το πετύχεις αυτό πρέπει να στείλεις τουλάχιστον 10 clockιες, ή το word B (16 clockιες). 
Οπότε έχεις να επιλέξεις μεταξύ δυο προγραμμάτων πλύσης: 
- Πλυντήριο τύπου Α: power on, μετά >10 clockιες, μετά word B, μετά word A
- Πλυντήριο τύπου Β: power on, μετά word B, μετά ξανά word B, μετά word A

Για πομπό μεσαίων το θες?

----------

leosedf (05-01-14)

----------


## leosedf

Ναι Στέλιο με τα κλασσικά SAA1057, TDA1072, MC1496 απλά οι κώδικες που κυκλοφορούν είναι σε μορφή hex και θα ήθελα να ενσωματώσω τον έλεγχο του σε πιο μεγάλο PIC γιατί ίσως βάλω και μερικά έξτρα πράγματα κλπ.
Για ένα μικρό AM Project και είμαι τελείως στόκος δεν έχω ξαναφτιάξει ΑΜ.

Εκτός αν έχετε κάτι άλλο στο μυαλό σας που μπορεί να χρησιμοποιηθεί με τα TDA-MC.

----------


## leosedf

Τώρα που το ξανασκέφτομαι, μήπως να έβαζα κάποιο DDS της Analog για ταλαντωτή? Η θα γίνουμε σαλάτα?

----------


## aloyphs

για δες εδω
http://ifrimv.altervista.org/software/saa1057.htm

----------


## leosedf

Το έχω δει ήδη ευχαριστώ. Απλά δεν έχω καταλάβει τι πρωτόκολλο είναι ακόμη. Πιθανότατα SPI όπως είπε και ο Στέλιος πιο πάνω.

----------


## fotisr

Κωστα καλησπερα.Πολλη σπανια γραφω στο φορουμ αλλα επιδη το εχω φτιαξει περιπου 10 φορες με pic628a-saa1057-tda1072-mc1496 και το πρωτο ολοκληρωμενο ηθελε προγραμμα το δευτερο ειχε κανα 5 ευρω το τριτο ηθελε μια βαρικαπ που ειχε κανα 10 ευρω ΒΒ112 και το τεταρτο ηθελε εναν μετασχηματιστη που επρεπε να τον βρεις.Θελει θορακηση τελεια απο την R.F για να μην ξελοκαρει και βγαζει 100 μιλιβολτ πικ του πικ.Μετα απο πολλα καψιματα τελικα αγορασα ενα DDS me to AD9850 και τελος στην χαζαμαρα και εχω το κεφαλι μου ησυχο.

----------


## picdev

το spi δεν είναι στάνταρ για αυτό οι dsPic33f που έχουν δουλέψει έχουν ένα κάρο ρυθμίσεις,
για τη πολικότητα των παλμών, τη πολικότητα του enable, αν είναι framed τα πακέτα, αν είναι 8 ή 16bit και άλλα που δεν θυμάμαι

----------


## picdev

αν θυμάμαι καλά στο framed SPI το ρολόι δούλευε συνέχεια και στο enable ή slave celect έστελνε παλμούς συγχρονισμού για να λάβει τα δεδομένα, ίσως να μοιάζει με αυτό

----------


## leosedf

Κάτι δεν έχω καταλάβει σωστά. Αν πάρουμε παράδειγμα τη χρήση του σε δέκτη FM ο διαιρέτης υπολογίζεται ως εξής:
F (in MHz) = ((10 x N) x REFH) - 10.7MHz όπου F η συχνότητα, το 10 είναι ο φιξ διαιρέτης για FM (που δεν τον χρειαζόμαστε), η συχνότητα αναφοράς 1Khz και η αφαίρεση του IF 10.7MHz.

Οπότε για να υπολογίσω τη συχνότητα π.χ. με τη χαμηλότερη διαίρεση 512 έχω: F (σε MHz)= 512 χ 0.001
αποτέλεσμα 0.512ΜΗz άρα 512KHz.

Είμαι σωστός? (έτοιμος για λιθοβολισμό).

----------


## leosedf

Στέλιο επειδή το I2C στέλνει 8bit κάθε φορά, στέλνω wordB δυο φορές χωρίς να μηδενίσω το DLEN και μετά για το wordA πρέπει να μηδενίσω και να ξανά σηκώσω το DLEN?
Να χωρίσω δηλαδή τα words με το DLEN?

----------


## sigmacom

Ξαναλέω ότι δεν το 'χω δουλέψει, αλλά από το datasheet καταλαβαίνω ότι *κάθε φορά* που είναι να στείλεις ένα word, *πριν* ξεκινήσεις την αποστολή του, σηκώνεις το DLEN. 
Μόλις τελειώσεις την αποστολή του word (16bit πάντα), κατεβάζεις το DLEN και ενεργοποιούνται οι παράμετροι που περιείχε το word που μόλις έστειλες. 

saa1057_words.png

----------


## leosedf

Αφού γίνει το init μετά όποτε θέλεις αλλαγή συχνότητας στέλνεις μόνο το WordA σωστά?

Δε φαίνεται να παίζει με τίποτα γμτ.
Έχω pull up resistors σε όλες τις γραμμές, το CLK μου φαίνεται ότι είναι low για κάποιο λόγο και ανεβαίνει όταν στέλνω παλμούς.

----------


## sigmacom

Αν το είχα στα χέρια μου, θα δοκίμαζα:

High DLEN
Send WordB
Low DLEN
Wait 1mS

High DLEN
Send WordB
Low DLEN
Wait 1mS

High DLEN
Send WordA
Low DLEN

Βέβαια, αν το είχα πραγμάτικα στα χέρια μου, θα το δοκίμαζα πρώτα εδώ: 



Το clock καλά κάνει και παίζει όταν στέλνεις data. Τι ταχύτητα έχει?
Τι τιμή έχει το WordB και το WordA που ρίχνεις και δεν παίζει? 
Σε τι γλώσσα γράφεις / ποιόν μικροελεγκτή?

----------


## leosedf

18F4550 με Flowcode/BoostC.

Θα δοκιμάσω έτσι όπως λες. Εγώ έβαζα 5ms.

Για να στείλω words πρέπει να σηκώσω DLEN και να στείλω δυο ακολουθίες MSB LSB και μετά να ρίξω DLEN.

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

Ταχύτητα δοκίμασα και με 100KHz και με 50.

----------


## leosedf

Εδώ κράτησα το WordA χωρίς delay μόλις πατάω το κουμπί UP.



Και εδώ το ίδιο αλλά με delay 1ms.


Στα κουμπιά Up Down στέλνω σκέτο WordA.


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

Το WordB μου αποστέλλεται σε δυο κομμάτια πρώτα 00000001 και μετά 01100101

----------


## leosedf

Και εδώ ένα διάγραμμα του init.



Έβαλα ένα Interrupt στο INT2 πατώντας να ξανά κάνει init ώστε να το πιάσω με τον παλμογράφο.

----------


## sigmacom

Μετράω 18 clockιες μεταξύ του up/down του DLEN, ή όχι? 
Στο datasheet βλέπω θέλει 17 (η πρώτη clockιά στον βρόντο με το DATA=0, για να αποφύγει conflicts με I2C devices που τυχόν κρέμονται στο ίδιο bus ). 


Τα DATA πάντως βλέπω τα στέλνεις σωστά: σε κάθε rising edge του CLOCK. 
Σαν HEX value τι δίνεις στο WordA και στο WordB (μην με βάζεις να κάνω decode από το screenshot πλιζ!) *EDIT:* Τώρα είδα το flow.

Κανένας έτοιμος κώδικας δεν κυκλοφορεί ρε γμτ να τον δούμε?

----------


## sigmacom

Πρώτο στέλνεις το MSB

----------


## leosedf

Κανονικά το βάζω να κάνει decode το i2c για να βλέπω αλλά τώρα δεν έπαιξε.

Υπάρχει αυτό που ανέβασα για 16F84.

Εγώ στέλνω νούμερο από 512 έως 1800 που σύμφωνα με τις πράξεις είναι αυτό. Κάθε φορά που πατάω προσθέτει η αφαιρεί ανάλογα με το κουμπί και το στέλνει.

Κάτι άλλο που πρόσεξα εδώ http://www.ifrimv.go.ro/saa_lpt.htm (ελπίζω να έχει αυτόματη μετάφραση)

Λέει ότι το wordA έχει ένα μηδενικό στο MSB και το WordB έχει έναν άσο στο MSB

----------


## sigmacom

Πρώτο πρέπει να στέλνεις το MSB του word. Επίσης το bit[15] του WordB πρέπει να είναι πάντα 1. 
Εσύ στέλνεις WordB = 0b0000 0001 και μετά 0b0110 0101, ενώ πρέπει 0b*1*000 0001 και μετά 0b0110 0101,

*EDIT*: για το bit[15] το επιβεβαιώνει και ο Ρουμάνος που είπες

*EDIT2*: Ουσιαστικά με WordB = 0b*1*000 0001 0110 0101 του λες:
Bit[15]=1 Πρόκειται για WordB
Bit[14]=0 Θα δουλέψεις AM
Bit[13]=0 Βήμα 1kHz
Bit[12:9]=0000 0.023mA pump
Bit[8]=1 Μην αγνοήσεις τα επόμενα 8 bit
Bit[7]=0 Ασύγχρονο mode
Bit[6:5]=11 Κλείσε τον Digital phase detector 
Bit[4:0]=0101 Στο pin 18 θα έχεις HIGH όταν λοκάρεις, και LOW όταν δεν λοκάρει το PLL

----------


## leosedf

Ναι επειδή έπαιζα με το MSB LSB τα έβαζα πάνω κάτω και το άφησα έτσι.

Σωστά αναφέρεις τα config bits θα ξανά δοκιμάσω με τον άσο μπροστά.

Το pump να το αφήσω 0000? Αυτό το είχα αφήσει έτσι.

Όταν αλλάζω συχνότητα να στέλνω και το wordB στην αρχή? δηλαδή WordB και Α? H μόνο το Α?

----------


## sigmacom

Μόνο το WordA (το οποίο έχει Bit[15]=0 για να υποδηλώνει ότι "αυτό είναι ένα WordA").
Το charge pump δεν ξέρω, μου φαίνεται λίγο. Άλλοι που το έχουν δουλέψει, στα πόσα mA το έχουν?

----------


## leosedf

Το wordA Είναι 16bit σε εμένα 2χ8bit και σίγουρα έχει μηδενικά μπροστά.

Δεν ξέρω, υπέθεσα ότι είναι στο 0 (pump), θα δω και τι έχει μέσα στο Asm

----------


## leosedf

Γράπωσα εικόνα από το init. Φαίνεται και το 1ms delay.

Φαίνεται κανονικό.

Εδώ το wordB πιο κοντά.

Που φαίνεται και ο άσσος μπροστά.


Και το WordA από κοντά.

Φαίνεται οκ όλο γενικά.


Στέλνω 16bits όμως, ψάχνω να βρω τρόπο να στείλω 15 και να δω το θέμα με τον ενισχυτή ρεύματος.
Έχω κάνει κεφάλι καζάνι, προς το παρών πάπαλα τα ίδια ξεκινάει από 500-600KHz και σταματάει στα 2.6MHz

Δεν ξέρω αν χρειαστεί κάποιο delay όταν σηκωθεί το DLEN μέχρι να ξεκινήσει το CLB.

----------


## sigmacom

Αν το SAA περιμένει να shiftάρει με 17 clockιές και του 'ρχονται 18, το Bit[15] θα πετιέται (είναι serial register). 
Εσύ θα στέλνεις 0b*1000 0001 0110 0101* και μόλις κατεβάσεις το DLEN, το SAA θα καταλαβαίνει 0b*0000 0010 1100 1010*

Στο snapshot του WordA βλέπω ότι στέλνεις 00.0000.1010.0001.0001, αλλά στο SAA θα μείνει 0000.1010.0001.0001 (0x0A11h = 2577dec). 
Στο snapshot του WordB βλέπω ότι στέλνεις 01.0000.0110.1100.1011, αλλά στο SAA θα μείνει *0*000.0110.1100.1011 (0x6CBh = 1739dec). 

Οπότε ουσιαστικά δεν γίνεται ποτέ config του SAA, γιατί αυτό που νομίζεις ότι έστειλες σαν WordB, τελικά καταλήγει WordA. 
Στείλε για WordB 0100.0000.1011.0010 (0x40h και 0xB2) να δούμε αν υπακούει. 
Για το WordA, κάνε το shift μια θέση προς τα δεξιά πριν το στείλεις.

----------


## leosedf

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

Στην κυματομορφή δεν φαίνονται 17 clocks? Εγώ κοιτάω το κάτω μέρος...

----------


## sigmacom

Έκανα edit το προηγούμενο μήνυμα, δες το λίγο. 
Το SAA κάνει shift τα DATA σε κάθε rising edge του CLK, κι εγώ μετράω 18 rising edges!

----------


## leosedf

Έχεις δίκιο αυτό φαίνεται.


Εγώ όμως είχα στείλει αυτό. (τώρα βλέπω είναι λανθασμένο)


Για WordB.


Το WordA έχω Uint Variable που τη σπάω σε MSB και LSB κάτσε να δω πως θα την κάνω shift και αυτή.

----------


## sigmacom

Στο snapshot που σχολίασα ότι το SAA εξέλαβε το WordA σαν 2577 dec (0x0A11h), εσύ τι ήθελες να στείλεις? 1288 dec (0x0508h)? 
Για το shift προς τα δεξια, εφ' όσον είναι θετικοί αριθμοί, απλά κάνε διαίρεση δια δυο. 
Αν γράφεις σε C, κάνε bitwise >> κατά 1 θέση.

----------


## leosedf

512(dec) είναι η αρχική τιμή που θέλω να στείλω.

----------


## sigmacom

Τότε τι δείχνει αυτή η εικόνα? 512 dec, είναι 0x0200h, δηλαδή μόνο το bit[9]=high (0000.0010.0000.0000)
Όμως φαίνεται να σηκώνεις παραπάνω από ένα bits σε high: 



Είναι κανα snapshot σε φάση που σκάλιζες τα μπουτόν για να αλλάξεις συχνότητα?

----------


## leosedf

Περίεργο, στην EEPROM αποθηκεύεται σαν 0x0200h.
Και όπως και να μεταβάλλω τη μεταβλητή αποθηκεύεται κανονικά.


Και στο display οκ.

----------


## sigmacom

Με καθαρό μυαλό, δε φτιάχνεις ένα δικό σου bit banging να έχεις τον απόλυτο έλεγχο και να ξέρεις τι σου γίνεται?

----------


## leosedf

Ναι.... Μάλλον, γιατί έχω γίνει ήδη κουδούνι.
Θα αλλάξω το library του i2c λίγο και αν δεν παίξει θα φτιάξω ρουτίνες για bb.

Αν πετάω σε μια έξοδο της πόρτας ολόκληρη την τιμή θα πάρει το πρώτο bit και μετά shift και ξανά? να δω λίγο πως παίζει το λογισμικό μου και μετά θα το προχωρήσω έτσι.

----------


## sigmacom

Όχι, πρέπει να κάνεις μια λούπα και να παίρνεις κάθε bit. 
Δεν έχω ιδέα από BoostC, σου γράφω μια ιδέα και δοκιμάζεις.




```
/*portb.0 = DLEN
portb.1 = DATA
portb.2 = CLOCK*/

void send_spi16(unsigned short value){
    unsigned char i = 0;

    portb.0 = 0;             //Kato to DLEN
    delay_10uS(1);

    portb.1 = 0;             //Kato to DATA
    portb.2 = 1;             //Mia clockia ston vronto
    delay_10uS(1);
    portb.2 = 0;
    delay_10uS(1);

    for(i=15; i >=0; --i){
        portb.1 = value.i;   //Dose sto DATA tin timi toy bit [i]
        delay_10uS(1);
        portb.2 = 1;         //Clockia
        delay_10uS(1);
        portb.2 = 0;
        delay_10uS(1);
    }

    portb.0 = 1;             //Pano to DLEN
    delay_10uS(1);
}
```

----------


## leosedf

Θα το δω το πρωί γιατί είναι μπλεγμένη η boostc με το flowcode, έχω κάνει καζάνι κεφάλι όλη μέρα  :Lol:

----------


## leosedf

Bit Banging συνέχεια και αυτό αυτό που παίρνω.



Μάλλον πρέπει να βάλω delay ανάμεσα για να προλαβαίνει το DLEN να κατεβαίνει σε λογικό 0 και βλέπω έναν άσσο στο wordA που δεν καταλαβαίνω γιατί εμφανίζεται.

45 clocks (15bit words)

Όταν στείλω σκέτο wordA στέλνει απλά ένα bit...

----------


## sigmacom

Κώδικα μπορούμε να δούμε? Έστω ΠΜ

----------


## leosedf

Κάτσε έστελνα 8bit δεδομένα με 14 loop count χαχαχ.
Το κατέβασα στα 8 έβαλα και μια pull up στο DLEN γιατί δεν το έβλεπα να ανεβαίνει.
Για κάποιο λόγο το DLEN ενώ πριν δούλευε τώρα από 0 πάει στα 0.κάτι

----------


## leosedf

Αυτό είναι υποτίθεται το init.



Ο κώδικας είναι 2500 γραμμές είσαι σίγουρος??

----------


## sigmacom

Μόνο το bitbang με ενδιαφέρει! 
Μήπως έκανες κανένα βραχυκύκλωμα με κανένα άλλο ποδάρι και βούλιαξε έτσι το DLEN? 
Αποκλείεται να το "βλέπει" σαν HIGH το SAA με τόσο χαμηλή στάθμη.

----------


## leosedf

Δεν ξέρω το ψάχνω, έστειλα ΠΜ.

----------


## sigmacom

Αυτό δεν είναι πάντως WordB, το bit[15] είναι μηδεν. 
Στην ουσία στέλνεις δυο φορές ένα WordA με τιμή 0000.1001.0101.1010 (0x095Ah, 2394 dec), και μετά ένα τρίτο WordA με τιμή 0000.0000.0000.1000.0000 (0x0080h, 128 dec)
Και να δούλευε το DLEN (να είχε σωστή στάθμη), πάλι μούντζα.

----------


## leosedf

Βρήκα ένα λαθάκι, αντί για reset στο loopcount σε 8 στην αρχή κάθε loop το είχα στο 0.  :Hammer: 
Θα δοκιμάσω ξανά.

Να το πρώτο byte του wordB

----------


## leosedf

Μετά από 40 ώρες στο τηλ με το Στέλιο το λύσαμε το θέμα (για σένα μαλλιά που κοιτάς αλλά δε μιλάς)   :Lol:  :Lol:  και οι παλμοί πάνε καλά.

Το τελείως κουφό είναι η συχνότητα που παίρνει το SAA1057 μέσω μιας αντίστασης και ενός πυκνωτή.
Μετρώντας στη μια μεριά της αντίστασης μετράω 4MHz στην άλλη μεριά 6 με ΤΕΡΜΑ θόρυβο.
Το αστείο είναι ότι αν απομονώσω το pll και μετρήσω το PIN που ΔΕΧΕΤΑΙ σήμα του κρυστάλλου, ΑΠΟ ΕΚΕΙ ΠΡΟΕΡΧΕΤΑΙ αυτό το περίεργο σήμα 6MHZ με τίγκα θόρυβο..

Τι διάολο παίζει δεν μπορεί ούτε αυτός που το σχεδίασε να καταλάβει. Οπότε δεν παίζει σωστά.


Θα το βαρέσω με ένα σφυρί και θα βάλω DDS μου φαίνεται να τελειώνουμε, τουλάχιστον θα είναι πιο ξεκάθαρο στην επικοινωνία του.

----------


## sigmacom

Είναι πολύ λίγα τα mVpp που μέτρησες στην πηγή των 4MHz. 
Αυτός περιμένει πηγή 4MHz με 5Vpp πλάτος και βάζει αντίσταση 22ΚΩ.
4mhz_source.png

Έτσι για το γμτ, δε βάζεις ένα αυτόνομο κρύσταλλο στο SAA να δούμε τι κάνει?

4mhz_xtal.png

----------


## leosedf

Θα το δοκιμάσω μάλλον σε καινούρια πλακέτα και θα αφήσω καινούρια θέση που θα απομονώνει με jumper ώστε να παίζει με δικό του.
Υποθέτω είχε πάρει ο freddo για οικονομία από τον επεξεργαστή.

Να και το αρχικό http://home.deds.nl/~radio102/freddos/s1057/1057s.gif
Αλλά βλέπω είχε κάνει και ένα άλλο με ξεχωριστό κρύσταλλο http://home.deds.nl/~radio102/freddos/tx/j310osc.jpg

----------


## sigmacom

Το xtal mode στον PIC, σε τι το έχεις? Δοκίμασε και HS mode να δεις αν ανεβαίνουν τα Vpp. 
(θυμίζω δεν έχω ιδέα από PIC, μπορεί να λέω και μπούρδες)

----------


## leosedf

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

----------

