Страница 449 из 628

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Вт июн 25, 2013 00:20:27
oleg63m
Chettuser писал(а): для какого PIC Вам надо программатор?
Для пиков, как и для Авров, а так-же seeprom, я с успехом использую Экстрапикопреподобный программатор. Тоже, кстати упрощенный по максимуму(в плане стабилизаторов).
с его помощью сделал STK-500 HVPP HVSP-LP программатор. вот сегодня без проблем прошил Pic2550 для Pickit-2,
вчера шил пик16F876, тоже успешно (в одной и той же панельке :)) ). Так что никуда ходить не надо, надо просто включать мозговую косточку :beer:

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Вт июн 25, 2013 07:37:41
aam
Alexeyslav писал(а):Лучше изначально использовать UART если нужно более менее приличное расстояние передавать.
Но на Уарт много девайсов не навесишь. У меня их намечается штук 20 - придется тянуть 20 хвостов и каким-то образом запихивать их в комп. Шинная архитектура так и просится. Собственно, почему посмотрел на I2C - кто-то юзал его для похожих целей, но там, как я понял, соединение было с помощью шлейфов, т. е. вроде как в пределах блока. А у меня расстояние может быть до нескольких метров.
Можно конечно сгородить самопальный протокол, но не красиво ИМХО. Да и компу будет тяжело ножки порта дергать, если юзать тупо плату цифрового ввода-вывода - проц под 100%, а толку ноль.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Вт июн 25, 2013 09:03:27
oleg63m
aam
а если попробовать использовать приемо-передатчики а ля rs232, без преобразования протокола? до 30 метров по моему тянут

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Вт июн 25, 2013 09:09:41
SmarTrunk
RS-485 вроде как раз для этого, если не ошибаюсь. Там можно вешать много устройств, и существует какой-то протокол, мне неизвестный.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Вт июн 25, 2013 11:02:58
Jack_A
Один из известных мне -- Modbus. Проверен многократным использованием и длительным временем.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Вт июн 25, 2013 19:43:42
Alexeyslav
Современный UART в контроллерах умеет работать в 9-битном режиме, таким образом разделяя передачу адреса и данных. При этом нет таких жестких ограничений по линии связи как у I2C. Если все правильно организовать, получится ничуть не хуже. Только протокол будет сложнее.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Вт июн 25, 2013 20:28:40
zvukovik
не совсем по МК, у кого-нибудь есть опыт программирования мощных процессоров, которые стоят на одноплатниках и SOM? пробовал освоить варисайтовские модули, линукс туда задолбался зашивать и он так и не заработал нормально, поддержка помогать не хочет, реально ли запрограммировать эту штуку как большой МК без линуксов?

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Вт июн 25, 2013 23:05:44
Alexeyslav
Реально. Если у тебя в запасе несколько лет на изучение документации к нему и наработки приемов программирования под него...

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Ср июн 26, 2013 08:10:38
zvukovik
надо будет попробовать для эксперимента, а его можно в иаре через j-link отлаживать, (у него же есть в списке cortex-A8), или там как-то по другому всё делается?

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Ср июн 26, 2013 10:20:59
aam
SmarTrunk писал(а):RS-485 вроде как раз для этого, если не ошибаюсь.
Я как-то забыл про то, что 485 может как шина работать, т. е. на 1 провод можно несколько устройств сажать... :oops:
Думаю, самым правильным в таком случае будет взять в качестве физики RS485 и пустить по нему UART. Если честно, про логику 485 тоже ничего не помню, он, как я понял, сейчас в основном как электрический интерфейс воспринимается. А что по нему пустить - дело юзера - хоть ногами дергать :)

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт июн 28, 2013 15:49:11
FreshMan
прошу совета
имется код пищалки которая проигрывает элементарные мелодии
Спойлер

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define LED_ON PORTC|=(1<<0)
#define LED_OFF PORTC&=~(1<<0)


#define C1 15288
#define C1d 14431
#define D1 13621
#define D1d 12856
#define E1 12134
#define F1 11453
#define F1d 10811
#define G1 10204
#define G1d 9631
#define A1 9090
#define A1d 8580
#define H1 8099
#define C2 7648
#define C2d 7220
#define D2 6814
#define D2d 6430
#define E2 6069
#define F2 5730
#define G2 5102
#define G2d 4815
#define A2 4545
#define A2d 4291
#define H2 4049
#define C3 3822
#define P 0
#define End 1
#define N16 250.000
#define N8 500.000
#define N4 1000.000
#define N2 2000.000
#define N1 4000.000

int tanki[]={160.000,P,N16,C2,N16,D2,N16,D2d,N16,C2,N16,D2,N16,D2d,N16,D2d,N16,F2,N16,G2,N16,D2d,N16,F2,N16,G2,N16,
F2,N16,G2,N16,A2,N16,F2,N16,G2,N16,A2,N16,G2d,N16,A2d,N16,C3,N16,G2d,N16,A2d,N16,C3,N16,C3,N16,P,N16,C3,N16,C3,N16,C3,N16,C3,N16,End}; //мелодия танчиков

