Jump to content

    

nk@

Участник
  • Content Count

    77
  • Joined

  • Last visited

Everything posted by nk@


  1. Цитата(rx3apf @ Apr 12 2011, 12:59) Я не знаю, какие там неработающие порты _Вы_ имеете, но больше пока никто не жаловался. Вы занимаетесь натуральным сочинительством на ровном месте. Прошу прощения, за резкие слова, день, мля, тяжеловатый выдался По теме: Я выше писал про FIFO и параллельную обработку итд итп. Если правильно реализовать, то общего времени приема "пачки" данных + время паузы достаточно, для выпихивания всего блока на 115200. FIFO потребуется не менее размера одной "пачки". Если все реализовать тщательно, то должно получится. С SPI не получится, тк клок внешний, бит 22, а он байт-ориентированный. Было-б 24 бита - самае оно, но увы. По качеству портов. У меня есть проект, где через com в устройство нужно загрузить firmware порядка 3.5МБ. Там протокольчик дуплексный вопрос-ответ, не я делал. Так вот у меня, на 2-х компах (чипсет nVidia), это получается через раз. Причина - в этих самых 1-2% отличия скорости (кварц 4МГц). Когда идет обмен с паузами - все хорошо, а вот дуплекс на большом объеме им не под силу. Единственный комп, в котором стоит Intel-овская мама, работает без проблем. Вот такая вечная молодость.
  2. Цитата(rx3apf @ Apr 12 2011, 11:46) На 115200 - прекрасно, ошибка менее двух процентов. И на 230400 тоже. Вы возьмите и посчитайте. 115200 вполне достаточно, если правильно организовать обмен. Вы ветку сперва прочитайте, а потом уже высказывайтесь. Цитата(rx3apf @ Apr 12 2011, 11:46) Ой, ну да ладно страсти-то какие-то рассказывать, а ? Какие-такие "подстройки фазы" ? Вот благодаря таким знаниям, мы имеем неработающие com-порты.
  3. Цитата(rx3apf @ Apr 12 2011, 00:38) Как раз наоборот - ведь вывод одного набранного байта это всего лишь один out Это если у Вас скорость порта заведомо выше скорости поступления данных, но у нас как раз наоборот(1.25Mbit ! против даже 1Мbit c FT-232). Прийдется организовывать FIFO, и по прерываниям с UART забирать данные, либо полингом смотреть статус UART в основном цикле, а это несколько больше одного out Цитата(rx3apf @ Apr 12 2011, 00:38) Однако на 20 MHz, пожалуй, реально. Реально даже если входные пакеты идут без пауз, непрерывно. А вот уложиться в паузу 9 mS - трудновато. На 20 MHz отправить в UART нереально. Т.е. отправить реально, а принять без ошибок, на 115200 - не выйдет. Сейчас у мамок com-порты отвратительные, с подстройкой фазы все очень плохо (особенно "радуют" мамки на nForce - чуть в сторону и приехали). Потери - гарантированы. Нужно либо кварц типа 14.7456 или 18.432, либо паять FT-232 и на нестандартной скорости шпарить через "виртуальный com port". И все-же советую tiny (например 2313) и заюзать TWI. Я уже так делал - нужно было принимать последовательности по 28 бит. Почему не использовать аппаратный сдвиговый регистр? Код найти постараюсь сегодня вечером, по крайней мере, метода проверена PS: Я уже решал подобную задачу, и тут прийдется сильно поэкономить тактики
  4. Цитата(stells @ Apr 11 2011, 22:07) 16 тактов на прием одного бита - сомнительно, на грани фола +1 вот-вот + время на укладку байтов в FIFO. Да еще и в UART надо запхнуть. Время между пачками скока? 1.28*7 = 8.96 милисек. Вам, чтоб выпхнуть 37 слов на скорости 115200 потребуется 37*(22/8)*1000/(115200/10) = 9.63 милисека. Нужно параллельно с приемом данных, отправлять в UART. Без прерываний параллельную отпраку не сделать нормально. С прерываниями - софтверный прием обосрётся. Выводы неутешительны. Хотя можно подвесить FTDI-232 и запулить на 1Mbit. Вижу 3 варианта - 1. Внешний сдвиговый регистр, лучче CPLD, как посоветовал kovigor + UART на повышенной скорости. 2. Берите ARM 3. Cлабая надежда есть, на нестандартное использование модуля TWI - кмк, единственный шанс реализовать на AVR, без внешних схем. PS: 3-й вариант возможен тока на TWI tinyAVR. Еслиб было 24 бита - можно было-бы использовать SPI, но это не наш случай. PPS: Щас еще раз глянул даташиты - на tiny должно получиться c TWI. На mega TWI шибко умный, ничего не выйдет.
  5. Насчет кондерчиков по питанию, т.н. decoupling capacitors, у производителей микросхем всегда есть рекомендации. Читайте даташиты, там всегда есть требования на каком расстоянии от вывода микросхемы, и какую емкость нужно установить. Насчет развязок аналоговых и цифровых питаний рекомендуется почитать Application Notes (AN) и посмотреть Reference design плат. Это чтоб не гадать на кофейной гуще Я это к тому говорю, что многое уже давно придумано до/для нас
  6. Цитата(ukpyr @ Apr 11 2011, 12:19) после DC-DC - любой LDO с малым падением Я бы не советовал использовать линейные стабилизаторы, из-за низкого КПД. Речь ведь идет о батарейном питании, каждый микроампер*час сберечь надо Импульсничек - самый подходящий вариант. Кстати, в хороших светодиодных фонариках - именно такой подход. Цитататок не больше 100мА.. При таких условиях выбор будет достаточно большим. Выбирайте сами, исходя из удобства применения. Например MAX756 (просто в столе валялся): Operates Down to 0.7V Input Supply Voltage, 87% Efficiency at 200mA, 60μA Quiescent Current Набираете в google слова "DC-DC step-up converter 5V 100mA" и выбираете то, что больше подходит.
  7. Цитата(SysRq @ Apr 11 2011, 12:15) Использовав память неопределенного размера Быть может, в задании вашем от вас хотят всего лишь new[]\delete[] для, к примеру, массива, с задаваемым с клавиатуры числом элементов, а вы городите что-то такое-эдакое... -- Ага, фрагментация, двукратное потребление памяти, и непрогнозируемые задержки на копированое данных. Идеально для стека, да Я нигде не говорил, что это идеальное решение. Стек, в виде связанного стека - это, по Вашему, экономный расход памяти
  8. Цитата(Станис @ Apr 11 2011, 10:47) А что тогда можно применить чтоб было стабильно +5В? например от пары батареек на 1,2В... Любой, подходящий по мощности, step-up импульсный стабилизатор. Их существует некоторое множество. Какой ток потребления нужен? Вот, например: http://www.national.com/pf/LM/LM2621.html#Overview
  9. Цитата(sergeeff @ Apr 10 2011, 22:23) А на кой в стеке realloc? Нужно выделить память под хранение данных стека. Первый раз понятно - malloc(). Далее надо добавить в стек данных, для чего нужно увеличить "вместилище" стека. Как - realloc() подходит идеально. А без realloc() - связаный список указателей. Что-нить типа CODEstatic int *stack_mem = NULL; static unsigned int stack_pointer = 0; int* stack_push(int data) { stack_mem=(int* )realloc(stack_mem, (stack_pointer+1)*sizeof(int)); if(stack_mem==NULL) return NULL; //out of mem stack_mem[stack_pointer++] = data; return (stack_mem + stack_pointer - 1); } int* stack_pop(int* data) { if(stack_pointer) { *data = stack_mem[--stack_pointer]; return (stack_mem + stack_pointer); } return NULL; //no data in stack } PS: Код есс-но надо доработать, я его за 10 сек "на коленке" набросал, чтоб идею пояснить
  10. Странное поведение ATTINY44A

    Цитата(defunct @ Apr 11 2011, 01:12) Вывод немного другой. Вот такой: ваш "environment" был свободен от помех и с лично вашим программатором вроде бы проблем нет. Не буду этого отрицать Плохо, что топикстартер молчит, как рыба об лёд. Гадаем на кофейной (чайной) гуще И все-же никто не отписался о подобной проблеме, значит она не носит массовый характер. Интересно, где-же все-таки собака порылась?
  11. Цитата(sergeeff @ Apr 10 2011, 17:34) Вовсе не обязательно! Намек понятен, тока realloc() не во всех реализациях stdlib имеется. Надо-бы топикстартеру платформу и ОС уточнить
  12. Цитата(XVR @ Apr 10 2011, 18:29) Как найдете - напишите в Xilinx. Они не в курсе, что в их FPGA есть внутренний генератор Парень, кмк, имел ввиду PLL
  13. ATTINY10

    Мда, как ловко тема с tiny10 сползла на m16. Флуд абсолютно бессмысленный пошел. У топикстартера ни слова не было про светодиоды, а вы уже китайские гирлянды развесили Предлагаю обсудить новый интерфейс для программирования - TPI. У меня AVRISPmkII "заапгрейдился" студией и теперь умеет программить tiny4/5/9/10. Может кто-нибудь просветИт нас насчет поддержки этих чипов другими, самодельными программаторами? Это будет по теме.
  14. Странное поведение ATTINY44A

    Меня зацепило и я провел маленький эксперимент. Из стола извлечена плата, над которой производятся отладочные издевательства. Плата с mega16, импульсным стабилизатором 12V->5V, LCD1602, всякая мелочевка... Через TWI подключена QTouch клавиатурка. Все запитано 5V. Контроллер получает питание через ферритовый фильтрик, который отпаян, и вместо него включен тестер. Т.о. мы меряем потребления только контроллера. Чип на этой плате перешивался, думаю не меньше 1000 раз - тк на этой плате отлаживался достаточно большой проект, да еще и не один Ладно, пусть будет 500. Программатор - честный ATAVRISPmkII. Взял одинн из старых проектов, достаточно увесистый (использовано 82% flash). После инициализации всего железа, в цикле ожидания нажатия клавиши, (при нажатии генерится INT0) вставлен такой код CODE DDRA = 0; All ports - input DDRB = 0; DDRC = 0; DDRD = 0; SFIOR |= 1<<PUD; //disable pull-ups set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sei(); sleep_cpu(); sleep_disable(); Теперь результаты: При переходе в слип - ток потребления оказался порядка 30mкA! WTF? Оказалось, ток кушал программатор, при его отключении, ток сразу стал 0,9-1mkA Может у топикстартера такая-же проблема? Достал из коробки старенький ByteBlasterII - самопальный, LPT. Сделал 50 перепрошивок с помощью avrdude, с полным стиранием. Результат не удивил 0,9-1mkA. Вывод - деградация от количества перепрограммирований не обнаружена. PS: Еще нюанс замечен. При поднесении руки к плате ток начинает расти до 1.2 - 1.3 мкА - очевидно, сказываются наводки на "висящие в воздухе" ноги.
  15. Странное поведение ATTINY44A

    Цитата(defunct @ Apr 10 2011, 09:31) Пока причина не найдена - ни один вариант нельзя отбрасывать, каким бы нереальным он не казался. Т.е. Вы предполагаете, имеет место деградация чипов из-за количества перепрограммирования некачественным программатором? Но как это возможно? В чем физика процесса? Все-же, кмк, проблема в чем-то другом.
  16. Цитата(ClipArt @ Apr 10 2011, 09:16) После программирования (вернее даже после заливки hex!) МК стал недоступен. Подключал внешний тактовый генератор, помогло, МК определился. Пробовал ставить заводские настройки, но после отключения генератора все остается по-старому. Почему так происходит? У Вас фьюзы cksel3 - cksel0 = 0, что означает внешний тактовый генератор. Естественно, без генератора чип не будет виден программатору. Правильно выберите источник тактовых сигналов и все у Вас получится PS: У Вас внешний кварц, подойдет значение 0b1111, те поставьте все галочки cksel0..cksel3
  17. Странное поведение ATTINY44A

    Уж что-что, а программатор тут точно не виноват. Платы от флюса отмыли? У меня была давно проблема, еще в советские времена - заказали мы с нашего завода на другом партию плат с метализацией. О защитном покрытии (зеленке) тогда мы слышали, но ни разу не видели Так вот, в этих платах местами соседние дорожки "звонились", как-будто между ними резистор впаян. Мы их и мыли, и процарапывали - нифига не помогло. Такой себе недиэлектрический диэлектрик Пришлось выбросить. И еще одна история, правда не моя лично. У нас работал товарисч, разрабатывал какие-то усилители на полевиках. Так вот, книфоль оказалась проводником, пока не отмыли тщательно оцетоном, не заработало. Я к тому, что если вы за микроамперы боретесь, то тут все мелочи надо учесть.
  18. 1.Проверьте сперва цифровым вольтметром напряжения на ножках контроллера, чтоб убедиться, что аналоговая часть работает корректно. 2. Попробуйте сэмплировать каждый канал по 3-4 раза, может результаты такого теста дадут доп. информацию к размышлениям. 3. Я бы попробовал вставить задержку после переключения канала и началом сэмплирования. И "поигрался" с ней, наблюдая результат. Например, так: CODE//set ADC channel ADMUX=(ADMUX&0xF0)|adc_ch; //delay _delay_us(100); //Start conversionio with Interupt after conversion ADCSRA |= (1<<ADSC)|(1<<ADIE); PS: Лично я с такой проблемкой не сталкивался, правда я ни разу не использовал мультиплексор, мне нужен был только один канал.
  19. Странное поведение ATTINY44A

    Цитата(rx3apf @ Apr 8 2011, 21:40) Я вот в чудеса не верю... +1 Чудес не бывает. Может индеец Зоркий Глаз не замечает отсутствия 4-й стены? Внимательно посмотрите на свой проект. Када-то ток у Вас течет, и это, скорее всего, не ядро AVR. Советую пойти таким путем: 1. Отключите все внешние цепи. Если это помогло, то найдите порт через которой "утекает" ток. Если нет утечки, то 2. Проверьте PULL-UP на портах включен или нет? Ну, не бывает чудес, чесслово
  20. atMega16

    Раз уж пошли разоблачения, то вставлю свои 3 копейки. Преподаватели, которые дали это задание, Вы читаете наш форум? Отзовитесь! Если нет, то вы безнадежно отстали от жизни. Грош вам цена. Немедленно на пенсию. Уже достали ваши выпускники с красными(!) дипломами, которые не могут даже месячный испытательный срок выдержать. Похоже система образования, которая в прежние времена была одной из лучших в мире, погибла (рухнула, сдохла). Обидно. Радует то, что остались еще жаждущие знаний молодые люди, которые самостоятельно грызут орешек знаний. Жаль, что современный университетский планктон ничего им дать не может. Сорри, за оффтоп.
  21. ATTINY10

    Цитата(defunct @ Apr 8 2011, 03:03) Приношу извинения, я его спутал с tiny11. Там (и в tiny10 и в tiny13) есть таймер с OCRA и OCRB т.е. вполне реально сделать 3 канала и даже больше каналов на Си с высокой точностью и без особого напряга для проца - методом сортировки событий программируя OCRA / OCRB поочередно на следующий event. В одной из тем такой способ уже приводил. Вы даташит хоть посмотрите. Корпус SOT23-6 = всего 6 ног, из которых -2 земля+питание = остается 4. Одна для однопроводного управления = в сухом остатке 3 ножки. Вопрос: как Вы сможете сделать больше 3-х каналов PWM? Даже для 3-х каналов прийдется "отрубить" reset, что пртводит к трудностям, о которых я уже писАл.
  22. Проблема с UART

    Прошу прощения за неоригинальность, но AVRLIB от Pascal Stang включает в себя замечательную библиотечку для работы с UART, причем с FIFO, поддержкой прерываний итд Имеется также реализация VT100 и даже command-line интерфейса с редактированием, автокомплишеном. Зачем сушить себе мозги и изобретать колесо - берите готовое и радуйтесь. http://www.mil.ufl.edu/~chrisarnold/compon...ard/AVR/avrlib/
  23. Внутрисхемная отладка

    Цитата(Икрянников @ Apr 8 2011, 00:39) Здравствуйте. есть ли у кого-нибудь информация по поводу Debug Ware, точнее - любительской его разработки. А то облазил весь инет, уже прям отчаянье берет - полная тишина. Есть JTAG, но он меня не устроит, работаю с тинами. Ну, и вообще кто что может посоветовать интересного по поводу отладки. AVR Dragon поможет, как бюджетный вариант. Я долго пользовался, пока не попробовал 5 студию, которая его убила, после купил себе ATJTAGICEmkII. Да, 450$, но он того стоит. Если Вы серьезно собираетесь заниматься разработкой (не хобби ) рекомендую раскошелиться на фирменный JTAGICEmkII - съэкономите потом на таблетках от нервов , это я Вам по своему опыту заявляю.
  24. бегущая строка

    Цитата(aaarrr @ Apr 7 2011, 22:54) Мультиплексирование какое используется - неужели 1/72? +1 Если так, то при таком duty cycle Вам потребуется ставить ключи и поднимать питание вольт до 12, то не совсем безопасно для диодов. Схемку дайте в студию, разберемся...
  25. Цитата(Graf83 @ Apr 6 2011, 12:17) переменная типа int или char, интерфейс lpt (cetronics) пишу на си чип atmega162 Вот Вам готовый код, выкусил из старого проекта (печатался протокол измерений, работает у людей до сих пор ). Собиралось на меге16, компилятор GCC (WinAVR). Хотите под CV - портируйте. Особенности: -использует аппаратные прерывания для сигналов BUSY и ACK. -циклический буфер (FIFO) Не забудьте линию SELECT_IN подключить к 0, и линию AUTO_FEED к питанию (лог 1) Рекомендую подключить линии принтера через резисторы 50-100 ом. Если линии прерывания заняты под другие цели, то можно и без них обойтись - уберите #define USE_INTERRUPTS и в каком - либо цикле или в таймере запускайте периодически LPT_BSR() Печатать можно (как Вы уже заметили в main()) обычным printf() все, что пожелаете Или используйте LPT_putc() напрямую, если нужно. CODE#include <avr/io.h> #include <string.h> #include <stdio.h> #include <util/delay.h> #include <stdlib.h> #include <avr/interrupt.h> #define USE_INTERRUPTS #define DATA_PORT PORTC // DO..D7 принтера #define DATA_DDR DDRC #define STATE_PORT PORTD // линии управления принтера #define STATE_PIN PIND #define STATE_DDR DDRD #define BUSY_PIN 2 //INT0 #define ACK_PIN 3 //INT1 #define PAPER_OUT_PIN 4 #define ERROR_PIN 5 #define INIT_PIN 6 #define STROBE_PIN 7 #ifndef BUFFER_SIZE #define BUFFER_SIZE 32 #endif #define BUFFER_MASK ( BUFFER_SIZE - 1) #if ( BUFFER_SIZE & BUFFER_MASK ) #error Buffer size is not a power of 2 #endif volatile uint8_t Buf[BUFFER_SIZE]; volatile uint8_t Head; volatile uint8_t Tail; volatile uint8_t printer_state = 0; void LPT_init(void) { DATA_DDR = 0xFF; STATE_PORT |= (1<<INIT_PIN) | (1<<STROBE_PIN); STATE_DDR |= (1<<INIT_PIN) | (1<<STROBE_PIN); //Output pins STATE_DDR &= ~((1<<BUSY_PIN) | (1<<ACK_PIN) | (1<<PAPER_OUT_PIN) | (1<<ERROR_PIN)); //Input pins Head = 0; Tail = 0; #ifdef USE_INTERRUPTS MCUCR = (1<<ISC01) | (1<ISC11); //interrupts on falling edge GICR |= (1<<INT0) | (1<<INT1); sei(); #endif } void init_printer(void) { STATE_PORT &= ~(1<<INIT_PIN); _delay_us(5); STATE_PORT &= ~(1<<INIT_PIN); _delay_us(100); } uint8_t LPT_state(void) { uint8_t state = 0; if(STATE_PIN & (1<<BUSY_PIN)) state |= 1; //Printer busy if(STATE_PIN & (1<<PAPER_OUT_PIN)) state |= 2; //Paper out if(!(STATE_PIN & (1<<ERROR_PIN))) state |= 4; //Internal printer error return state; } uint8_t LPT_transmit(void) { uint8_t tmp; if(Head == Tail) return 0; //Buffer empty, nothing to send printer_state = LPT_state(); if(printer_state) return printer_state; // printer not redy tmp = (Tail + 1) & BUFFER_MASK; // calculate and store new buffer index Tail = tmp; DATA_PORT = Buf[tmp]; // get one byte from buffer and write it to out port // do STROBE pulse _delay_us(1); STATE_PORT &= ~(1<<STROBE_PIN); _delay_us(1); STATE_PORT |= (1<<STROBE_PIN); _delay_us(1); return 0; //succes } void LPT_BSR(void) { do { printer_state = LPT_transmit(); } while((printer_state==0)&&(Head!=Tail)); //try transmission } #ifdef USE_INTERRUPTS ISR(INT0_vect) { //Busy signal go down, wakeup LPT_BSR(); } ISR(INT1_vect) { //ACK signal arrived LPT_BSR(); } #endif void LPT_putc(unsigned char data) { uint8_t tmp; tmp = (Head + 1) & BUFFER_MASK; while ( tmp == Tail ){ ;// wait for free space in buffer } Buf[tmp] = data; Head = tmp; LPT_BSR(); } static int lpt_putchar(char c, FILE *stream) { if (c == '\n') LPT_putc('\r'); // insert CR before LF LPT_putc(с); return 0; } FILE lptf = FDEV_SETUP_STREAM(lpt_putchar, NULL, _FDEV_SETUP_WRITE); int main( void ) { int test_value = 315; LPT_init(); // driver init init_printer(); // необязательно _delay_ms(1000); // для некоторых старых принтеров может потребоваться задержка после сброса и больше (2-3 секунды), если что, подправьте stdout = &lptf; // назначаем STDOUT на принтер printf("Hello printer!\n"); printf("Value = %d\n", test_value); return 0; } PS: Если чео неясно - спрашивайте.