Hallo iedereen
Vooralleer ik een hardware ontwerp maak zou ik graag weten als dat wel juist is wat ik doe.
Het gaat om het interfacen van de 9833 (DDS chip) met de microcontroller PIC18F2550
De AD9833 maakt SPI datacommunicatie mogelijk en heeft de volgende aansluitingen:
FSYNC : Active Low Control Input.
This is the frame synchronization signal for the input data.
When FSYNC is taken low, the internal logic is informed that a new word is being loaded into the device.
SDATA: Serial Data Input. The 16-bit serial data-word is applied to this input
SCLK : Serial Clock Input. Data is clocked into the AD9833 on each falling SCLK edge.
The PIC18F2550 have the next connections:
=================================
SCK : Synchronous serial clock input/output for SPI mode
SDI : SPI data in (input)
SDO : SPI data out (output)
Qestion 1
=======
How can I connected my AD9833 via SPI communication with my microcontroller PIC18F2550 ?
I have been connected my AD9833 with my PIC18F2550 in this order:
AD9833 Device Microcontroller Device
============ ================
SCLK (input) SCK (output)
FSYNC (input) SDO (output)
SDATA (input) SDI (input)
If it's not possible to connected in this way, is there then an alternative manner because I'm going one using my
current devices normally the AD9833 and the PIC18F2550 because both they support SPI protocol
Question 2
========
In which mode can I the I/O pins for the data communication SPI?
I hope that all help me with my problem, it's for an lab project in school
Henry S.
Moderator
Confucius says chà bù duo. Deze post is niet door ChatGPT gegenereerd. De 2019 CO labvoeding.
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
Jojo,
Inderdaad ik maak gebruik van het SPI protocol en maak gebruik van de ingebouwde functies van MicroC SPI_Write() hebben we enkel nodig
Example:
CONTROL_REG = 0x2008
DATA_REG = 0x000346DC
Dat is mijn code:
PORT_CE = 0; // Begin transmitting
Delay_µs(250);
SPI_Write(0x08); // Write Control register
Delay_µs(250);
SPI_Write(0xDC); // Write 28 bits word to
// Data register
Spi_Write(0x46);
Spi_Write(0x03);
Spi_Write(0x00);
Delay_µs(250);
PORT_CE = 1; // Stop transmitting
Ik denk dat het zo moet zijn?
Ik ga er even van uit dat je die SPI voor elkaar hebt en weet wat je wilt sturen. Dan zie ik alleen nog niet dat je de FSYNC even wiebert rondom ieder 16 bit naar de DDS.
Hallo iedereen
Voor de opgave gaat om een microcontroller gestuurde bodeplotter als dat project klaar is wil ik het wel sharen
Voor mij is die verbinding van mijn PIC met de DDS opgelost dus bedankt daarvoor.
Ik heb een test gedaan door de microcontroller als MASTER te laten werken en een data bytes te laten versturen en dat is volledig in orde.
Wat nu het grote probleem is : De microcontroller is de MASTER dus eenmalig SPI initialiseren denk ik. De SLAVE laat ik uitvoeren door een DDS chip van type AD9833
Nu is mijn bedoeling dat ik eerst eenmalig het control register initialiseer door instellen van bepaalde bits die nodig zijn voor de goede werking van de chip
Ik gebruik daarvoor de microcontroller 16F877A voor test doeleinden om daarna deze 18F2550 in te zetten als het project definitief in orde is.
Ik heb twee functies gemaakt :
1) Berekenen van het frequentiewoord, door de invoer van
de frequentie.
void Set_DDS_Frequency(unsigned short Freq);
2) Extracten van de MSB en LSB en sturen via SPI transfers
void Write_DDS_AD9833(unsigned int value);
Daarna een gewenste frequentie in te stellen, en wordt omgezet naar een 32 bit frequentie woord die wordt opgesplitst in 2 * 16 bit en zodanig dat ik twee keer die functie moet aanroepen om zo in totaal 4 SPI transfers te hebben.
Ik zit nu met de volgende vragen van de communicatie van PIC naar DDS.
1) Heb ik voldoende aan deze twee functies?
2) Moet ik ergens nog die tming functies gebruiken of is
dat niet meer relevant voor de aansturing van die chip?
3) Hierbij stuur ik het hoofdprogramma en vraag mij af wat
kan ik in een interrupt plaatsen bij het sturen van
die DDS chip?
4) Is de volgorde juist in het hoofdprogramma?
In bijlage mijn programma:
==========================
void interrupt()
{
if(PIE1.ADIE) && (PIR1.ADIF))
{
Send_Byte(Vin);
Send_byte(Vout);
}
if(PIE1.RCIE) && (PIR1.RCIF))
{
// Bij het ontvangen van een byte moet deze worden
doorgestuurd
// Send_Byte(Vin);
}
PIR1.ADIF = 0;
}
void main()
{
// Init the processor
SCK_TRIS = 0; // SPI clock output
SDO_TRIS = 0; // SDATA output
FSYNC_TRIS = 0; // Chip Enable Output
// voor SPI comm
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4,
_SPI_DATA_SAMPLE_MIDDLE,
_SPI_CLK_IDLE_HIGH,
_SPI_HIGH_2_LOW);
INTCON.PEIE = 1; // enable peripheral
interrupts
PIE1.ADIE = 1; // enable ADC interrupt
INTCON.GIE = 1; // enable Global
interrupts,
turn on service
Delay_ms(1000);
// Init the DDS chip
//
FSYNC_PORT = 0;
// Setup control register of the DDS
Write_DDS_AD9833(0x2100);
Delay_us(10);
FSYNC_PORT = 1;
// Write data to DDS
do
{
if(Button(&PORTB, 0, 1, 1) == 1)
// Set Frequency
Write_DDS_AD9833(Set_DDS_Frequency(10000);
// listen for button push signalling a new
frequency
// if so then call a routine to assemble the
data as above
// and send it to the DDS
}
while(1);
// Init the ADC
Init_ADC();
Vin = Get_Sample_ADC(0);
Vout = Get_Sample_ADC(1);
// Init the UART
UART_Init(9600);
// Send_Byte(Vin);
// Send_byte(Vout);
}
Kan iemand mij helpen en tips geven en hoe ik het zou kunnen aanpakken en wijzigen aanbrengen als er kleine foutjes zijn of tips geven
De routines kan ik sturen als ze nodig lijken
Grtz
S
Mijn Master SPI dat werkt volledig nu nog die MASTER naar SLAVE via SPI aan de praat krijgen.
Kan iemand mij eens helpen als die code juist is opgesteld?
Groetjes
S
Henry S.
Moderator
Confucius says chà bù duo. Deze post is niet door ChatGPT gegenereerd. De 2019 CO labvoeding.
http://www.circuitsonline.net/forum/faq#topickicks
Je wacht maar weer een dagje.
En nu eindelijk maar weer eens nadenken voordat je domme dingen doet?
[Bericht gewijzigd door Henry S. op (31%)]