Hallo,
Als onderdeel van een GIP moet ik een digitaal signaal omvormen tot een analoog signaal. Hier heb ik dus gekozen voor de MAX531. Nu is mijn probleem het verkrijgen van een juiste uitgangsspanning. Mijn data komt van een PIC16F628A, en voor de eenvoud stuurt deze gewoon 1 signalen naar de digitale ingang van de MAX531. Ik zou hem graag gebruiken in het uitgangsbereik van 0V tot 4.096V, en met een gain van 2 dus. Maar als ik de MAX echter aansluit zoals in de datasheet staat (pg 11 fig7) kom ik niet de maximale waarde uit nl. 4.096V. Hebben julie soms een idee?
Onderstaande is mijn code voor de MAX van de PIC16F628A(geschreven in C met PICC):
#include "G:\Eindwerk\Programma\digitaalanaloog\digitaalanaloog.h"
#include <stdio.h>
int i;
void main()
{
while (true)
{
for (i=1; i<=12; ++i)
{
output_bit(PIN_A3, 0); //SCLK -> 0
delay_us(10);
output_bit(PIN_A1, 0); //CHIP-SELECT -> 0
delay_us(10);
output_bit(PIN_A2, 1); //DIN
delay_us(10);
output_bit(PIN_A3, 1); //SCLK -> 1 (stijgende flank -> data door)
delay_us(10);
}
}
}
Als het niet duidelijk genoeg is vraag je maar.
Alvast bedankt,
Steff
Je aansturing klopt niet. Zie pag. 9 van de datasheet. Je zult aan het einde van je communicatie wat met je nCS moeten.
Standaard: init je pinnen op wat handig is. Start met nCS low. Clock naar buiten war eruit moet / naar binnen wat er terug komt (indien van toepassing; hier dus niet). nCS high.
Dus je bedoelt dit :
#include "G:\Eindwerk\Programma\digitaalanaloog\digitaalanaloog.h"
#include <stdio.h>
int i;
void main()
{
while (true)
{
for (i=1; i<=12; ++i)
{
output_bit(PIN_A1, 0); //CHIP-SELECT -> 0
delay_us(10);
output_bit(PIN_A3, 0); //SCLK -> 0
delay_us(10);
output_bit(PIN_A2, 1); //DIN
delay_us(10);
output_bit(PIN_A3, 1); //SCLK -> 1 (stijgende flank -> data door)
delay_us(10);
}
output_bit(PIN_A1, 1); //CHIP-SELECT -> 1
delay_us(10);
}
}Dit doet het ook niet, oftewel ligt het aan mijn programmering oftewel aan mijn schakeling. Ik denk ten zeerste dat het mijn schakeling is, want als ik de controller zijn nMCLR laag maak (en de pic dus niets van data doorstuurt) ik nog altijd een uitgangsspanning krijg van de MAX531. Deze uitgangsspanning hangt wel te zweven, dus het is waarschijnlijk iets met mijn referenties. Maar die heb ik aangesloten zoals in de datasheet en nog zweeft de uitgang...
Nog een keer: init je pinnen op wat handig is. Start met nCS low. Clock naar buiten wat eruit moet. nCS high.
Wat je in je for loopt doet lijkt er een heel klein beetje op.
Waarom staat dat overigens weer in een endless loop??
Domme fout van mezelf, thx marco69 voor de hulp. Hij doet het nu (had dom geweest en telkens gewoon mn ship-select getriggerd feitelijk).
Dit ga je dus waarschijnlijk niet meer vergeten. Handig toch, zo'n stukje praktijk ervaring 
Succes er verder mee!
Hij werkt volledig met onderstaande code (samen met een SRF05 ultrasoonsensor). Voor diegenen die hier ook problemen hebben, kan dit misschien helpen
.
#include "G:\Eindwerk\Programma\digitaalanaloog\digitaalanaloog.h"
void Max531_Start();
void Max531_Stop();
void Max531_Sendbit(short);
void Max531_write(long);
short int_ext_flank; //0 = int stijgende flank, 1 = int dalende flank
long afstand;
#int_EXT
EXT_isr()
{
if( int_ext_flank )
{
afstand = get_timer1()/58; // de afstand is timer1/58 in cm
printf("De afstand is=%lu\n\r", afstand); // de afstand is timer1 / 58
printf("Timerwaarde : %lu\n\r", get_timer1()); // timerwaarde
ext_int_edge( L_TO_H ); // zet de interrupt van dalende flank, naar stijgende flank.
int_ext_flank=0; // maak de vlag
Max531_Start();
Max531_Write(afstand);
Max531_Stop();
}
else
{
set_timer1(0);
ext_int_edge( H_TO_L ); // zet de interrupt van stijgende flank, naar dalende flank.
int_ext_flank=1; // maak de vlag 1
}
}
void main()
{
enable_interrupts(INT_EXT);
enable_interrupts(global);
ext_int_edge( L_TO_H );
int_ext_flank=0;
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_1 );
/*************************************************************/
output_bit(PIN_B6, 1); //Chip-select -> 1 voor alle zekerheid
printf("Controller Online");
while(true)
{
output_bit( PIN_B3, 1); // Triggeren van de ultrasoonsensor (10µs puls)
delay_ms(500); // echo genereert interrupt op RBO
output_bit( PIN_B3, 0);
delay_ms(500);
}
}
void Max531_Start()
{
output_bit(PIN_B7, 0); //DATA-OUTPUT -> 0
delay_us(10);
output_bit(PIN_B5, 0); //SCLK -> 0
delay_us(10);
output_bit(PIN_B6, 0); //CHIP-SELECT -> 0
delay_us(10);
}
void Max531_Write(long waarde)
{
int i = 16;
short j;
while(i>0)
{
j=bit_test(waarde, i-1);
Max531_Sendbit(j);
i--;
delay_us(10);
}
}
void Max531_Sendbit(short bitTOsend)
{
output_bit(PIN_B7, bitTOsend); //DIN
delay_us(10);
output_bit(PIN_B5, 1); //SCLK -> 1 (stijgende flank);
delay_us(10);
output_bit(PIN_B5, 0); //SCLK -> 0
}
void Max531_Stop()
{
output_bit(PIN_B5, 0); //SCLK -> 0
delay_us(10);
output_bit(PIN_B6, 1); //CHIP-SELECT -> 1
delay_us(10);
}