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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
aam
Собутыльник Кота
Аватара пользователя
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Сообщение aam »

Ну понятно что I2C наружу напрямую не вытащить. Я имел ввиду подцепить к ней какой-то буфер (например, что-то типа RS-485), а уже к нему длинную шину. Только что буфер должен быть двунаправленный и "прозрачный" для I2C.
Вообще, смысл всего этого - минимальными усилиями подцепить к компу несколько блочков с AVRками. "Изобретать" интерфейсы путем дерганья ножек - ИМХО не круто...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20132
Зарегистрирован: Чт сен 01, 2011 12:53:27
Откуда: ТьмуТаракания. Почетный житель подмостовья

Сообщение oleg63m »

Mem писал(а):Спасибо за информацию, проверю.
Изображение

JMP1 в положении 1-2, питание внешнее не более 9 вольт, не подключая к к компьютеру, резистор 500 ом подключаем одним концом к источнику питания, вторым касаемся 3 вывода ХР1 замеряем 5 вольт на 1 ноге ХР3.
далее между выводом 1 и 2 ХР3 запаиваем резистор 20 кОм (его можно будет оставить), опять подаем на 3 ногу ХР1 питание, на 2й ноге ХР3 при этом должно изменяться напряжение (плавный подьем при снятии питания с 3 ноги хр1)
проверяем уровни напряжения на выводах 3, 4, 5 ХР3 подав соответственно на на 3, 4, 6 ноги ХР1. напруги должны быть не менее 4,8-5,5 в. Если все верно, подключаемся к компьютеру, запускаем TCOM и активировав TXD измеряем цепи, с ним связанные (1, 2, 3 ХР3)
если все соответствует уровням, закрываем Тсом, и запускаем Ponyprog.
выбираем нужный порт. кстати, если порт 1, винда часто его назначает как №2, надо смотреть в диспетчере устройств.
затем в понироге открываем setup/interfase setup com1(2) JDM API или Siprog API, siprog i/o почемуто не работает, нажимаем ок, снова входим в setup, делаем калибровку, выбираем в окошках программы нужную мелкосхему, вставляем онную в панельку и пытаемся считать. 6 и 7 ножка ХР1 обязательно замкнуть

да, на всяк случай, нужно зайти в свойства понипрога (правой кнопкой мыша) и указать совместимость с вин98
Вложения
Pprog.gif
(15.2 КБ) 851 скачивание
Шекспир сказал: Судить меня -дано лишь Богу, другим я укажу дорогу... https://natribu.org/
Я его полностью поддерживаю.
Программирую на Fuse AtmelAVR.
Контактная информация:
Реклама
Chettuser

Сообщение Chettuser »

Я пропустил - для какого PIC Вам надо программатор?
Вот я на другом форуме выкладывал для своего PIC18F2550, можно переделать умеючи под любой другой:
СпойлерИзображение
По ссылке можно почитать принцип работы и особенности.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

I2C прозрачно без сложных преобразований передать по другим интерфейсам не получится.
Лучше изначально использовать UART если нужно более менее приличное расстояние передавать. Либо... придется согласовать обе линии, несмотря на низкую скорость передачи у I2C шины жесткие требования к полосе пропускания линии связи. Собственно по этой причине и не используют на больших расстояниях.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 20132
Зарегистрирован: Чт сен 01, 2011 12:53:27
Откуда: ТьмуТаракания. Почетный житель подмостовья

Сообщение oleg63m »

Chettuser писал(а): для какого PIC Вам надо программатор?
Для пиков, как и для Авров, а так-же seeprom, я с успехом использую Экстрапикопреподобный программатор. Тоже, кстати упрощенный по максимуму(в плане стабилизаторов).
с его помощью сделал STK-500 HVPP HVSP-LP программатор. вот сегодня без проблем прошил Pic2550 для Pickit-2,
вчера шил пик16F876, тоже успешно (в одной и той же панельке :)) ). Так что никуда ходить не надо, надо просто включать мозговую косточку :beer:
Шекспир сказал: Судить меня -дано лишь Богу, другим я укажу дорогу... https://natribu.org/
Я его полностью поддерживаю.
Программирую на Fuse AtmelAVR.
Контактная информация:
Реклама
aam
Собутыльник Кота
Аватара пользователя
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Сообщение aam »