int mario[]= {100.000,P,N8,E2,N16,E2,N16,P,N16,E2,N8,P,N16,C2,N16,E2,N16,P,N16,
                G2,N16,P,N16,P,N8,G1,N16,P,N8,P,N8,
                C2,N16,P,N8,G1,N16,P,N8,E1,N8,P,N8,
                P,N16,A1,N16,P,N16,H1,N16,P,N16,A1d,N16,A1,N16,P,N16,
                G1,N16,E2,N16,G2,N16,A2,N16,P,N16,F2,N16,G2,N16,
                P,N16,E2,N16,P,N16,C2,N16,D2,N16,H1,N16,End};   //мелодия марио

int miniPolka[54]={120.000,P,N8,C2,N8,E2,N8,G2,N8,E2,N8,G2,N8,F2,N8,D2,N4,G2,N8,F2,N8,D2,N4,G2,N8,E2,N8,C2,N4,
                C2,N8,E2,N8,G2,N8,E2,N8,A2,N8,G2,N8,F2,N4,G2,N8,F2,N8,E2,N8,D2,N8,C2,N4,End};
int bumer[]={170.000,P,N8,E2,N8,G2,N4,P,N4,P,N4,
             G2,N8,E2,N4,P,N4,P,N4,
             A2,N8,G2,N8,A2,N8,G2,
             N8,A2,N8,G2,N8,A2,N8,G2,N8,A2,N8,H2,N4,P,N4,End};
int nokia[30]={120.000,P,N8,E2,N8,D2,N8,
               F1d,N4,G1d,N4,C2d,N8,H1,N8,
	       D1,N4,E1,N4,H1,N8,A1,N8,
	       C1d,N4,E1,N4,A1,N4,End};
int mortal[66]={140.000,A1,N8,A1,N8,C2,N8,A1,N8,D2,N8,A1,N8,E2,N8,D2,N8,
               C2,N8,C2,N8,E2,N8,C2,N8,G2,N8,C2,N8,E2,N8,C2,N8,
               G1,N8,G1,N8,H1,N8,G1,N8,C2,N8,G1,N8,D2,N8,C2,N8,
               F1,N8,F1,N8,A1,N8,F1,N8,C2,N8,F1,N8,C2,N8,H1,N8,End};

int *playlist[]={mortal,
                 nokia,
                 miniPolka,
                 bumer,
                 mario,
                 tanki
                 };


volatile int track=0;



volatile int NoteLong = 250;
volatile int loaded=0;
volatile int i = 1;

// прерывание таймера 1
//interrupt [TIM1_COMPA] void timer1_compa_isr(void)
ISR (TIMER1_COMPA_vect)
{
//  PORTD.0=!PORTD.0;
  //PORTC ^= 1;
	PORTC^=(1<<1);
}

volatile int Bit = 0x00;


void play()
{
         OCR1AH = (char)(Bit>>8); //записываем текущую ноту в OCR1A
         OCR1AL = (char)Bit;
         _delay_ms(NoteLong);
//         #asm("cli")              //запрещаем прерывание чтобы оборвать ноту
         cli();
         _delay_ms(40);
//         #asm("sei")
         sei();
         i=i+2;
}
void pause()
{
//         #asm("cli")        //пауза между нотами
	cli();
         _delay_ms(NoteLong);
//         #asm("sei")
         sei();
//         i=i+2;
         i+=2;
}


void stop()
{

//  #asm("cli")
	cli();
  Bit=0x00;
  //PORTC=0x00;
  PORTC&=~(1<<1);
  i=1;
  _delay_ms(200);

  if(track==5)     //если последний, то начать заново
  {
  loaded=1;
  track=0;
  LED_ON;
  _delay_ms(1000);
  LED_OFF;
  }
  else
  {
	    track++;

	    LED_ON;
	    _delay_ms(1000);
	    LED_OFF;

  }

}
void Loading_melody()
{
       i=1;
       while(playlist[track][i]!=1)
       {
       playlist[track][i+1]=playlist[track][i+1]/(playlist[track][0]/60.000);
       i++;
          if(playlist[track][i]!=1)
          {
          i++;
          }
       }
       i=1;
}

int main(void)
{

	PORTC=0x00;
	DDRC=0b000000011;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: CTC top=OCR1A
// 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: On
// Compare B Match Interrupt: Off
//TCCR1A=0x00;
TCCR1B=0x09;
//TCNT1H=0x00;
//TCNT1L=0x00;
//ICR1H=0x00;
//ICR1L=0x00;

//OCR1AH=0x00;
OCR1AL=0xFB;

//OCR1BH=0x00;
//OCR1BL=0x00;

TIMSK=0x10;

LED_ON;
_delay_ms(1000);
LED_OFF;

while (1)
      {

         if(loaded==0)
         {
         Loading_melody();  //пересчет длительности нот
         }

//         #asm("sei")
         sei();


         while(playlist[track][i]!=1)
         {
             Bit= playlist[track][i]; //массив с нотами
             NoteLong=playlist[track][i+1];
             if(Bit==0)
             {
               pause();
             }
             else
             {
              play();
             }
         }

         stop();
         //LED_ON;
      };

}
проблемма в том что проигрывается все время одна мелодия......, опытным путем удалось выяснить что это происходит из-за того что не происходит инкремент переменной track в этом месте
Спойлер

