COKPOWEHEU Опубликовано 15 сентября, 2015 Поделиться Опубликовано 15 сентября, 2015 Двоичную систему, я так предполагаю, лучше использовать для наглядности в случае со светодиодами?!Всегда стоит использовать систему, подходящую по смыслу. Для задания частоты десятичную, для посылки некоторых констант скажем по UART удобнее шестнадцатеричная, а для игр с отдельными битами двоичная. Также и у вас: запись PORTA==0xC0 эквивалентна записи PORTA==0b11000000, но вторая явно показывает, что это не "волшебное число", а просто нас интересуют два старших бита.PORTA = (1<<7)// это компилятор берет виртуальную единицу сдвигает на 7 и полученное записывает в portA, а откуда он ее берет и где хранит на период сдвига?Да и в моем случае огонек из двух светодиодов... Ну, именно при работе с битовыми масками, в том числе сдвиг константы на константу, расчет ведет не контроллер, а препроцессор компилятора, то есть для контроллера записи PORTA = (0b11 << 6) , PORTA = 0b11000000 и PORTA = 0xC0 и даже ldi r16,0xC0 out PORTA,r16 одинаковы. А вообще, даже в линуксе, где нехватка нулей вынудила создать целое устройство по их генерации /dev/zero, в единицах недостатка нет, используйте смело.Да, сдвигать можно не только единицу, но любое число (хотя сдвигать ноль бесполезно). Тоже не понятно как вынести после блока if'ов, тоесть создать переменную с данной задержкой и ее применять? Грубо говоря так while(1){ if(...){ ... } _delay_ms(200); //эта задержка выполняется независимо от ветвления } Я читал PC это регистр – указатель адреса, или это не то? я еще не совсем конечно разобрался с битовой маской (кажется так называется).Регистры это PORTx, PINx, DDRx (где x - номер порта, A,B,..). На самом деле это вообще адреса соответствующих регистров, но при программировании на Си их можно считать переменными. А вот PC0, PA2, PB4 это константы, номера выводов внутри порта, и запись (1<<PC1) не отличается от записей (1<<PB1) или просто (1<<1).Начинал изучать контроллеры на 51 камне с асемблером, вроде ))) понимаю о чем речь.Я с контроллерами кроме avr8 дела не имел, но знаю, что у всех контроллеров разная внутренняя архитектура. Например, в AVR целых 32 регистра общего назначения, работа с любой памятью лишь опциональна (то есть туда можно только писать и читать, но нельзя хотя бы складывать РОН+ОЗУ), зато сколько бы ее ни было, адресация ОЗУ линейна, никакого переключения банков. А в PIC регистр общего назначения, он же аккумулятор, всего один, зато почти все операции идут через память. Но сама она разбита на банки, которые иногда надо переключать.я еще не совсем конечно разобрался с битовой маской (кажется так называется).Да, битовая маска. Можно глянуть в википедии или поискать битовые операции. Может это поможет. 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
Владимир Андрущенко Опубликовано 15 сентября, 2015 Поделиться Опубликовано 15 сентября, 2015 попробуйте протеус переустановить. вообще странно, у меня проблем с этой либой и моделью не было. в бесконечный цикл запишите несколько нопов, чтоб контроллер не зависал. или светодиодом моргайте. Добавил мигание портом Д. Порт Д мигает, а изображения нет. Код: //атмега8А #define F_CPU 8000000 #include <avr/io.h> #include "n5110.h" #include <util/delay.h> void presets () { Lcd_init(); Lcd_clear(); _delay_ms (20); Lcd_prints(0, 0, FONT_1X, (unsigned char *) PSTR ("Hello!")); Lcd_prints(3, 9, FONT_1X, (unsigned char *) PSTR ("Привiт!")); _delay_ms (20); Lcd_update(); } int main (void) { presets(); while (1) { PORTD = 0xff; _delay_ms (200); PORTD = 0x00; _delay_ms (200); } } Протеус еще не переустанавливал. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Viktor26 Опубликовано 15 сентября, 2015 Поделиться Опубликовано 15 сентября, 2015 очучение что что-то, где-то не успевает, а первые 20 мск не пробывали переносить чтоб они перед очисткой стояли а не после, т.е. после инициализации. на сайте есть моя статья по таймерам, там во вложениях есть код часов, у меня на столе и в протеусе работает, попробуйте его. http://cxem.net/mc/mc388.php 0 Не знаеш как? Спроси у Google'а !!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Особенности хранения литиевых аккумуляторов и батареекПотеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Egormak Опубликовано 16 сентября, 2015 Поделиться Опубликовано 16 сентября, 2015 Здравствуйте, у меня вопрос касательно 7-го урока. Почему на дисплее вместо 600 у меня 200 ? Файлы прилагаются. Урок7.zip 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Секреты депассивации литиевых батареек FANSO EVE EnergyСамыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Viktor26 Опубликовано 16 сентября, 2015 Поделиться Опубликовано 16 сентября, 2015 Посмотрите сообщение #1512 0 Не знаеш как? Спроси у Google'а !!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Владимир Андрущенко Опубликовано 20 сентября, 2015 Поделиться Опубликовано 20 сентября, 2015 (изменено) очучение что что-то, где-то не успевает, а первые 20 мск не пробывали переносить чтоб они перед очисткой стояли а не после, т.е. после инициализации. на сайте есть моя статья по таймерам, там во вложениях есть код часов, у меня на столе и в протеусе работает, попробуйте его. http://cxem.net/mc/mc388.php Спасибо, с твоим таймером тоже чистій екран. Протеус использую єтот: Кто-то тестил єтот релиз на проекте 5110? Работает? Спасибо. Изменено 31 октября, 2015 пользователем admin Бан за варезные ссылки 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Viktor26 Опубликовано 20 сентября, 2015 Поделиться Опубликовано 20 сентября, 2015 тут большинство работают с версией 7.10 0 Не знаеш как? Спроси у Google'а !!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Владимир Андрущенко Опубликовано 19 октября, 2015 Поделиться Опубликовано 19 октября, 2015 Неудобен тот момент, что не ясно в каком видеоуроке о чём говорится. Видеоуроки не подписані. Я раньше все бегло просмотрел, и вот сейчас, спустя пару месяцев опять всё нужно перелопачивать что б синхронизироваться. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Viktor26 Опубликовано 20 октября, 2015 Поделиться Опубликовано 20 октября, 2015 легче синхронизироваться с даташитом или Евстифеевым 0 Не знаеш как? Спроси у Google'а !!! Ссылка на комментарий Поделиться на другие сайты Поделиться
zet2 Опубликовано 27 октября, 2015 Поделиться Опубликовано 27 октября, 2015 Здравствуйте у меня возникла проблема, я написал программу для шагового двигателя а она нормально работать не хочет. Суть проблемы вот в чем. При нажатии кнопки(подача логической единицы на портБ1) шаговый двигатель должен сделать один шаг, а он вместо этого делает много шагов(при постоянно нажатой кнопке) помогите. программа и модель в протеусе прелагается. Вопрос.rar 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 27 октября, 2015 Поделиться Опубликовано 27 октября, 2015 Совершенно непонятна проблема Если надо сделать один шаг, так и сделайте, чтобы шагал только 1 раз, а не постоянно бежал. Как вообще так можно, чтобы много раз шагнул - получилось сделать, а чтобы всего один раз - нет ? Странно ... ЗЫ: И ещё. Каким боком Ваш вопрос относится к данной теме ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Владимир Андрущенко Опубликовано 30 октября, 2015 Поделиться Опубликовано 30 октября, 2015 Почему никто не "лайкает" топик на Фейсбуке? Разве тема того не достойна? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
anarki2600 Опубликовано 2 ноября, 2015 Поделиться Опубликовано 2 ноября, 2015 (изменено) Доброго всем дня! Только начинаю изучать данную тему и застрял на 2-ом уроке, не хочет работать отладчик (AtmelStudio 7.0) выдает ошибку [ERROR] Failed to launch. Error code 89710015 , и во вкладке I/O не светятся bits напротив DDRB, PORTB, гугл не помогает, может кто из знающих подскажет что не так..программу символ в символ написал, как в уроке ps. Обновление intel graphics driver не помогло Изменено 2 ноября, 2015 пользователем anarki2600 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Viktor26 Опубликовано 2 ноября, 2015 Поделиться Опубликовано 2 ноября, 2015 на панеле инструментов найдите молоточек, кликните по нему, откроется вкладка, в выпадающем меню выберете Simulyator 0 Не знаеш как? Спроси у Google'а !!! Ссылка на комментарий Поделиться на другие сайты Поделиться
anarki2600 Опубликовано 2 ноября, 2015 Поделиться Опубликовано 2 ноября, 2015 (изменено) на панеле инструментов найдите молоточек, кликните по нему, откроется вкладка, в выпадающем меню выберете Simulyator симулятор естественно был выбран, делал все, как в уроке, выдает эту ошибку и все тут...в 6-ой студии все работает, а седьмая не хочет. Может проблема с компом? Стоит win 8.1, core i7 3630qm, 8Гб оперативы В us-нете нашел такую проблему, советуют в AVR/GNU C Compiler<Debugging<Debugging Level поставить Default(-g2) - не знаю что это за настройка, но и она не помогла Изменено 2 ноября, 2015 пользователем anarki2600 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
968se Опубликовано 2 ноября, 2015 Поделиться Опубликовано 2 ноября, 2015 Здравствуйте! У меня вопрос по поводу совместимости версий Proteus 8.3 и 7.10. По началу уроков я установил себе новую версию программы. Всё работало замечательно до того момента, как стал выводить графику на дисплей. Точки, текст выводит замечательно версия 8.3. Начал рисовать силуэт термометра, получилось это: Картинка бегает, как будто разрешение дисплея не 48х84, а 4х20] Кстати, дисплей, прилагаемый к урокам, в этой версии не показывает ничего (просто светится). Поставил версию 7.10 - заработало, как надо. Силуэт появился: В железе собирать еще не пробовал. Кто знает? Почему этот глюк имеет место? Данная модель дисплея не понимает корректно команды по графике? 0 За отечественную технику! Ссылка на комментарий Поделиться на другие сайты Поделиться
Demon47 Опубликовано 5 ноября, 2015 Поделиться Опубликовано 5 ноября, 2015 Всем привет! Для Atmega 16 по аналогии с вашим видео откорректировал файлик n5110.h и все заработало. А к 128-ой покдлючить не получается, в протеусе все ок, а в реале нет... Возможно это связано с тем, что у 128 атмеги при последовательном программировании выводы MOSI и MISO не РВ2 и РВ3, а РЕ0 и РЕ1, не подскажите как быть? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
radiomaster88 Опубликовано 6 ноября, 2015 Поделиться Опубликовано 6 ноября, 2015 Всем привет, собрал схему! Работает! Но на вольтах бегает последняя цифра. Проблему снял на видео.Вот код //atmega8 #define F_CPU 8000000 #include <avr/io.h> #include "n5110.h" #include <stdlib.h> #include <util/delay.h> #include <avr/interrupt.h> ISR(INT0_vect){ } void inter_init(){ GICR |= (1<<INT0);//Разрешаем прерывание на инт0 MCUCR |= (1<<ISC00) | (1<<ISC01);//Сработает по нарастающему фронту } void nastroika(){ Lcd_init();//инициализация экрана Lcd_clear();//очищаем экран Lcd_update();//отправляем команду для очистки экрана //Настройки АЦП //ADSCRA Настройка частоты работы ацп ADCSRA |= (1<<ADEN)//Задействовать АЦП | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Делитель 128 это 64клц ADMUX |= (1<<REFS1) | (1<<REFS0); //Опорное напряжение 2.56 } /*******************Функция для выбора опроса лапок**********************/ int readADC(unsigned int lapka){ unsigned char vibor_admux = ADMUX; vibor_admux &= ~((1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0));//Обнуляем для выбора лапки ADC0 switch(lapka) { case 1: vibor_admux |= ((0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0));break; default:break; } ADMUX = vibor_admux; _delay_us(10);//Задержка чтоб точно записалось. /********************Выводим среднее арифметическое**********************/ int tmp = 0; for (int i=0;i<20;i++) { ADCSRA |= (1<<ADSC);//Запуск преобразования while ((ADCSRA)&1<<ADSC);//Закончить цыкл пока не будет 0. Преобр. заверш. tmp += ADCW; } return tmp/20; } int main(void) { nastroika(); while(1){ Lcd_clear(); Lcd_prints(1,1,FONT_1X,(unsigned char*)PSTR("VOLT:=")); Lcd_printf(9,1,FONT_1X,(readADC(0)*0.02935),1); Lcd_prints(1,3,FONT_1X,(unsigned char*)PSTR("AMPER:=")); Lcd_printf(9,3,FONT_1X,((readADC(2)*2.56*(3/2.56))/1023),1); Lcd_update(); } } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 6 ноября, 2015 Поделиться Опубликовано 6 ноября, 2015 Это нормально. Точности АЦП (и внешней схемы) недостаточно, чтобы реализовать полностью разрешающаю способность АЦП, все 10 разрядов. Помеха на на аналоговом входе превышает 2.5 мВ. Возможно, она вызвана внутренними шумами кристалла. Чтобы ее уменьшить можно снизить разрешающую способность, использовать цифровые фильтры (у вас уже реализован один из вариантов, но его, кажется, недостаточно), режимы сна и т.п. Но полностью избавиться от этого эффекта линейными средствами не получится. Если вас не пугает неточность в пару младших разрядов, не обязательно отображаемых, можно ввести гистерезис. Замечания по коду: for (int i=0;i<20;i++){...tmp += ADCW;} ... return tmp/20; Выбор именно 20 точек выглядит странным, удобнее 16 или 32, хотя скорости наверняка хватит и на 64, что все равно влезает в uint16_t.Использование деления вместо сдвига (в случае круглого числа точек) - плохая идея: медленно и громоздко. Смысл самого усреднения не до конца ясен: что мешает передавать на выход сразу 16-битное число, помня, что оно не от 0 до 1023, а от 0 до 65535. Точность повысится. Lcd_printf(9,3,FONT_1X,((readADC(2)*2.56*(3/2.56))/1023),1); Использование чисел с плавающей точкой - плохая идея. Использование всей этой математики непосредственно в коде - тоже. Посчитали бы в числах с фиксированной точкой - даже 32 бита будет быстрее, чем это. Если реализовывать вашу формулу в лоб (откуда она берется я не знаю, выглядит подозрительно, но не мне ей пользоваться)res = X*2.56*(3 / 2.56) / 1023. Переменная X - число с АЦП, это для простоты записи и наглядности. Если послушаетесь совета и сделаете 64 отсчета без усреднения, то есть диапазон числа от 0 до 65535. res = X*2.56*(3 / 2.56) / 65536 (не 65535 потому что так делить будет проще, а разница невелика, всего 1.5Е-5) res = 3*X / 65536. Я так понял, вы хотите получить 1 знак после запятой. Тогда для числа с фиксированной точкой домножаем наше поедставление на 10. Множитель для любого другого положения точки найти не проблема. res = 30*X / 65536. Число 30 можно представить как (32-2), то есть как разность круглых чисел:32 = (1<<5) ; 2 = (1<<1). А делитель 1/65536 = (1>>16) res = ((X<<5) - (X<<1))>>16. Проводим деление res = (X>>11) - (X>>15). Суммарное число влезает только в 3 байта (16 бит на аргумент и 11 на сдвиг). Попробуем уменьшить аргументы, предварительно сдвинув их на 8. res = ((X>>8)>>3) - ((X>>8)>>7). Число (X>>8) соответствует старшему байту двухбайтного числа, запишем его как XH res = (XH>>3) - (XH>>7). В принципе этот код уже выполняется достаточно быстро, но можно еще немного оптимизировать, если учесть, что (XH>>7) это всего лишь старший бит. res = (XH>>3) - (XH>>3)>>4 lsr XH ;оператор сдвига на 1 вправо, без переноса lsr XH lsr XH sbrc XH,4 ;если бит 4 сброшен, пропускаем следующую инструкцию dec XH ; в противном случае уменьшаем переменную на 1, ведь бит не может быть больше 1 Таким образом, код вместо сотни тактов и байт занимает всего 5. 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
radiomaster88 Опубликовано 6 ноября, 2015 Поделиться Опубликовано 6 ноября, 2015 Спасибо за совет, теперь буду изучать как можно оптимизировать по вашему примеру. Опыта мало пока. Спасибо. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
alekcandr78 Опубликовано 8 ноября, 2015 Поделиться Опубликовано 8 ноября, 2015 из темы 6 урока не получаються арифметические выражения на уножение и сложение Lcd_printf(0,0,FONT_1X,f_data*2,4);//= -0.2706 Lcd_printf(0,1,FONT_1X,f_data+2,4);//= -1.4121 Lcd_printf(0,2,FONT_1X,f_data/2,4);//= 1.5707 Lcd_printf(0,3,FONT_1X,f_data-2,4);//= 1.1415 подскажите что неправильно в первых двух выражениях 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 8 ноября, 2015 Поделиться Опубликовано 8 ноября, 2015 Вообще, числа с плавающей точкой пишутся именно с точкой, а не с запятой. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 8 ноября, 2015 Поделиться Опубликовано 8 ноября, 2015 2 это целое число, а 4 - положение точки при выводе на дисплей, насколько я понял. Иначе бы не собралось. Поведение кода очень странное. Пробежались бы в отладчике, где именно оно начинает чудить. 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 8 ноября, 2015 Поделиться Опубликовано 8 ноября, 2015 Хм, а я и не подумал почему то 2,4 сразу в глаза бросилось. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Viktor26 Опубликовано 8 ноября, 2015 Поделиться Опубликовано 8 ноября, 2015 4- это количество знаков после запятой)))) COKPOWEHEU а про вот это(положение точки при выводе на дисплей) с удовольствием послушаю. может быть вы конечно оговорились, но если нет, то мне это наверняка пригодится как начинающему. 0 Не знаеш как? Спроси у Google'а !!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.