Страница 1 из 3
Помогите переделать исходник в CVAVR. не пойму половины..
Добавлено: Сб апр 02, 2011 23:40:29
Artos
Здравствуйте уважаемые Коты

Помогите мне пожалуйста либо переделать код в CVAVR либо помочь с разьяснением...
Половины не пойму.. Я только начинающий программист и работаю пока только в одном компиляторе.
Код: Выделить всё
#include <iotiny2313.h>
#include <inavr.h>
#define bit(n) (1<<n)
#define Set(m,n) (m|=bit(n))
#define Clr(m,n) (m&=~bit(n))
#define b_CDATA 4 // PB4
#define b_CCLK 7 // PB7
#define b_LATCH 5 // PB5
#define SetCDATA Set(PORTB,b_CDATA)
#define ClrCDATA Clr(PORTB,b_CDATA)
#define SetLATCH Set(PORTB,b_LATCH)
#define ClrLATCH Clr(PORTB,b_LATCH)
#define SetCCLK Set(PORTB,b_CCLK)
#define ClrCCLK Clr(PORTB,b_CCLK)
#define CCLK {SetCCLK;ClrCCLK;}
#define b_Mute 0 // PA0
#define b_Reset 1 // PA1
#define SetMute Set(PORTA,b_Mute)
#define ClrMute Clr(PORTA,b_Mute)
#define SetReset Clr(PORTA,b_Reset)
#define ClrReset Set(PORTA,b_Reset)
#define Mask1 0x7f
#define Mask2 0x0f
unsigned int Old=0;
void SPI(unsigned int Data)
{ unsigned int mask=0x8000;
char i;
for (i=0;i<16;i++)
{
if (Data & mask) SetCDATA;
else ClrCDATA;
CCLK;
mask>>=1;
}
ClrCDATA;
}
void out(unsigned int Data)
{unsigned int t=0;
if (Data & bit(8)) Set(t,12); // Data Format PCM / External DF
if (Data & bit(9)) Set(t,10); // Output Format 0
if (Data & bit(10)) Set(t,11); // Output Format 1
if (Data & bit(11)) Set(t,8); // PCM Sample Rate 0
if (Data & bit(12)) Set(t,9); // PCM Sample Rate 1
if (Data & bit(13)) Set(t,4); // PCM/EF Serial Data Format 0
if (Data & bit(14)) Set(t,5); // PCM/EF Serial Data Format 1
if (Data & bit(2)) Set(t,2); // PCM/EF Serial Data Width 0
if (Data & bit(3)) Set(t,3); // PCM/EF Serial Data Width 1
ClrLATCH;
SPI(t);
SetLATCH;
t=1;
if (Data & bit(0)) Set(t,9); // MCLK Mode 0
if (Data & bit(1)) Set(t,10); // MCLK Mode 1
ClrLATCH;
SPI(t);
SetLATCH;
}
void main( void )
{ unsigned int t;
unsigned char x,y;
PORTD=0xff;
PORTB=0x7c;
PORTA=3;
DDRB=0xb0;
DDRD=0;
DDRA=3;
SetReset;
for(t=0;t<10000;t++);
ClrReset;
for(t=0;t<10000;t++);
// for(;;)
// {
SetMute;
x=PIND;
y=PINB;
t=((Mask1 & x)<<8) + (Mask2 & y);
out(t);
ClrMute;
// for(x=0;x<20;x++);
// }
MCUCR|=bit(SM0);
__sleep();
}
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Вс апр 03, 2011 09:35:33
svd71
1. стоило 20 топиков создавать?
2. Переделать подо что? под микропаскаль?
3. что конкретно не понятно?
4. Если ты решил и дальше в кодевижен колупаться, то
Гугль рулит.
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Вс апр 03, 2011 13:26:59
Artos
Здравствуйте, вчера при создании темы. Глекнул толи форум толи компьютер... по этому куча тем.. Удалите пожалуйста те лишние.
Мне надо код этот адаптировать под Code Vision.
Так как Win AVR и AVR studio я не понимаю...=( У них синтаксис отличается...
Либо помогите прокомментировать этот исходник, что да как делает..
Книга по Code Vision уже есть, спасибо за ссылки=)
Мне в этом исходнике много чего не понятно, например где условие обработки джамперов переключения режимов?
В Code Vision все просто.
Код: Выделить всё
if (PINB.0==0){
PORTB.1=1;
} else {
PORTB.1=0;
}
// или так :
#define RESET_ACT PINB.0
if (RESET_ACT==0){
PORTB.1=1;
} else{
PORTB.1=0;
}
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Вс апр 03, 2011 14:41:17
pyzhman
2Artos: в программном деле проще новую программу написать, нежели старую перелопачивать. Вы бы написали, что вам надо, вам бы, может быть, и помогли. Или написали вам. Походу вам курсовой писать со связью по SPI... Если так, то вы не первый.
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Вс апр 03, 2011 15:01:50
Artos
> Походу вам курсовой писать со связью по SPI... Если так, то вы не первый.
Нет , Вы ошибаетесь..
Я хочу написать программу для конфигуратора ЦАП ( Более усовершенствованную в плане управления. Добавить Авто сканирование цифрового входа у меня есть уже алгоритм для этой реализации ), но я никогда не работал с SPI, и I2C... Работал с LCD именно вывод значений при каком нибудь событии и т.д., с периферией I/O , но более сложные кода я плохо понимаю... Я только несколько месяцев как начал изучать программирование МК AVR.
Только учусь программированию, а пример кода есть только вот такой. Этот код, это конфигуратор ЦАП AD1955 У меня ЦАПа собрана на этой микросхеме, уже второй год слушаю, но хочу переделать МК управление, добавить функционал..
Я думаю не сложно перевести команды под другой компилятор, всетаки язык Си.
Если бы я лучше понимал язык Си то с легкостью переделал бы код

