Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ЦАП max509
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Карлсон
Здравствуйте, уважаемые.

у меня есть четырехканальный цап max509.
он управляется по spi.
в качестве контроллера - atmega8.

положим я хочу вывести пилу через первый выход цапа.
пишу в CodeVision.

вот мой код:

Код
#include <mega8.h>
#include <delay.h>
#include <spi.h>
unsigned char value=0;

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
value++;
if(value>127){
value=0;
}
TCNT0 = 0xCE;
}

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
PORTC.0=0;
delay_us(1);
PORTC.0=0;
spi(0b00000011);
spi(value);
PORTC.0=1;
TCNT1H = 0xFF;
TCNT1L = 0xD8;
}

void main(void)
{
#asm("cli")
DDRB=0x2C;

PORTC=0x03;
DDRC=0x03;

PORTD=0x00;
DDRD=0x00;  

TCCR0 = 0x00;
TCNT0 = 0xCE;
TCCR0 = 0x02;

TCCR1B = 0x00;
TCNT1H = 0xFF;
TCNT1L = 0xD8;
OCR1AH = 0x00;
OCR1AL = 0x28;
OCR1BH = 0x00;
OCR1BL = 0x28;
ICR1H  = 0x00;
ICR1L  = 0x28;
TCCR1A = 0x00;
TCCR1B = 0x01;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;


MCUCR=0x00;

TIMSK=0x05;

ACSR=0x80;
SFIOR=0x00;

SPCR=0x50;
SPSR=0x00;

#asm("sei")

while (1)
      {
      };
}


где всё это дело вместе смоделировать - я не нашел.
поэтому программирую железо и смотрю результат через осциллограф.
вся схема собрана на макетке.
проблема вот в чем.
секунды полторы держится нормальная пила.
потом она превращается в беспорядочное мельтешение ступенек.
да, LDAC у меня подключен к земле - это никак не влияет, что с управлением ldac'ом, что без оного - результат един.
никто не подскажет, где я заблуждаюсь?

и еще.
если просто отдельно процессор просимулировать в протеусе, то он ругается вот так: "Warning: [U1] Attempted to write invalid address at pc=00AA".
00AA это адрес для SPSR=0x00;
отчего так?
Карлсон
попробовал такой вариант кода:

Код
#include <mega8.h>
#include <delay.h>

#define CS PORTC.0
#define SCLK PORTB.5
#define DIN PORTB.3
//#define OUTPIN PORTD.0
//masks used for serial output to DAC
#define CMD_MASK 0x08
#define DATA_MASK 0x80

#define output_high(x) (x=1);
#define output_low(y) (y=0);

//macro to advance the clock one tick for communication with the DAC
#define SCLK_FLANK() output_high(SCLK); output_low(SCLK);

void Init(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xFF;

PORTC=0x00;
DDRC=0xFF;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
}

//send a command to the DAC chip
void command(int cmd, int value)
{     int i;
     //init command transmission
     output_low(SCLK);
        output_low(CS);
     //write command
     for (i = CMD_MASK; i != 0; i = i >> 1)
     {    if (cmd & i) output_high(DIN);
        else output_low(DIN);
        SCLK_FLANK();
     }
     //write value
     for (i = DATA_MASK; i != 0; i = i >> 1)
     {    if (value & i) output_high(DIN);
        else output_low(DIN);
        SCLK_FLANK();
     }
    //end transmission
      output_high(CS);
}

void main (void)
{
   int i;
   Init();

   //output_high(OUTPIN);
  
    while(1) //just repeat a sawtooth signal
    {    for (i = 0; i <= 250; i++)
        {    command(3, i); //set channel 3=ch A,7=ch B, 11=ch C, 15=ch D
            delay_us(100);
        }
    }
}


то же самое - буквально через секунду всё сбивается.
это может быть из-за макетки?
help.gif
Карлсон
еще обнаружил, что синхронно с возникновением галиматьи сигнал с DOUT пропадает, т.е. цап перестает команды принимать, так что ли?
Alex255
Похоже что SPI глючит. Попробуй конденсаторы подобрать на цифровые входы...
Карлсон
проблема разрешилась.
всего-то нужно было CLR к +5 подтянуть.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.