I-Studio Blog

Если все получилось, программатор обнаружен, “дудка” не ругается, тогда двигаемся дальше.

Подключим теперь лампочку и попробуем ей поморгать.

Немного теории для начала: Светодиод нельзя подключать напрямую к источнику питания, т.к. светодиод имеет очень малое внутреннее сопротивление и если его подключить напрямую, то светодиод сделает вам “пшик”, вспыхнет в последний раз и попросится в мусорное ведро. Допустим, у нас есть светодиод, у которого в даташите написано, что его нормальный прямой ток 20mA. И что падение напряжения на нем – 2V. На ножке микроконтроллера при лог “1” напряжение 5V. Скрипя мозгами вспоминаем закон Ома: R = (Vмк – Vсв) / I = (5-2)/0.02 = 150 Ом. Ближайшее значение резистора – 180Ом. Вот его и берем.

Светодиод подключили, теперь возьмем в руки текстовый редактор :-)

Я очень сильно привык в vim’у, поэтому у меня нет горячих кнопок “компилировать”, “залить”, “запустить” и т.д. Для этих вещей я написал скриптик на bash’е:

$ cat make.sh 
clear
avr-as -asmgl=first.lst -mmcu=atmega32 first.as -gstabs -o first.o
avr-ld -o first.elf first.o
avr-objcopy -O ihex -R .eeprom first.elf first.hex
cat first.hex
$

После каких-то изменений свежезалитая прошивка отказалась работать. Я долго втыкал в код в редакторе и не мог понять, что же не так. Добавил генерирование промежуточного листинга ассемблера и о, чудо, я обнаружил свою глупую ошибку. С тех пор у меня всегда стоит генерирование листинга.

Для проверки, что все скомпилировалось успешно, я вывожу получившийся HEX на экран и потом заливаю то, что получилось в МК. Команду для заливки я уже писал в предыдущей части.

Я светодиод подключил на порт B (PORTB), на 1-ю ножку (PB1), поэтому “моргание” в ассемблере будет выглядеть так:

    SBI     DDRB, PB1     ; настраиваем порт/пин на выход
main:
    SBI     PORTB, PB1    ; высокий уровень
    CBI     PORTB, PB1    ; низкий уровень
    RJMP     main

Компилируем (я использую GNU ASM для AVR), заливаем и… не моргает :-( Что же у нас не так?

Осциллографа у меня нет, но можно догадаться, что светодиод моргает, но с такой частотой, что наш глаз не успевает увидеть. Чтобы наш глаз успел увидеть моргание светодиода надо добавить задержку между сменой уровней.

Ок, добавляем:

    LDI     R16, 0x1
    LDI     R17, 0x1
    LDI     R18, 0x8
 
loop:
    SUBI    R16,1       ; вычитаем 1
    SBCI    R17,0       ; вычитаем только 'C'
    SBCI    R18,0       ; вычитаем только 'C'
 
    BRCC    loop        ; если нет переноса - переход

Вот, теперь гораздо лучше! Я не высчитывал сколько точно задержка, цель была – чтобы моргал светодиод.

Окончательный вариант программы выглядит так:

    SBI     DDRB, PB1     ; настраиваем порт/пин на выход
 
main:
    SBI     PORTB, PB1   ; высокий уровень
 
    LDI     R16, 0x1
    LDI     R17, 0x1
    LDI     R18, 0x8
 
loop:
    SUBI    R16, 1      ; вычитаем 1
    SBCI    R17, 0      ; вычитаем только 'C'
    SBCI    R18, 0      ; вычитаем только 'C'
 
    BRCC    loop        ; если нет переноса - переход
 
    CBI     PORTB, PB1  ; низкий уровень
 
    LDI     R16, 0x1
    LDI     R17, 0x1
    LDI     R18, 0x8
 
loop1:
    SUBI    R16,1       ; вычитаем 1
    SBCI    R17,0       ; вычитаем только 'C'
    SBCI    R18,0       ; вычитаем только 'C'
 
    BRCC loop1          ; если нет переноса - переход
 
    RJMP main

Проводочки, детальки, микросхемы, лампочки, батарейки закуплены – можно сделать что-то доброе, светлое, вечное.

Как обычно в таких случаях бывает – такой своеобразный “Hello World” по микропроцессорному – мигание лампочкой.

Для начала немного расскажу о подключении микроконтроллера вообще и лампочки в частности.
Открываем datasheet и внимательно смотрим:

VCC – +5В, GND – 0В. Для запуска микроконтроллера этого должно быть достаточно.

Я еще в самом начале заказал себе USBtinyISP-программатор. Так как пока разводить платы, травить, паять <1мм дорожки я пока еще не умею как профи, я решил заказать готовый. У него ниже скорость, чем у JTAG-программатора, но отладка мне пока не требовалась и я не долго думая, заказал такой.

На верхней фотке видно, как он подключен – слева и справа кучка проводов. Разводка 10-пинового раъема такая:

Подключаем соответствущие выводы к выводам микроконтроллера.

Проверка (взял первый попавшийся hex-файл):

$ avrdude -p m32 -c usbtiny -U flash:w:file.hex
avrdude: AVR device initialized and ready to accept instructions
 
Reading | ################################################## | 100% 0.01s
 
avrdude: Device signature = 0x1e9502
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "file.hex"
avrdude: input file file.hex auto detected as Intel Hex
avrdude: writing flash (480 bytes):
 
Writing | ################################################## | 100% 0.79s
 
avrdude: 480 bytes of flash written
avrdude: verifying flash memory against first.hex:
avrdude: load data flash data from input file first.hex:
avrdude: input file file.hex auto detected as Intel Hex
avrdude: input file file.hex contains 480 bytes
avrdude: reading on-chip flash data:
 
avrdude: verifying ...
avrdude: 480 bytes of flash verified
 
avrdude: safemode: Fuses OK
 
avrdude done.  Thank you.

Если же программатор по каким-то причинам не найден, то вы увидите это:

$ avrdude -p m32 -c usbtiny -U flash:w:file.hex
avrdude: Error: Could not find USBtiny device (0x1781/0xc9f)

avrdude done.  Thank you.

Если у вас что-то не получилось – прошу в комменты.

Одной Ардуины мне все-таки маловато:

  1. Просто включить.
  2. Быстро начинаешь что-то делать – студия, примеры, “одна кнопка”.
  3. Куча всяких дополнительных плат, которые можно понавешивать на основную плату.

Но это все не мое. Я хочу добраться до внутренностей, как в детстве любил разбирать почти все игрушки, которые попадали мне в руки. Поэтому начал искать, где бы мне прикупить всякого-разного по не очень высокой цене. Да, есть chipdip.ru, но там такие цены, что мне не по карману.

Гугл привел меня на chipnn.ru, где цены оказались достаточно бюджетные.

Сделал заказ, оплатил. Через пару недель заказ пришел по почте. Вот что было в заказе (все было уложено цивильно в коробочки, проложено бумагой и т.д. – это я уже избавился от упаковки):

В заказе были кучки светодиодов, резисторов, конденсаторов, семисегментники, жк-экран 16х2, несколько разных разъемов, пара микроконтроллеров atmega32a.

Теперь буду учиться собирать что-нибудь из этого “добра”.

Пришел мне заказ, сделанный в китае, описанный в предыдущем посте.

Поигрался с Arduino, помигал лампочками – работает. Причем все так просто, что даже почти не интересно.

Вместе с Ардуино поставляется “среда разработки” – Arduino IDE. Выглядит, как будто ее писали в 20-м веке и студенты. Несколько файлов открыть нельзя, никаких плюшек, уже ставших стандартными для нынешних IDE нету. Забросил. Взял в руки GCC :-)

