Титла: Hello AVR Публикувано от: ivo1204 в Jul 06, 2011, 17:31 Тази тема е нещо като продължение на предишната, “Arduino Scada”, само че са в обратен ред – тази трябваше да е първа.
И тук всичко ще е стъпка по стъпка описано – подробно. ------------------------- Първо, какъв ще е хардуера? Ами преди време купих 4 бр. Atiny26L, помня за жълти стотинки , сега ги гледам в комет http://www.comet.bg по 1,16 евро. Корпуса им е DIP, и трябва и поне един цокъл 20 крачета. Платката е универсална, за проводник използвам жилата от един дефектен кабел за интернет – различни цветове, а и достатъчно тънки за да минат през отворите.Има и още по добър проводник, едножилен и калайдисан, минава през отворите а и няма нужда да се зачиства – направо се запоява, за съжаление не мога да дам магазин. Имам го отдавна, за опроводяване на пратки беше. Още нещо което трябва за начало, е и един куплонг за паралелният порт, мъжки, DB25, а и съпротивления – от 410 ом до 1к, каквито има. Този куплонг за пар. Порта ни трябва за програматор, а и за връзка после. В сайта на ардуйно. http://www.arduino.cc/en/Hacking/ParallelProgrammer http://www.dl1dow.de/inhalt/arduino/bootloader/e_arduino_bootloader.htm http://www.javiervalcarce.eu/wiki/Program_Arduino_with_AVR-GCC Това е 'dapa' (Direct AVR Parallel Access cable) Друг популярен програматор е 'bsd' , протраматор даден от Браян Дийн, автора на програмата 'avrdude' , която ще ползваме за запис. Въпреки че тези програматори са на паралелният порт, те по същество са серийни. И тъй като не ползват “високо” напрежение за програмеране, имат и ограничения. Високо е в кавички, щото 12Волта едва ли е високо, но програматорите, които го пролзват, могат и да изтриват “заключени” или с грешно програмирани “фюзове” чипове. Но затова после, а засега, за празен чип, и без кварц, тези са перфектни. На всички линии, които вързваме, може да сложим предпазно съпротивление 510Ом - 1к примерно, масата – директно. Кокво може да сбъркаме? Ами 'dapa' е изпитан кабел, но все пак, какво би станало, ако 16 краче на пар.порта – изход, и PB7 е програмиран като изход и е във високо ниво? Теоретичен въпрос, но възниква, затова по добре да има резистор. На схемата с кръгче. Чипа идва фабрично с краче 10 , PB7 ползвано като Reset, вход, за да променим това ни трябва да пограмираме fuse, така че въпроса е теоретичен. Втори начин да прецакаме нещата е да програмираме като clock , тактовата честота на процесора, от външен кварц или друго. Чипа идва програмиран на 1МХц вътрешен тактов генератор, това което без проблеми може веднага да сменим е да го сложим на 8МХц., вътрешен тактов генератор. Титла: Re: Hello AVR Публикувано от: ivo1204 в Jul 06, 2011, 22:22 Ако смятаме да позваме аналоговите входове / които са 11 /, трябва да помислим и за стабилно захранване, както и едно важно изискване, което за съжаление в Ардуйно не е спазено – а именно, да развържем аналоговото захранване VACC от другото, това ще повиши точността на преобразуване.
С тази команда ще прочетем Fuse High Byte avrdude -p t26 -P /dev/parport0 -U hfuse:r:-:h при мен - 0х17 но с тях нямаме работа засега, това, което ни интересува е Fuse Low Byte avrdude -p t26 -P /dev/parport0 -U lfuse:r:-:h при мен – 0хE4, 8Мнц, в незаписан чип - 0хЕ1 - 1МХц вътрешен тактов генератор И понеже това е малко трудоемка работа, лесното е да ползваме сайта http://www.engbedded.com/fusecalc/ записа става с avrdude -c dapa -p t26 -P /dev/parport0 -U lfuse:w:0xE4:m Титла: Re: Hello AVR Публикувано от: bot в Jul 06, 2011, 23:13 В Ардуино, особенно ако е базирано на ATMega8 разделянето на аналоговото от цифровото захранване е безсмислено защото...
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=20967&start=0 се оказва че по погрешка са ги свързали вътре в чипа. Това, което си показал е един филтър, който филтрира смущения с определена честота. За развързване е необходимо отделно захранване или отделен стабилизатор по напрежение, който да е свързан не само към аналоговото захранване на чипа ами и към цялата аналогова схема, включваща датчик, операционни усилватели и активни филтри и др. звена на аналоговия интерфейс. В частност, ако източника на сигнал си има автономно захранване може да се използва един и същ източник на напрежение за цифровата и аналогова част, а за по-стабилно измерване да се използва външен източник на опорно напрежение. Пък и вграденото АЦП на този Атмел е само 10 бита, което си е доста нисък клас за съвременните стандарти на цифрово преобразуване. Титла: Re: Hello AVR Публикувано от: ivo1204 в Jul 07, 2011, 13:27 Bot, прав си, че за аналоговите функции имат доста спесифика. Atmega8, както и Attiny26L не се произвеждат вече, Arduino ползва Atmega328p /ATmega168 в по старите версии/. Схемата за развързване на AVCC
e препоръчваната от datasheet -a на чипа. За аналоговите функции има доста спесифични изисквания и който смята да ги ползва, е добре да прочете повече http://www.atmel.com/dyn/products/documents.asp?category_id=163&family_id=607&subfamily_id=760 http://www.atmel.com/dyn/products/documents.asp?category_id=163&family_id=607&subfamily_id=791 !!! Точно тук може и да стане фал, затова – никакъв минус или напрежение на Areff /PA3 – 17 краче, засега. !!! Иначе при начално включване не се ползва вътрешното 2.56 V за reference, а Avcc. По точният вариант е кондезатор към Areff и превключване на ADMUX регистъра Voltage Reference Selection Internal Voltage Reference (2.56 V) with external capacitor at AREF pin (PA3). Bit 7, 6 – REFS1=>1, REFS0 =>1: Reference Selection Bits А пък останалите битове в този регистър са избор на канал, което е крайно неудобно защото постоянно ще ги въртим, така че още по лесно да направим белята... Има още доста неща и техники при меренето, режими, тариране, спиране цифрова част, и т.н. “Note you must call analogReference() before using analogRead(); otherwise you will short the internal reference voltage to the AREF pin – possibly damaging your board.” http://tronixstuff.wordpress.com/2010/12/07/tutorial-arduino-and-the-aref-pin/ Титла: Re: Hello AVR Публикувано от: ivo1204 в Jul 08, 2011, 12:51 Още малко схеми за хардуера
+ леко app да за тест на крачетата на програматора Като разгледаме връзката между PC и AVR платката, виждаме 1-во краче на куплунга на паралелният порт е нулевият бит на контролният регистър /адрес 0х37А / , фактически по него се подават стробиращите данните импулси, а по 2-ро краче, /което е нулевият бит на регистъра за данни 0х378 / се подават самите данни. Същото това 1-во краче е вързано към SCK /PB2/ на avr чипа. Atiny26 е от старите чипе, няма SPI интерфейс, има много подобният Universal Serial Interface, USI, който си е същото с няколко липси и ограничения. Тук липсва хардуерната линия SS, слейв селект, която би ни позволила да вържем повече такива платки и PC да избира и комуникира с всяка по отделно без да занимаваме софтуера с адресацията. Този USI има режим 3-wire , / което подсказва SPI / и режим 2-wire /това пък е TWI или I2C, едно и също е /. Като ще връзваме мотори едва ли ще имаме голям обем на данни, така че SPI ни устройва. Липсата на SS ще я компенсираме с хардуерно прекъсване в avr-a. USI може да ползва за стробиране на данните идващи по 2кр-PC => MOSI => PB0 линията 1кр-PC => SCK /PB2/. Фактически се броят имулсите по SCK , и положителни и отрицателните фронтове. Когато станат 16, има хардеурно преекъсване и т.н. Има специален 4 битов брояч / до 16/ за тая цел, той дава прекъсването. А при всеки положителен фронт на SCK / или отрицателен, ако сме инициализирали така/ се запизва бита от линията MOSI в серииният USI Data Register – USIDR и се шифтва за да се запише следващият бит. Хардуерното прекъсване трябва да прочете данните и подготви за ново приемане /предаване/. Сега от другата страна – PC-то. Ще трабва да установяваме бит по бит на 2-кр. /D0 data register/ и да превключим два пъти / горе и долу/ SCK / 1-кр 0-бит на контр. Рег./. Начините с които може да правим това са 3 – директно, без да се занимаваме с драйвери, кернели и т.н. Искаме права чрез ioperm(....) и си пишем и четем чрез outb(...) inb(...). Лично на мен тоя най ми харесва, ама почва вой... не искам да споря, макар че баш тоя тоя пар. порт едва ли е притрябвал за нещо друго. Вторият начин – драйвер, ама да си го пишем … ами ОК, ако си струва труда... А би си струвало ако например тоя драйвер правеше някакви интерполации в движенията или нещо от тоя ранг. Ама да прати 2 байта позиция ,не си струва. Третия, който ще ползваме реално / за да не ни одумват/ е чрез драйвера ppdev Характерното при обращенията към ядрото е / ioctl(...)/ , че те връщат резултата от операцията /успешна, неуспешна и т.н./, а за данните, които искаме да получим или пратим правим променлива, и я предаваме чрез адреса и / &var/. Отваряме порта с fd = open("/dev/parport0", O_RDWR); и получаваме fd който ще ползваме винаги за тоя порт PPRSTATUS, – четене в статус регистъра PPRDATA , PPWDATA четене и запис в DATA регистъра PPRCONTROL, PPWCONTROL четене и запис в CONTROL регистъра PPCLAIM захращане и PPRELEASE пускане на порта close(fd); затваряне Това са нещата които ще ползваме, декларирани в /usr/include/linux/ppdev.h Титла: Re: Hello AVR Публикувано от: romeo_ninov в Jul 10, 2011, 18:18 Ще си разреша да препоръчам една книга за начинаещи (и аз в момента я чета от любопитство :) )
Practical Arduino Cool Projects For Open Source Hardware от Jonathan Oxer и Hugh Blemings Титла: Re: Hello AVR Публикувано от: ivo1204 в Jul 11, 2011, 12:15 Кода на програмите
-- *Забележка – оказва се, че при инициализиране на посоката на данни за дата регистъра на пар. порта с FE, /всички вход, само D0, 2-ро краче, изход/ не винаги се инициализира порта. Може би бъркам, а може и да и хардуерен проблем при мен, мързи ме да го търся какво е точно... В конструктора на pp, pp.c data_dir = 0x00; < =//беше data_dir = 0xFE; ioctl(fd, PPDATADIR, &data_dir); премахва проблема. Ако искаме да четем входните данни от avr-a, когато изпращаме байт, получаваме по линията MISO, 11-то краче на РС купланга, S7 Status register, PB1/miso,2кр на atiny26/ данните -DI, като първо идва най-старшият бит. Още, S7 e инверсно, то трябва да го инвертираме да получим вярната стойност.Не можем да четем без да пишем, четенето и изпращането са еднобременнен процес. ********** Видяхме, че може да приемаме и получаваме данни от AVR платката , сега малко размишления по въпроса. ***Скоростта? Ами може да и значително по голяма от тази на Ардуйното, теоретично Fcpu/4 за slave и Fcpu/2 за master. Значи теоретично 2МХц в нашият случай – 8 Мхц клок. ATtiny 26 не се произвежда, Attiny261/461/861 са наследниците му. При една и съща честота с една Ардуйно – мега, уно и т. н. платка с Attiny261 ще имат значително по голямо бързодействие, поради когато влиза и излиза от прекъсване, не се запазва адрес за връщане в стека – дума, а байт когато адресира индексно, а то е често, указателите X,Y,Z не са двойки регистри а само младшият байт, например ld r6,X+ зарежда регистъра и увеличава брояч от регистри r26:r27, a при тинито, само r26 всички регистри са в малките адреси, така че обръщения към тях ще са с 'in' и 'out' инструкции, по бързи и по къси. При Ардуйно Мега, нещата са още по зле, когато флаш програмата ползва функции от далечни адреси / 64к думи/ – зарежда се и нова страница. Но най – бавното в Ардуйно е ако ползваме готовите му функции, впрочем това го чоплихме. Разбира се, 2 Мхц е непостижима скорост – при 8 Мхц са само 4 инструкции, при 16 Мхц – 8. Това е и причината, ако търсим скорост, прекъсването да се пише на асемблер, някои ненужни регистри да се обявят за променливи, и тогава, може да свалим кода на прекъсването да една инстукция register uint8_t rec_data __asm__ (“r2”); … ISR(USI_OVF_vect) { rec_data = USIDR; // чете данните от USI в променлива. reti } .global USI_OVF_vect USI_OVF_vect: in r2, USIDR reti Макар и същи по смесъл, най вероятно ще дадат различен по големина код.Затова, се гледа какво е сътворил gcc в *.lss файла. Скростта е ограничена и от PC , въпреки че пар порта може да е много бързичък. А и от кабела, или от недобри нива на сигналите. Въпреки чи не забелязвам проблеми де. *** Липсва ли ни софтуера на Ардуйно? Ами според мен не, по скоро липсват готови и тествани примери, да може да се преизползва код. *** Сега – напред. Ако някой е гледал кода, е забелязал, че ползвам Eclipse за AVR -a, rQT Creator за РС. QT има едно разширение за технически приложения, libqwt. Там има много ценни неща, не случайно Pvbrowser ги ползва. http://pvbrowser.de/pvbrowser/index.php Има пакети за Убунту, но как може да ги инсталирами ръчно? Ами много лесно svn co https://qwt.svn.sourceforge.net/svnroot/qwt/trunk/qwt ще ни изтегли най-новото, по натам – първо махаме libqwt* ,дори може да се наложи cd /usr/lib rm -f libqwt* Ако версията не е от svn, може да се наложи да махнем makefile – тата Трябва обаче да знаем, какво qt*** работи при нас – 3 или 4? За Убунту update-alternatives --config qtconfig и така за moc, uic, qmake, lrealise, designer.... Второто нещо е да редактираме qwtconfig.pri - къде да инсталира. Ако се прежалим и да решим да е QWT_INSTALL_PREFIX = /usr трябва и да видим къде ще отиде плагина за designer. Може и ръчно да си го копираме де. ------------- qmake make make install ------------ За да ползваме новите 'гяволии' в *.pro файла ще добавим и LIBS += -lqwt Ако сме компилирали от сорс, ще се компилират и примерите .../qwt/examples и може да ги стартираме – те са в .../qwt/examples/bin. Вторият пример например, веднага ме навежда на мисълтта, че QwtPlot би могъл да изобразява и аналоговите стойностти, които Attiny – то би могла да праща. Ако искаме обаче да ги ползваме и променяме за нашите нужди, щракаме на *.pro файла и отваряме проекта с QT Creator. За да го стартираме, премахваме реда include( $${PWD}/../examples.pri ) и добавяме LIBS += -lqwt. Титла: Re: Hello AVR Публикувано от: ivo1204 в Jul 15, 2011, 11:05 Разбира се, далеч съм от мисълтта, че тука ще почнеме да изучаваме
С++, QT и т.н. По скоро идеята е да се преизползва максимално лесно кода, защото действително е лесно, ако има реални елементарни примери. И веднага давам такъв за илюстрация, - генерираме си с QT Creator File → New file or project → QT C++ progect /QT Cui app/ → … → … → за Base class избираме Qwidget Във формата с дизайнера плескаме един QwtPlot, добавяме една QwtPlotCurve, даваме и стойности и я показваме... / кода проекта е приложен/ **Няколко думи за документацията За Eclipse, писахме вече http://home.gna.org/eclox/#update-site За QTCreator – мързеливото е изтегляме плагините от http://dev.kofee.org/projects/qtcreator-doxygen/wiki отваряме Synaptic, намираме qtcreator, мишка – Properties – Installed Files гледаме къде е директорията с плагините, /usr/lib/qtcreator/plugins/Nokia при мен. Разархивираме и плескаме плагините там. ** Титла: Re: Hello AVR Публикувано от: ivo1204 в Jul 23, 2011, 12:30 Значи, до повторим, SPI обмена в нашият случай физически се осъществява, като master / РС-то/ поставя по mosi линията / master output, slave input/ най – старшият бит на предаваният байт. Същото прави и slave / AVR -a /по линията miso / master input slave outnput/. Данните трябва да са валидни преди да превключим клока – SCK.
Условието за това с съответните линии да са установени правилно като изходи – входове, а miso е в зависимост на нивото на SCK, в контролният регистър USICR с битовете USICS1 , USICS0 се определя поляритета на получаваният SCK . Това е важно, защото по първият му фронт / от 1 в 0 или от 0 в 1/ се записват данните, а по вторият /обратният, съответно 0->1,1->0/ се шифтва регистъра и на линията miso си появява следващият бит. И така докато се предаде целият байт, след което се извиква хардуерно прекъсване. Регистъра в AVR slave е блокиран, докато не бъде разблокиран със запис 1-ца в USIOIF бита /сваля флага за прекъсване/ в регистъра USISR./USI Status Reg./ Това трябва да стане преди да запишем нови данни в него. На физическо ниво, протокола е ясен и не би трябвало да има проблеми,това е доста надежден протокол. В случаят със стъпковият мотор,/ който ползвам за пример/, а и за обмен на прочетени аналогови данни, ни са нужни най-малко два различни байта, старши и младши, за да предадем/прочетем позиция или една 16 битова величина. В примера,който прилагам, ползваме предаване/получаване на 2 байта позиция. Трябва да уточня, че това си е напълно работещ пример,със стъпково моторче, тестван и реализиран, работещ при мен, не е просто теория... Още средата и развойната среда / QTCreator и Eclipse/ позволяват едновременно да работим кода и на РС и AVR-a, да стартираме и флашваме фърмуера и РС приложението без абсолютно никакво закачане/откачане на куплонги и платки, както при истинкото Ардуйно, само че много по бързо и на сериозни дев. платформи и среди. Титла: Re: Hello AVR Публикувано от: ivo1204 в Jul 27, 2011, 12:26 Използването на С++ също не е проблем, ако спазваме някои ограничения. В примера, който
давам / работещ, същият стъпков мотор / , има един интересен клас, Buffer, който има голяма практическа стойност. Подържа два буфера, приемен и предавателен, чрез които фактически обмена между РС и AVR платката e сведен до писане и четене в локални масиви и променливи. За разлика от ардуйновското Serial.read , write, begin, ... поддръжката на комуникацията е е нулева, а пък и хардуера е многократно облекчен от този обмен, така че почти всички ресурси са за приложението ни. И като се напише един заглавен файл, в който се дефинира, че от еди кой си байт масива ще е държим еди коя си аналогова стойност, прочетена от AVR -a, абсолютно същият заглавен файл просто ще го включим когато пък пишем приложението за РС. Може според нуждите да си включи каквото поиска и конфигурира– флагове, контролни суми. Тук освен сериален, имаме и блоков обмен, така че даже AVR може да получава и блокове с данни. Имам предвид идеята му, а не точно този код, предполагам доста за деляне има по него, а и за оптимизиране, но ще си струва труда де. Ограниченията в С++ са няколко, например динамичното създаване на обект с 'new' и 'delete'. По принцип то не е ограничение, с добавяне на няколко реда лесно го прескачаме, http://lists.gnu.org/archive/html/avr-libc-dev/2011-02/msg00002.html А трябва още и ред за изключението. Но, дори и да го сложат в toolchan-a, не го ползвайте, яде яко памет. И рам, и флаш. Деструктори също не ползвайте за AVR , ненужни и лакоми са. Подозрителен съм и към конструктора, особено ако смятаме, че цялата програма трябва да е в него. Иначе С++ си отличен език, кода е малко по дълъг за къси програми, но и нямаме ограничения от ресурси дори за такава въшка като Attiny26. Титла: Re: Hello AVR Публикувано от: BULFON в Jul 27, 2011, 17:28 Може би кода, който публикуваш, ще е добре да е качен на някой от сайтовете за хостване на проекти: github, code.google.com...
Аз мога да добавя малка схема за връзка към ATTiny26L през серийния порт и софтуерен UART, който ползва USI. Предимството е, че от страна на компютъра можеш да ползваш проста терминална програма или да пишеш директно (echo) към серийния порт. Титла: Re: Hello AVR Публикувано от: ivo1204 в Jul 28, 2011, 12:22 Здравей, BULFON
Схемата и идеята е естествено добре дошла, Кода, който закачам към постовете е за илюстрация, няма версия и не смятам да го поддържам, и всеки път има нещо умишлено различно. Като сега например ми си ще да спомена библиотеките 'parapin' http://parapin.sourceforge.net/ http://www.youtube.com/watch?v=tE1EfjwX7mk и с тях ( а и без тях де, ) много лесно може да си напишем една команда - ' echo_t26 ' например, и не само да пишем, а и да четем с нея от команден ред. Може и kernel модул, вероятно има и нещо близко написано за да го вземем за основа, не би било трудно, един от най – лесните драйвери би бил... ще видя. http://tldp.org/LDP/lkmpg/2.6/html/x569.html Идеята отначало ме бе такава, но понеже се движа в много строги изисквания – а именно, цена – до кутия цигари, сглобяване – за човек, хванал поялник за пръв път, закачане на платката и после абсолютно никакво откачане, мощни софтуерни платформи за които да има и Debug, и т.н. От там на татък, AVRDude, с който си флашваме чипа директно от Eclipse, ползва ppdev който пък ползва parport_pc, и затова ползвам същите линии и драйвери за обмен. Така че като флашнеме, си рънваме програмата, и си стартираме QTCreator едновременно, и да може да правим както хардуерно симулиране на чипа и дебъг от Eclipse, така и софтуерен - на PC частта и буфера с qDebug, а при AVR а – с добавяне на на код, който просто записва каквото ни интересува в буфера и то да стане видимо за нас. Нещата могат да станат по много и най – различни начини, то и в това и силата /ама и слабостта/ на отворения код. За сериалния интерфейс съм закачил в предишната тема много по сериозен софтуер – по компактен и бърз от ардуйновият със същата функционалност и много подобни имена – serial_begin , serial_write – байт, блок и т.н. Както и програми за комуникациите през /dev/ttyUSB0 на Си и Пърл. П.П Впрочем, като се поразмеслих малко по въпроса за драйвера, BULFON е абсолютно прав. Наример ако искаме да вържем платката с Proview, кокто в предишната тема, трябва да имаме файл в /dev/... например /dev/t26 char, в който като минимум да пишем и четем, а второта пречина е, че в 2к флаш паметта на чипа едва ли е рентабилно да се декодира протокола на Proview, след като драйвера може да свърши това, а обмена с платката да си остане елементарен. И трето, драйвера трябва да е наша грижа, а не на разработчиците на някои друг продук. **** Сорс на модула t26, Tова е груба, срязана начална версия на драйвера t26. На този етап поне при мен не забива компютъра Модула компилираме с cd /to_source_dir make инсталиране с insmod t26.ko mknod -m 0666 /dev/t26 c xxx 0 - правим /dev/t26 , xxx го четем от dmesg Преди инсталиране махаме lp, ppdev, parport => modprobe -r 'name' , засега не е нужно махане с rmmod t26 Тестване с dmesg -c чистим echo -n "01234567890123450123456789" >/dev/t26 dmesg cat /dev/t26 Титла: Re: Hello AVR Публикувано от: ivo1204 в Jul 30, 2011, 15:56 Драйвера t26, работещ, може да се ползва, в този пост ще слагам последната му версия.
echo "9999" >/dev/t26 мести до позицията 9999 echo "хххх" >/dev/t26 мести до позицията хххх |