|
|
  |
Atmega8 и TLC5615, Передача на ЦАП по SPI |
|
|
|
Oct 29 2009, 09:02
|
Группа: Участник
Сообщений: 8
Регистрация: 29-10-09
Пользователь №: 53 278

|
Здравствуйте. Помогите плз, пытаюсь связать мегу8 и цап по SPI, но на выходе с цапа ничего нет. На mosi почти сплошной высокий уровень, а SCK сплошной 0. Занимаюсь контроллерами недавно. Пишу в CODEVISION, проверяю в протеусе. ПОМОГИТЕ!!! Вот листинг программы: CODE #include <stdio.h>
#include <delay.h>
#include <spi.h>
#define ADC_VREF_TYPE 0x00
// Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; }
//bit SPIF;
float TOK(char x) { float temp; temp=read_adc(x); temp=(2.6-temp/250)/0.4; return(temp); } float NAPR(char x) { float temp; temp=(read_adc(x)*6)/250; return(temp); }
//void SPI_MasterTransmit(char cData) //{ // SPDR=cData; // while(!(SPSR&(1<<SPIF))) // ; //}
void wait(void) { TCNT1=0; while(TCNT1<7240){}; }
// Declare your global variables here
char pwm,i,Time,unTime,tempSPI=0x80; float U1,I1,P;
void main(void) { // Declare your local variables here
// Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T PORTB=0x00; DDRB=0x2C;
// Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00;
// 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=0x02;
// 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: 7,200 kHz // 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=0x05; TCNT1H=0x00; TCNT1L=0x00; TCNT1=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00;
// Timer/Counter 2 initialization // Clock source: System Clock // Clock value: 7,200 kHz // Mode: Fast PWM top=FFh // OC2 output: Non-Inverted PWM 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;
// USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: Off // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 19200 UCSRA=0x00; UCSRB=0x08; UCSRC=0x86; UBRRH=0x00; UBRRL=0x17;
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00;
// ADC initialization // ADC Clock frequency: 115,200 kHz // ADC Voltage Reference: AREF pin ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x86;
// SPI initialization // SPI Type: Master // SPI Clock Rate: 115,200 kHz // SPI Clock Phase: Cycle Half // SPI Clock Polarity: Low // SPI Data Order: MSB First SPCR=0x52; SPSR=0x00;
while (1) { // Place your code here I1=TOK(1); U1=NAPR(2); for(i=1;i<=10;i++) { if (I1<TOK(1)) { I1=TOK(1); } if (U1<NAPR(2)) { U1=NAPR(2); } } P=U1*I1; pwm=P*3.6; // SPI_MasterTransmit(U1); SPDR++; while(!(SPSR & tempSPI)); if (unTime>=2) { printf("%5d %10f %10f %10f\n\r",Time,I1,U1,P);\ unTime=0; } Time++; unTime++; I1=0; U1=0; wait(); }; }
Схема находится в прикрепленном файле. ЗАРАНЕЕ СПАСИБО!
Причина редактирования: Нарушение п.3.4 Правил форума.
Эскизы прикрепленных изображений
 РЈРСВВВВеньшено Р В Р’В Р СћРІР‚ВВВР С• 87%
1283 x 1442 (285.68 килобайт)
|
|
|
|
|
|
Nov 16 2009, 16:42
|
Группа: Участник
Сообщений: 8
Регистрация: 29-10-09
Пользователь №: 53 278

|
Уважаемый GM, я немного разобрался, спасибо, но проблема еще вот в чем: передача должна осуществляться посылкой двух байт, причем 10 информационным битам должны предшествовать 4 нулевых бита, а за информационной посылкой следовать два пустых бита.
ПОМОГИТЕ ПЛЗ!!!
Если можно накидайте варианты для СODE VISION.
P.s. И вопрос второй: можно ли шимом задавать амплитуду сигнала?
|
|
|
|
|
Nov 16 2009, 22:42
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(kapitaneo @ Nov 16 2009, 16:42)  немного разобрался, проблема еще вот в чем: передача должна осуществляться посылкой двух байт, причем 10 информационным битам должны предшествовать 4 нулевых бита, а за информационной посылкой следовать два пустых бита Да, так написано в ДШ, в этом вы разобрались. В чём у вас проблема? Цитата(kapitaneo @ Nov 16 2009, 16:42)  можно ли шимом задавать амплитуду сигнала? В общем случае можно, если я правильно понимаю. Цитата(kapitaneo @ Nov 16 2009, 16:42)  Если можно накидайте варианты для СODE VISION Да вы халявщик, батенька! Здесь не пишут за других, здесь разработчики просто помогают друг другу.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Nov 25 2009, 09:56
|
Группа: Участник
Сообщений: 8
Регистрация: 29-10-09
Пользователь №: 53 278

|
Передачу осуществляю так: ... void spi(char x) { unsigned int y; y=x<<2; spi(y); }
инициализация SPCR=0x59; (мастер, по спаду фазы, полярность высокая)
Не могу понять, что неправильно, режим передачи(инициализация) для конкретного(TLC5615) или с сама передача.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|