Т.к. я уже лет 5 живу без Windows, то пришлось немного порыскать по интернету. Нашлись пакеты avr-* в репозитарии Ubuntu. О! А я-то думал, придется toolchain самому собирать :-(.

Задача оказалась немного сложноватой в начале, но вполне решаемой при помощи всемирного разума.

Дано:

  1. Плата Ардуино.
  2. Светодиод.
  3. Бутлоадер в микроконтроллере, который уже зашит производителями ардуины.
  4. Какой-то неправильный Си, на котором пишутся скетчи в Ардуино ИДЕ.

После достаточно недолгих блужданий по интернету решение получилось следующим:

  1. Плата Ардуино + светодиод (они никуда не делись :-))
  2. Бутлоадер тоже остался, но можно и без него.
  3. GCC + AVR toolchain + AVR header files
  4. VIM + avr8bit.vim – syntax file
  5. avrdude
  6. Profit!

Дальше было дело техники. main() + while(1) + datasheet на микроконтроллер и пошло-поехало…

Сегодня заказал вот такую штуку:
Electronic Blocks Hardware Iinteractive Arduino Ultimate Senior Suite

И Ethernet-shield в довесок

Теперь жду доставку и начну постигать мир AVR.

Stay tuned.

August 1st, 2011

Linux 3.0 released!

No Comments, News, by i-studio.

So there it is. Gone are the 2.6.days, and 3.0 is out.

Read more

Допустим, Вам надо удалить слова с дублирующимися буквами в них.

Вариант номер раз:

 
my $a = "1asdf 2sdfg 3dfggdf 4sdfrrsdf 5sdfsdf 6dghgyyghf 7fdfgd 8hgggiu";
my @b = split / /, $a;
foreach my $w (@b) {
next if $w =~ /(.)\1/;
print $w." ";
}

Но, т.к. это перл, то есть и вариант номер два:

$a =~ s/(\b.*?\b)\s(\w+(.)\3\w+)/$1/g;

Пример:

$ perl -e 'my $a = "1asdf 2sdfg 3dfggdf 4sdfrrsdf 5sdfsdf 6dghgyyghf 7fdfgd 8hgggiu"; $a =~ s/(\b.*?\b)\s(\w+(.)\3\w+)/$1/g; warn $a'
1asdf 2sdfg 5sdfsdf 7fdfgd at -e line 1.

February 2nd, 2011

LJ OpenID fix

1 Comment, Programming, by i-studio.

Супер-мега-новость!

Сегодня пофиксил в коде ЖЖ багу, связанную с авторизацией через livejournal.com OpenID.

Выйдет в ближайшем релизе.

January 22nd, 2011

Поехали!

No Comments, News, by i-studio.

Всем привет!

Завел этот блог на давно забытом домене, чтобы не пропадать добру. Глядишь и домен немного оживет в будущем :-)