Alexeyslav писал(а):Лучше изначально использовать UART если нужно более менее приличное расстояние передавать.
Но на Уарт много девайсов не навесишь. У меня их намечается штук 20 - придется тянуть 20 хвостов и каким-то образом запихивать их в комп. Шинная архитектура так и просится. Собственно, почему посмотрел на I2C - кто-то юзал его для похожих целей, но там, как я понял, соединение было с помощью шлейфов, т. е. вроде как в пределах блока. А у меня расстояние может быть до нескольких метров.
Можно конечно сгородить самопальный протокол, но не красиво ИМХО. Да и компу будет тяжело ножки порта дергать, если юзать тупо плату цифрового ввода-вывода - проц под 100%, а толку ноль.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20132
Зарегистрирован: Чт сен 01, 2011 12:53:27
Откуда: ТьмуТаракания. Почетный житель подмостовья

Сообщение oleg63m »

aam
а если попробовать использовать приемо-передатчики а ля rs232, без преобразования протокола? до 30 метров по моему тянут
Шекспир сказал: Судить меня -дано лишь Богу, другим я укажу дорогу... https://natribu.org/
Я его полностью поддерживаю.
Программирую на Fuse AtmelAVR.
Контактная информация:
Друг Кота
Сообщения: 6014
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Откуда: Москва

Сообщение SmarTrunk »

RS-485 вроде как раз для этого, если не ошибаюсь. Там можно вешать много устройств, и существует какой-то протокол, мне неизвестный.
Друг Кота
Аватара пользователя
Сообщения: 6349
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Один из известных мне -- Modbus. Проверен многократным использованием и длительным временем.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Современный UART в контроллерах умеет работать в 9-битном режиме, таким образом разделяя передачу адреса и данных. При этом нет таких жестких ограничений по линии связи как у I2C. Если все правильно организовать, получится ничуть не хуже. Только протокол будет сложнее.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 140
Зарегистрирован: Вт авг 03, 2010 15:21:20
Откуда: Екатеринбург

Сообщение zvukovik »

не совсем по МК, у кого-нибудь есть опыт программирования мощных процессоров, которые стоят на одноплатниках и SOM? пробовал освоить варисайтовские модули, линукс туда задолбался зашивать и он так и не заработал нормально, поддержка помогать не хочет, реально ли запрограммировать эту штуку как большой МК без линуксов?
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Реально. Если у тебя в запасе несколько лет на изучение документации к нему и наработки приемов программирования под него...
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 140
Зарегистрирован: Вт авг 03, 2010 15:21:20
Откуда: Екатеринбург

Сообщение zvukovik »

надо будет попробовать для эксперимента, а его можно в иаре через j-link отлаживать, (у него же есть в списке cortex-A8), или там как-то по другому всё делается?
aam
Собутыльник Кота
Аватара пользователя
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Сообщение aam »

SmarTrunk писал(а):RS-485 вроде как раз для этого, если не ошибаюсь.
Я как-то забыл про то, что 485 может как шина работать, т. е. на 1 провод можно несколько устройств сажать... :oops:
Думаю, самым правильным в таком случае будет взять в качестве физики RS485 и пустить по нему UART. Если честно, про логику 485 тоже ничего не помню, он, как я понял, сейчас в основном как электрический интерфейс воспринимается. А что по нему пустить - дело юзера - хоть ногами дергать :)
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение 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;

  }
все условия для этого выполнены....., в чем может быть проблемма ???
с оптимизацией игрался но не помогло......, подскажите пожалуйста.
Tell Me The Truth
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение 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]; 
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

вот первоисточник
http://avr-start.ru/?p=476
http://avr-start.ru/?p=730
там код написан под CV......, в этой среде я откомпилил и прошил МК......, все заработало......., но вот когда я попытался перенести код в Eclipse то тогда и началась вся та свистопляска о которой я упоминал выше.
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

после долгих мучений удалось решить проблемму проигрывания только одной мелодии….., спасибо товарищу Apparatchik……, дело оказалось в переполнении стека
Tell Me The Truth
Встал на лапы
Аватара пользователя
Сообщения: 85
Зарегистрирован: Пн ноя 08, 2010 14:07:14
Откуда: Владимирская область

Сообщение Евгений33 »

Возвращаясь к вопросу о тактировании MEGA32 от КХО-97. При программировании по ISP от CHIP PROG -48, нет стабильности считывания данных от контроллера и его программирования (то ошибки, то читает), в момент программирования контроллера питание на кварцевый генератор не подается, тактирование идет от программатора. Если мы перерезаем дорожку соединяющую выход кварцевого генератора со входом XTAL1 все работает очень даже хорошо.
.....
Друг Кота
Аватара пользователя
Сообщения: 20127
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Евгений33 писал(а):в момент программирования контроллера питание на кварцевый генератор не подается, тактирование идет от программатора
Эээ... А схемотехнически как это выглядит?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ответить

Вернуться в «Разные вопросы по МК»