у меня есть четырехканальный цап 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)
{
};
}
#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;
отчего так?