Вообще, смысл всего этого - минимальными усилиями подцепить к компу несколько блочков с AVRками. "Изобретать" интерфейсы путем дерганья ножек - ИМХО не круто...
Мелкие вопросы по МК и ПЛИС.
Ну понятно что I2C наружу напрямую не вытащить. Я имел ввиду подцепить к ней какой-то буфер (например, что-то типа RS-485), а уже к нему длинную шину. Только что буфер должен быть двунаправленный и "прозрачный" для I2C.
Вообще, смысл всего этого - минимальными усилиями подцепить к компу несколько блочков с AVRками. "Изобретать" интерфейсы путем дерганья ножек - ИМХО не круто...
Вообще, смысл всего этого - минимальными усилиями подцепить к компу несколько блочков с AVRками. "Изобретать" интерфейсы путем дерганья ножек - ИМХО не круто...
- Реклама
- Сообщения: 20132
- Зарегистрирован: Чт сен 01, 2011 12:53:27
- Откуда: ТьмуТаракания. Почетный житель подмостовья
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.
Я его полностью поддерживаю.
Программирую на Fuse AtmelAVR.
Я пропустил - для какого PIC Вам надо программатор?
Вот я на другом форуме выкладывал для своего PIC18F2550, можно переделать умеючи под любой другой:
По ссылке можно почитать принцип работы и особенности.
Вот я на другом форуме выкладывал для своего PIC18F2550, можно переделать умеючи под любой другой:
Спойлер
I2C прозрачно без сложных преобразований передать по другим интерфейсам не получится.
Лучше изначально использовать UART если нужно более менее приличное расстояние передавать. Либо... придется согласовать обе линии, несмотря на низкую скорость передачи у I2C шины жесткие требования к полосе пропускания линии связи. Собственно по этой причине и не используют на больших расстояниях.
Лучше изначально использовать UART если нужно более менее приличное расстояние передавать. Либо... придется согласовать обе линии, несмотря на низкую скорость передачи у I2C шины жесткие требования к полосе пропускания линии связи. Собственно по этой причине и не используют на больших расстояниях.
- Сообщения: 20132
- Зарегистрирован: Чт сен 01, 2011 12:53:27
- Откуда: ТьмуТаракания. Почетный житель подмостовья
Для пиков, как и для Авров, а так-же seeprom, я с успехом использую Экстрапикопреподобный программатор. Тоже, кстати упрощенный по максимуму(в плане стабилизаторов).Chettuser писал(а): для какого PIC Вам надо программатор?
с его помощью сделал STK-500 HVPP HVSP-LP программатор. вот сегодня без проблем прошил Pic2550 для Pickit-2,
вчера шил пик16F876, тоже успешно (в одной и той же панельке
Шекспир сказал: Судить меня -дано лишь Богу, другим я укажу дорогу... https://natribu.org/
Я его полностью поддерживаю.
Программирую на Fuse AtmelAVR.
Я его полностью поддерживаю.
Программирую на Fuse AtmelAVR.
- Реклама
Но на Уарт много девайсов не навесишь. У меня их намечается штук 20 - придется тянуть 20 хвостов и каким-то образом запихивать их в комп. Шинная архитектура так и просится. Собственно, почему посмотрел на I2C - кто-то юзал его для похожих целей, но там, как я понял, соединение было с помощью шлейфов, т. е. вроде как в пределах блока. А у меня расстояние может быть до нескольких метров.Alexeyslav писал(а):Лучше изначально использовать UART если нужно более менее приличное расстояние передавать.
Можно конечно сгородить самопальный протокол, но не красиво ИМХО. Да и компу будет тяжело ножки порта дергать, если юзать тупо плату цифрового ввода-вывода - проц под 100%, а толку ноль.
- Сообщения: 20132
- Зарегистрирован: Чт сен 01, 2011 12:53:27
- Откуда: ТьмуТаракания. Почетный житель подмостовья
aam
а если попробовать использовать приемо-передатчики а ля rs232, без преобразования протокола? до 30 метров по моему тянут
а если попробовать использовать приемо-передатчики а ля rs232, без преобразования протокола? до 30 метров по моему тянут
Шекспир сказал: Судить меня -дано лишь Богу, другим я укажу дорогу... https://natribu.org/
Я его полностью поддерживаю.
Программирую на Fuse AtmelAVR.
Я его полностью поддерживаю.
Программирую на Fuse AtmelAVR.
RS-485 вроде как раз для этого, если не ошибаюсь. Там можно вешать много устройств, и существует какой-то протокол, мне неизвестный.
Один из известных мне -- Modbus. Проверен многократным использованием и длительным временем.
Современный UART в контроллерах умеет работать в 9-битном режиме, таким образом разделяя передачу адреса и данных. При этом нет таких жестких ограничений по линии связи как у I2C. Если все правильно организовать, получится ничуть не хуже. Только протокол будет сложнее.
не совсем по МК, у кого-нибудь есть опыт программирования мощных процессоров, которые стоят на одноплатниках и SOM? пробовал освоить варисайтовские модули, линукс туда задолбался зашивать и он так и не заработал нормально, поддержка помогать не хочет, реально ли запрограммировать эту штуку как большой МК без линуксов?
Реально. Если у тебя в запасе несколько лет на изучение документации к нему и наработки приемов программирования под него...
надо будет попробовать для эксперимента, а его можно в иаре через j-link отлаживать, (у него же есть в списке cortex-A8), или там как-то по другому всё делается?
Я как-то забыл про то, что 485 может как шина работать, т. е. на 1 провод можно несколько устройств сажать...SmarTrunk писал(а):RS-485 вроде как раз для этого, если не ошибаюсь.
Думаю, самым правильным в таком случае будет взять в качестве физики RS485 и пустить по нему UART. Если честно, про логику 485 тоже ничего не помню, он, как я понял, сейчас в основном как электрический интерфейс воспринимается. А что по нему пустить - дело юзера - хоть ногами дергать
прошу совета
имется код пищалки которая проигрывает элементарные мелодии
проблемма в том что проигрывается все время одна мелодия......, опытным путем удалось выяснить что это происходит из-за того что не происходит инкремент переменной track в этом месте
все условия для этого выполнены....., в чем может быть проблемма ???
с оптимизацией игрался но не помогло......, подскажите пожалуйста.
имется код пищалки которая проигрывает элементарные мелодии
Спойлер
Код: Выделить всё
#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;
};
}
Спойлер
Код: Выделить всё
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
Какая то мутная программа. Расплывчато выглядит формат хранения мелодии. Что-то играет, но похоже только до конца песни. Далее производится попытка чтения из области за пределами памяти программ, видать конец мелодии не может определить и проц перезагружается.
Мутно выглядит функция play() почему бы не вызвать ее с параметром вместо того, чтобы читать из глобальной переменной? Аналогично с функцией pause().
Еще непонятно что делает функция load_melody() тоже как то мутно делится сама ячейка и в нее же записывается.
К тому же вызов ее осуществляется похоже постоянно
по условию, которое не меняется нигде кроме как здесьТо есть мелодия считается загруженной, только если track ==5??
ничего не пойму
Может придумать более удобный формат? MP3 например
шутка
Типа сделать тип нота
В качестве конца мелодии можно использовать 0x00
Гонял гонял мелодии они не перелистываются просто потому что не происходит определения конца мелодии.
Разберись с этим отрезком:
Мутно выглядит функция 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;
} Может придумать более удобный формат? MP3 например
Типа сделать тип нота
Код: Выделить всё
typedef struct
{ uint8_t Tone;
uint8_t lenght;
}sound_t;
typedef struct {
uint8_t Lenght;
sound_t melody[];
}melody_t;
Гонял гонял мелодии они не перелистываются просто потому что не происходит определения конца мелодии.
Разберись с этим отрезком:
Код: Выделить всё
while(playlist[track][i]!=1) <<<----Тут бесконечный цикл в реале выходит
{
Bit= playlist[track][i]; //массив с нотами
NoteLong=playlist[track][i+1]; вот первоисточник
http://avr-start.ru/?p=476
http://avr-start.ru/?p=730
там код написан под CV......, в этой среде я откомпилил и прошил МК......, все заработало......., но вот когда я попытался перенести код в Eclipse то тогда и началась вся та свистопляска о которой я упоминал выше.
http://avr-start.ru/?p=476
http://avr-start.ru/?p=730
там код написан под CV......, в этой среде я откомпилил и прошил МК......, все заработало......., но вот когда я попытался перенести код в Eclipse то тогда и началась вся та свистопляска о которой я упоминал выше.
Tell Me The Truth
после долгих мучений удалось решить проблемму проигрывания только одной мелодии….., спасибо товарищу Apparatchik……, дело оказалось в переполнении стека
Tell Me The Truth
Возвращаясь к вопросу о тактировании MEGA32 от КХО-97. При программировании по ISP от CHIP PROG -48, нет стабильности считывания данных от контроллера и его программирования (то ошибки, то читает), в момент программирования контроллера питание на кварцевый генератор не подается, тактирование идет от программатора. Если мы перерезаем дорожку соединяющую выход кварцевого генератора со входом XTAL1 все работает очень даже хорошо.
.....
Эээ... А схемотехнически как это выглядит?Евгений33 писал(а):в момент программирования контроллера питание на кварцевый генератор не подается, тактирование идет от программатора
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]


