Grzebanie w starociach
Ostatnio przegrzebywałem się przez moje szuflady z elektroniką w poszukiwaniu cyny. Nie bawiłem się w lutowanie od czasów pierwszych lat studiów i technikum, ot takie porzucone hobby, nie hobby. Nagle w ręce wpadł mi scalak:
](https://sgdev.pl/wp-content/uploads/2017/03/IMG_20170326_150558725.jpg)
Po chwilę wpadło mi ręce jeszcze kilka podobnych, lecz niestety mój programator USB zaginął w akcji jakiś czas temu, Arduino nigdy nie posiadałem, a współczesne komputery nie mają już ani RS232 ani Centronics. Rozczarowany już przerzucałem je do pudełka, gdy me oczy spoczęły na… malince. Tak głupcze! Porty GPIO powinny się nadać. Zanurkowałem w internety jak do tego podejść. Avrdude… no jasne to powinno zadziałać! Niestety brak paczki w repo raspbiana oznaczał kompilację ze źródeł.
$ sudo apt-get install bison flex -y
$ wget http://download.savannah.gnu.org/releases/avrdude/avrdude-6.2.tar.gz
$ tar zxvf avrdude-6.2.tar.gz
$ cd avrdude-6.2
$ ./configure --enable-linuxgpio
$ make
$ sudo make install
Make, trochę potrwał z uwagi, że kompilowaliśmy paczkę na malince. Dodatkowo w pliku/usr/local/etc/avrdude.conf konieczne były małe zmiany konfiguracyjne. Odkomentowanie sekcji z linuxgpio i ustawienie odpowiednich pin’ów.
id = "linuxgpio";
desc = "Use the Linux sysfs interface to bitbang GPIO lines";
type = "linuxgpio";
reset = 4;
sck = 11;
mosi = 10;
miso = 9;
;
Spojrzałem na rozkład wyprowadzeń maliny: https://www.raspberrypi.org/documentation/usage/gpio/README.md. Z 3.3 V zasiliłem attiny, podpiąłem odpowiadające wyprowadzenie ustawione w AVR DUDE do pinów z interfejsu SPI, zgodnie z notą katalogową.
Czyli podsumowując połączyłem jak niżej:
Pin | Pi PIN | ATTiny PIN |
---|---|---|
VDD | 1 | 20 |
GND | 25 | 10 |
RESET | 4 | 1 |
MISO | 9 | 18 |
MOSI | 10 | 17 |
SCK | 11 | 19 |
Przyszła pora na pogadanie z mikrokontrolerem:
$ sudo avrdude -c linuxgpio -p attiny2313 -v
avrdude: Version 6.2, compiled on Mar 25 2017 at 17:13:29
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "/usr/local/etc/avrdude.conf"
User configuration file is "/root/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
Using Port : unknown
Using Programmer : linuxgpio
AVR Part : ATtiny2313
Chip Erase delay : 9000 us
PAGEL : PD4
BS2 : PD6
RESET disposition : possible i/o
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 6 4 0 no 128 4 0 4000 4500 0xff 0xff
flash 65 6 32 0 yes 2048 32 64 4500 4500 0xff 0xff
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
lock 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
lfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
efuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
calibration 0 0 0 0 no 2 0 0 0 0 0x00 0x00
Programmer Type : linuxgpio
Description : Use the Linux sysfs interface to bitbang GPIO lines
Pin assignment : /sys/class/gpio/gpio{n}
RESET = 4
SCK = 11
MOSI = 10
MISO = 9
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e910a (probably t2313)
avrdude: safemode: hfuse reads as DD
avrdude: safemode: efuse reads as FF
avrdude: safemode: hfuse reads as DD
avrdude: safemode: efuse reads as FF
avrdude: safemode: Fuses OK (E:FF, H:DD, L:64)
avrdude done. Thank you.
Hurra! 🙂 Czym by był mój eksperyment, gdybym nie próbował zamrugać diodą ?
Zaprogramujmy coś!
Napisałem krótki programik, jako ofiarę wybrałem sobie PIN6 z portu D, gdyż był wygodnie usytuowany. Podpiąłem diodę led i rezystor 1kOhm.
#include<avr/io.h>
#include<util/delay.h>
int main(void){
DDRD |= _BV(6);
while (1){
_delay_ms(500);
PORTD |= _BV(6);
_delay_ms(500);
PORTD &= ~(_BV(6));
}
}
Nastepnie kolejno skompilowałem napisany kod, utworzyłem plik do wgrania na malinkę, i za pomocą avrdude przesłałem wszystko na malinę.
$ avr-gcc -mmcu=at90s2313 test.c -o test
$ avr-objcopy -O ihex test test.hex
$ sudo avrdude -c linuxgpio -p attiny2313 -v -U flash:w:test.hex:i
Avr dude wyświetlił podsumowanie:
$ sudo avrdude -c linuxgpio -p attiny2313 -v -U flash:w:test.hex:i
avrdude: Version 6.2, compiled on Mar 25 2017 at 17:13:29
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "/usr/local/etc/avrdude.conf"
User configuration file is "/root/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
Using Port : unknown
Using Programmer : linuxgpio
AVR Part : ATtiny2313
Chip Erase delay : 9000 us
PAGEL : PD4
BS2 : PD6
RESET disposition : possible i/o
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 6 4 0 no 128 4 0 4000 4500 0xff 0xff
flash 65 6 32 0 yes 2048 32 64 4500 4500 0xff 0xff
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
lock 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
lfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
efuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
calibration 0 0 0 0 no 2 0 0 0 0 0x00 0x00
Programmer Type : linuxgpio
Description : Use the Linux sysfs interface to bitbang GPIO lines
Pin assignment : /sys/class/gpio/gpio{n}
RESET = 4
SCK = 11
MOSI = 10
MISO = 9
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude: Device signature = 0x1e910a (probably t2313)
avrdude: safemode: hfuse reads as DD
avrdude: safemode: efuse reads as FF
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 "test.hex"
avrdude: writing flash (1146 bytes):
Writing | ################################################## | 100% 1.38s
avrdude: 1146 bytes of flash written
avrdude: verifying flash memory against test.hex:
avrdude: load data flash data from input file test.hex:
avrdude: input file test.hex contains 1146 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 1.07s
avrdude: verifying ...
avrdude: 1146 bytes of flash verified
avrdude: safemode: hfuse reads as DD
avrdude: safemode: efuse reads as FF
avrdude: safemode: Fuses OK (E:FF, H:DD, L:64)
avrdude done. Thank you.
Na koniec fotka otrzymanego pająka:
Podsumowanie
No to tyle. Czemu w ogóle wrzucam ten wpis ? Po prostu ta przygoda uświadomiła mi, że czasem rozwiązania trudnych problemów są w zasięgu ręki, oraz ile zabawy można mieć z PI. Mam nadzieję, że was zachęci do przejrzenia starej elektroniki 🙂 To tyle, dzięki wszystkim którzy dotarli aż tutaj.
PS. jest wiele tutoriali ja w swojej zabawie z połączeniem tego wszystkiego do kupy opierałem się na świetnym http://ozzmaker.com/program-avr-using-raspberry-pi-gpio/. Jednak pamiętajcie, zawsze patrzcie na wyprowadzenia w zależności od układu który próbujecie podłączyć do maliny. Acha i rezystory 1kOhm na liniach GPIO używanych do SPI nie wydają się złym pomysłem 🙂 Ja po prostu nie miałem tylu rezystorów.