Код: Выделить всё

void stop()
{

//  #asm("cli")
   cli();
  Bit=0x00;
  //PORTC=0x00;
  PORTC&=~(1<<1);
  i=1;
  _delay_ms(200);

  if(track==5)     //если последний, то начать заново
  {
  loaded=1;
  track=0;
  LED_ON;
  _delay_ms(1000);
  LED_OFF;
  }
  else
  {
       track++;

       LED_ON;
       _delay_ms(1000);
       LED_OFF;

  }
все условия для этого выполнены....., в чем может быть проблемма ???
с оптимизацией игрался но не помогло......, подскажите пожалуйста.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт июн 28, 2013 22:31:18
vitalik_1984
Какая то мутная программа. Расплывчато выглядит формат хранения мелодии. Что-то играет, но похоже только до конца песни. Далее производится попытка чтения из области за пределами памяти программ, видать конец мелодии не может определить и проц перезагружается.
Мутно выглядит функция play() почему бы не вызвать ее с параметром вместо того, чтобы читать из глобальной переменной? Аналогично с функцией pause().
Еще непонятно что делает функция load_melody() тоже как то мутно делится сама ячейка и в нее же записывается.
К тому же вызов ее осуществляется похоже постоянно

Код: Выделить всё

  if(loaded==0)
         {
         Loading_melody();  //пересчет длительности нот
         }
 

по условию, которое не меняется нигде кроме как здесь

Код: Выделить всё

if(track==5)     //если последний, то начать заново
  {
  loaded=1;<<<---------- меняется только если track ==5!!!
  track=0;
  LED_ON;
  _delay_ms(1000);
  LED_OFF;
  }
  else
  {
       track++;

       LED_ON;
       _delay_ms(1000);
       LED_OFF;

  }  
То есть мелодия считается загруженной, только если track ==5?? :facepalm: ничего не пойму

Может придумать более удобный формат? MP3 например :))) шутка
Типа сделать тип нота

Код: Выделить всё

typedef struct 
    {   uint8_t Tone;
         uint8_t lenght;
    }sound_t;

typedef struct {
        uint8_t Lenght;
        sound_t melody[];
}melody_t;
 
В качестве конца мелодии можно использовать 0x00

Гонял гонял мелодии они не перелистываются просто потому что не происходит определения конца мелодии.
Разберись с этим отрезком:

Код: Выделить всё

while(playlist[track][i]!=1) <<<----Тут бесконечный цикл в реале выходит
         {
             Bit= playlist[track][i]; //массив с нотами
             NoteLong=playlist[track][i+1]; 

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Сб июн 29, 2013 09:01:21
FreshMan
вот первоисточник
http://avr-start.ru/?p=476
http://avr-start.ru/?p=730
там код написан под CV......, в этой среде я откомпилил и прошил МК......, все заработало......., но вот когда я попытался перенести код в Eclipse то тогда и началась вся та свистопляска о которой я упоминал выше.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Сб июн 29, 2013 15:08:29
FreshMan
после долгих мучений удалось решить проблемму проигрывания только одной мелодии….., спасибо товарищу Apparatchik……, дело оказалось в переполнении стека

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пн июл 01, 2013 13:25:33
Евгений33
Возвращаясь к вопросу о тактировании MEGA32 от КХО-97. При программировании по ISP от CHIP PROG -48, нет стабильности считывания данных от контроллера и его программирования (то ошибки, то читает), в момент программирования контроллера питание на кварцевый генератор не подается, тактирование идет от программатора. Если мы перерезаем дорожку соединяющую выход кварцевого генератора со входом XTAL1 все работает очень даже хорошо.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пн июл 01, 2013 13:27:38
Gudd-Head
Евгений33 писал(а):в момент программирования контроллера питание на кварцевый генератор не подается, тактирование идет от программатора
Эээ... А схемотехнически как это выглядит?

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пн июл 01, 2013 14:13:47
Евгений33
Программатор подключается через разъем и запитывает только контроллер (на схеме не показано), а вот генератор без питания, но его выход соединен с контроллером и если эту связь разорвать все начинает работать как надо.

Вроде так

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пн июл 01, 2013 14:25:25
Gudd-Head
И как КХО-97 переносит импульсы на своём выходе при отсутствии питания? Пипец, вы бы хоть резисторами развязали ваши тактовые источники.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пн июл 01, 2013 15:13:54
Евгений33
Gudd-Head, как я понимаю выход генератора шунтирует сигналы программатора или я ошибаюсь ?

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пн июл 01, 2013 15:47:01
vitalik_1984
Правильно понимаете, если в программаторе можно выставить частоту программирования, то можно отключить провод который идет к Xtal программатора. А можно просто поставить джампер на эту линию для программирования с тактированием от программатора.