Или даже написал бы в этом компиляторе.
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Вс апр 03, 2011 15:03:49
Artos
> в программном деле проще новую программу написать
Я это знаю, но это справедливо при условии хорошего понимания алгоритма для выполнения нужной задачи.
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Вс апр 03, 2011 15:10:04
Artos
Вот например сваять какой нибудь код, для автоматического управления и коммутации, например: промышленные автоматические насосы, всяки импульсные счетчики с применением Индикаторов LED , где нет этих протоколов I2C, SPI, 1WIRE и т.д. могу сделать, но вот эти протоколы меня путают.....
И книгу уже читал, и вроди понимаю как работает, но как это программно реализовать х.з.=(
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Пн апр 04, 2011 12:32:16
svd71
а эту кто писал? раз SPI работает на B, значит джамперы повешены на D. чтение регистра здесь x=PIND. Примечательно другое: выполнив один цикл в main(), контроллер засыпает и просыпается только по ресету. Например в WinAvr и AVRStudio после выполнения main() автоматически добавляется бесконичный цикл, едакая защита он дурака. как в CV, не знаю, но наверное тоже что то преусмотрели.
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Пн апр 04, 2011 12:49:32
adrenocrome
А в каких местах кодвижн ругается?
Чую, что вот всю эту кучку дефайнов в начале он не переваривает.
А код по сути то примитивен.
Самое простое - это заменить в теле программы все конструкции из дефайнов
Код: Выделить всё
#define bit(n) (1<<n)
#define Set(m,n) (m|=bit(n))
#define SetCDATA Set(PORTB,b_CDATA)
на что-то типа
Ну я бы так сделал для начала. А потом уже и красоту можно наводить.
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Пн апр 04, 2011 21:02:23
Artos
Здравствуйте!
Закинул код в компилятор.
Выскочило 19 ошибок
и 3 ворнинга
Сейчас попробую подмарафетить
ошибка №1
unsigned int Old=0;
2) void SPI(unsigned int Data)
3) if (Data & mask) SetCDATA;
4) void out(unsigned int Data)
потом тут куча ошибок
if (Data & bit(8)) Set(t,12); // Data Format PCM / External DF
if (Data & bit(9)) Set(t,10); // Output Format 0
if (Data & bit(10)) Set(t,11); // Output Format 1
if (Data & bit(11)) Set(t,8); // PCM Sample Rate 0
if (Data & bit(12)) Set(t,9); // PCM Sample Rate 1
if (Data & bit(13)) Set(t,4); // PCM/EF Serial Data Format 0
if (Data & bit(14)) Set(t,5); // PCM/EF Serial Data Format 1
if (Data & bit(2)) Set(t,2); // PCM/EF Serial Data Width 0
if (Data & bit(3)) Set(t,3); // PCM/EF Serial Data Width 1
и последняя __sleep();
Вы более, опытные в программировании , помогите мне.
Я конечно сейчас что смогу подправлю...
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Пн апр 04, 2011 21:04:22
Artos
#define bit(n) (1<<n)
#define Set(m,n) (m|=bit(n))
#define Clr(m,n) (m&=~bit(n))
#define b_CDATA 4 // PB4
#define b_CCLK 7 // PB7
#define b_LATCH 5 // PB5
#define SetCDATA Set(PORTB,b_CDATA)
#define ClrCDATA Clr(PORTB,b_CDATA)
#define SetLATCH Set(PORTB,b_LATCH)
#define ClrLATCH Clr(PORTB,b_LATCH)
#define SetCCLK Set(PORTB,b_CCLK)
#define ClrCCLK Clr(PORTB,b_CCLK)
#define CCLK {SetCCLK;ClrCCLK;}
#define b_Mute 0 // PA0
#define b_Reset 1 // PA1
#define SetMute Set(PORTA,b_Mute)
#define ClrMute Clr(PORTA,b_Mute)
#define SetReset Clr(PORTA,b_Reset)
#define ClrReset Set(PORTA,b_Reset)
На эти дефайны вроди не ругается но кажется мне что не так в CVAVR должно быть...
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Пн апр 04, 2011 21:10:20
Artos
> а эту кто писал? раз SPI работает на B
Писал очень хороший человек с вегалаба, Алексей зовут.
Там он и выкладывал исходник.
Но это не такой код как у меня в ЦАПе в контроллере зашитый, я просто хочу понять как инициализировать SPI как отправить данные при включении устройства, чтоб ЦАП сконфигурировался, ну а меню я потом создам какое захочу, у меня сама трудность в SPI ...
это для этой ЦАПы, вот ссылка:
http://www.analog.com/static/imported-f ... AD1955.pdf
PS Звучит я Вам скажу очень хорошо.Я такого звука еще не слышал ни от одной внешней звуковой карты!
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Пн апр 04, 2011 23:10:15
Artos
> едакая защита он дурака.
Защита от чего? Ему так как раз и надо, это устройство встраивается в сидюк..
у этого устройства задача всю жизнь спать

