реклама на сайте
подробности

 
 
> ЦАП max509
Карлсон
сообщение Feb 12 2007, 22:24
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 29-09-06
Из: Москва
Пользователь №: 20 800



Здравствуйте, уважаемые.

у меня есть четырехканальный цап 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;
отчего так?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
Карлсон
сообщение Feb 14 2007, 00:03
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 29-09-06
Из: Москва
Пользователь №: 20 800



попробовал такой вариант кода:

Код
#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
Go to the top of the page
 
+Quote Post
Карлсон
сообщение Feb 14 2007, 00:43
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 29-09-06
Из: Москва
Пользователь №: 20 800



еще обнаружил, что синхронно с возникновением галиматьи сигнал с DOUT пропадает, т.е. цап перестает команды принимать, так что ли?
Go to the top of the page
 
+Quote Post
Alex255
сообщение Feb 14 2007, 09:12
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 450
Регистрация: 21-12-06
Пользователь №: 23 757



Похоже что SPI глючит. Попробуй конденсаторы подобрать на цифровые входы...
Go to the top of the page
 
+Quote Post
Карлсон
сообщение Feb 15 2007, 18:23
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 29-09-06
Из: Москва
Пользователь №: 20 800



проблема разрешилась.
всего-то нужно было CLR к +5 подтянуть.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01408 секунд с 7
ELECTRONIX ©2004-2016