Единственное что он должен сделать это при включении питания резетнуть ЦАП собой, и залить по SPI (в зависимости от того как выставлены джамперы) конфигурацию ЦАПы 16битный код. И потом спать...
Кстати как отправить по SPI 16бит код?
нужно что то типа два раза по 8бит швырнуть?
0b01010101;
0b11110010;
Как разобраться в полярности SPI? какие данные сначало выплевывать от LSB к MSB? или на оборот? я не нашел в даташите на AD1955 этой информации...
Может плохо смотрю... а по графикам я не понимаю... =((
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Пн апр 04, 2011 23:13:23
Artos
> раз SPI работает на B, значит джамперы повешены на D.
Разжуйте мне дураку комментами где что выполняется... Вам же чего это стоит? 5 минут времени..
Я знаю от туда, что сейчас не сложный код создаю за 5-15 минут. Чего раньше не сделал бы и за час...
мне главное знать.
например:
если на пине таком то "0" {
выполнить такое действие (я так понимаю здесь должен SPI отправлять код в ЦАП)
}
Вот я сегодня написал кусок чуваку в мопед, иммитация ментовской сирены
Код: Выделить всё
to_hell:
delay_ms(150);
while (1)
{
// Place your code here
//1.2.3.4
if (PINB.3==0){
PORTB.1=0;
PORTB.2=0;
if(PINB.3==0){
flags++;
delay_ms(300);
if (flags==2){flags=0;}
while (PINB.3==0);
}}
if(flags==1){
for (x=0;x<2;x++){
if(flags==0){
goto to_hell;
}
PORTB.1=1;
delay_ms(500);
if (PINB.3==0){
PORTB.1=0;
PORTB.2=0;
if(PINB.3==0){
flags=0;
while (PINB.3==0);
}}
PORTB.1=0;
delay_ms(500);
if (PINB.3==0){
PORTB.1=0;
PORTB.2=0;
if(PINB.3==0){
flags=0;
while (PINB.3==0);
}}
if(flags==0){
goto to_hell;
}
}
for (y=0;y<2;y++){
PORTB.2=1;
delay_ms(500);
if(flags==0){
goto to_hell;
}
if (PINB.3==0){
PORTB.1=0;
PORTB.2=0;
if(PINB.3==0){
flags=0;
while (PINB.3==0);
}}
if(flags==0){
goto to_hell;
}
PORTB.2=0;
delay_ms(500);
if (PINB.3==0){
PORTB.1=0;
PORTB.2=0;
if(PINB.3==0){
flags=0;
while (PINB.3==0);
}}
if(flags==0){
goto to_hell;
}
}}
};
}
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Пн апр 04, 2011 23:30:21
Artos
Я понимаю что тут происходит отправка данных в зависимости как сконфигурированы джамперы, но не более того....
Я плохо знаю Си (несколько месяцев работаю в CVAVR . Раньше не имел представления как работает программа, и с цифрой не дружил вовсе..), и когда мне встречаются не знакомые слова и команды я сразу путаюсь....
Код: Выделить всё
void out(unsigned int Data)
{unsigned int t=0;
if (Data & bit(8)) Set(t,12); // Data Format PCM / External DF
if (Data & bit(9)) Set(t,10); // Output Format 0
if (Data & bit(10)) Set(t,11); // Output Format 1
if (Data & bit(11)) Set(t,8); // PCM Sample Rate 0
if (Data & bit(12)) Set(t,9); // PCM Sample Rate 1
if (Data & bit(13)) Set(t,4); // PCM/EF Serial Data Format 0
if (Data & bit(14)) Set(t,5); // PCM/EF Serial Data Format 1
if (Data & bit(2)) Set(t,2); // PCM/EF Serial Data Width 0
if (Data & bit(3)) Set(t,3); // PCM/EF Serial Data Width 1
ClrLATCH;
SPI(t);
SetLATCH;
t=1;
if (Data & bit(0)) Set(t,9); // MCLK Mode 0
if (Data & bit(1)) Set(t,10); // MCLK Mode 1
ClrLATCH;
SPI(t);
SetLATCH;
}
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Вт апр 05, 2011 08:17:05
adrenocrome
Заменил как я советовал?
Слова там вовсе даже не незнакомые. Стандартных нет таких команд, это макросы, которые в дефайнах определены.
Вот в этой строчке например проверяется равенство еденице 8-го бита в переменной data. Если это так, то в переменной t устанавливаем единицу в бит 12
Код: Выделить всё
if (Data & bit(8)) Set(t,12); // Data Format PCM / External DF
Потому как в начале определены макросы
Код: Выделить всё
#define bit(n) (1<<n)
#define Set(m,n) (m|=bit(n))
Соответственно можно написать как-то так. По крайней мере не ругается кодвижн.
Код: Выделить всё
if (Data & (1<<8)) t|=1<<12; // Data Format PCM / External DF
И ошибки лучше картинкой выкладывай.
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Вт апр 05, 2011 11:59:15
Artos
Здравствуйте! Спасибо Вам огромное за помощь

Я сегодня попробую переделать код потом отпишусь.
> Заменил как я советовал?
Заголовочные файлы заменил, остальное нет..
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Чт апр 07, 2011 23:12:05
Artos
Доброй ночи уважаемые!
Вот выкладываю фото ошибок. Не получается переделать так как Вы советовали, выдает ошибку...
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Чт апр 07, 2011 23:14:17
Artos
Ругается на Data..
где его обьявить?
после главной функции?
как int ?
или глобально обьявить?
Re: Помогите переделать исходник в CVAVR. не пойму половины.
Добавлено: Пт апр 08, 2011 11:08:29
adrenocrome
Вот, лови в прицепе.
Вроде бы все макросы кодвижн проглотил.
Но что делать с командой "sleep" я в душе не знаю -)