This week's assignment is to use a desktop milling machine to mill a pre-designed printed circuit board "PCB".
The pcb we're going to mill is called FabISP which stands for In-System Programmer. This programmer is designed to program AVR Microcontrollers which are a family of microcontrollers developed by Atmel. AVR has a RISC Architecture instead of CISC, for those who don't understand what that means, the easy way to get it is that these kind of microcontrollers have a small set of simple and general instructions "reduced" and that's where the terminology RISC - Reduced Instruction Set Computer came from.
CISC - Complex Instruction Set Computer is the opposite, having complex low-level instructions.
The standard PCB Milling Machine in most fablabs is the Roland SRM-20. It's a desktop milling machine that we'll be using for PCB production and also creating molds.
The first step of producing a PCB is the actual design but for this week we already have the pre-designed FabISP so we got to milling directly.
The board we will mill is shown in the below image. We have to launch 2 separate cut jobs, the first to engrave the traces of the circuit and for that we use a 1/64" end mill. The second is to cut the outer border of the board using a 1/32" end mill and with a cut depth that's equal to the copper sheet's thickness, in our case 1.8mm.
We have to upload the above designs to a CAM - Computer Aided Manufacturing Processor to set the correct settings for the machine and the tool path of the milling process. The CAM Processor usually used in our fablab for PCB Production is called FlatCAM but we used the one developed by the FabFoundation which is Fab Modules.
Fab Modules is pretty easy to use, I used the input format of image PNG since the designs we have are in that format. The output format was chosed to be Roland Mill (rml) and the process is PCB Traces 1/64 for the inner traces of the baord.
On the right of the webpage, in the output section I chose the following settings:
After setting these settings I pressed calculate and it shows me the how the spindle will move to process the job. This is shown in the below image.
Then I have to setup the machine, I changed the endmill to 1/64", then I set the zero for x, y & z. The x & y was easy, I just moved the spindle to where I want my job to start and set it as zero.
The z however, was a different story. When I inserted the endmill, I made it go all the way thorugh, then I moved the spindle so it's very close to the copper sheet then I loosened the screw and made the endmill touch the copper surface then I set that as zero.
The job took about 10-15 minutes. When it finished, I noticed some parts of the cut traces were actually shiny which means it didn't cut through which means the traces are still connected. To make validate my assumption I used the multimeter to check the connection and I was right.
To solve this I used paint to recolor the parts that were properly milled leaving only that traces that were still shiny as seen below.
After that, I re-calibrated the z-axis manually by making drop 2 more steps (0.02mm). While I was doing that, I forgot to switch to single steps and went down in steps of 100 which caused the endmill to break! OPS!!
Next, I input the edited image to the CAM Processer and set the same settings.
Finally, I did the final cut for the outer board. The cut depth was set to 1.8mm and the number of offset to 1 since it will cut through. Before launching the job, I changed the endmill to 1/32" and set a new zero for the z-axis. The settings to cut the border are listed below.
The milled board is seen below :)
The part where the metal ruler is pointed to was still connected to the outer border, it was still shiny and I tested the connection with the multimeter so instead of repeating the mill and messing the perfectly good traces, I manually cut the connection by scraping it with the metal ruler and it worked! Yaaay!!
Now comes the hard part "Soldering". I did soldering before but smd components just once and 2 years ago! So this was a bit tricky. The hard part is to find just the correct amount of time to heat the trace and the part to have solder distribute some what evenly between them. I got it done after about an hour o and a half of focused non-stop soldering! The below gif shows the process of populating my milled board. The critical parts when it comes to orientation or polarity are: the diodes & the Attiny44 Chip.
I used the below schemtics & labelled diagram to solder correctly.
The electronic components I used are listed in the below table.
Component | Quantity |
---|---|
ATTiny 44 microcontroller | 1 |
1uf Capacitor | 1 |
0.1uf Capacitor | 1 |
10pf Capacitor | 2 |
100 Ohm Resistor | 2 |
49 Ohm Resistor | 1 |
1K Ohm Resistor | 1 |
10K Ohm Resistor | 1 |
6 Pin Header | 1 |
20 MHz Crystal | 1 |
And here's how my finished board looks like :)
Next, we get to the fun part! programming!
We can program the board using windows but it's harder so to program it, I decided to use Linux's Ubuntu.
to do that, I had two options, the first, to have a linux virtual machine running on my computer, but I don't think my computer can handle it. The second option, to boot Ubuntu from a USB drive.
I chose the later. To do that, I followed the setps in this tutorial and changed the BIOS boot settings in my computer to have it boot from a USB drive when it detects it.
The board we milled is an ISP - In System Programmer which means it's designed to program other boards that we will probably create in a couple of weeks! Yaaay!
ISP enables us to program boards for specific functions when you decide to use them which means you don't have to buy pre-programmed boards making life much easier.
To program my board, I have to install the necessary packages for AVR Programming. AVR is the family of the chip we used in our board Attiny44. To install the packages, I followed the below steps.
The below commands are not for the ISP but for my computer to install the necessary drivers & packages:.
sudo apt-get install flex byacc bison gcc libusb-dev avrdude
sudo apt-get install gcc-avr
sudo apt-get install avr-libc
sudo apt-get install libc6-dev
The following commands are to download the firmware. Firmwares are kinda like the DNA of the board, it's something permenant and is burnt on a read-only memory. I downloaded it on the desktop and unzipped it.
cd ~/Desktop
wget http://academy.cba.mit.edu/classes/embedded_programming/firmware.zip
unzip firmware.zip
The funny thing about this board, is that it needs another board to program it and I remember getting really confused from the amount of times we said programm & programmer to understand how this thing works.
Anyway, back to the topic, so I used Arduino to program my board. To do that I connected Arduino to the computer and installed the pre-existing code available with the examples called Arduino ISP.
After that, I connected my board to the Arduino I programmed as seen in the below image.
After that, I connected the arduino and my milled board to my computer and then opened the terminal.
To understand the next commands, you need understand what a makefile is. A makefile is a bunch of rules that explains how your board reacts based on certain prerequisites which affects the outcome of the program, called "target". In the end you'll have an executable file that dictates how your board operates.
sudo make clean
: Deletes existing executable files in the directory.sudo make hex
: Creates new updated files.
Then I opened the MakeFile and commented this line AVRDUDE = avrdude -c avrisp2 -P usb -p $(DEVICE)
by adding a hashtag "#" and instead I typed AVRDUDE = avrdude -c stk500v1 -P /dev/ttyACM0 -b19200 -p $(DEVICE)
Then typed:
sudo make fuse
: This links the executable file with the makefile.
sudo make program:
This compiles the program.
You can see below my terminal log.
ubuntu@ubuntu:~$ sudo apt-get update Ign:1 cdrom://Ubuntu 16.04.3 LTS _Xenial Xerus_ - Release amd64 (20170801) xenial InRelease Hit:2 cdrom://Ubuntu 16.04.3 LTS _Xenial Xerus_ - Release amd64 (20170801) xenial Release Hit:4 http://security.ubuntu.com/ubuntu xenial-security InRelease Hit:5 http://us.archive.ubuntu.com/ubuntu xenial InRelease Hit:6 http://us.archive.ubuntu.com/ubuntu xenial-updates InRelease Reading package lists... Done ubuntu@ubuntu:~$ sudo apt-get install flex byacc bison gcc libusb-dev avrdude Reading package lists... Done Building dependency tree Reading state information... Done gcc is already the newest version (4:5.3.1-1ubuntu1). The following additional packages will be installed: libbison-dev libfl-dev libftdi1 libsigsegv2 m4 Suggested packages: avrdude-doc bison-doc The following NEW packages will be installed: avrdude bison byacc flex libbison-dev libfl-dev libftdi1 libsigsegv2 libusb-dev m4 0 upgraded, 10 newly installed, 0 to remove and 385 not upgraded. Need to get 1,501 kB of archives. After this operation, 4,607 kB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 libsigsegv2 amd64 2.10-4 [14.1 kB] Get:2 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 m4 amd64 1.4.17-5 [195 kB] Get:3 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 libfl-dev amd64 2.6.0-11 [12.5 kB] Get:4 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 flex amd64 2.6.0-11 [290 kB] Get:5 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 libbison-dev amd64 2:3.0.4.dfsg-1 [338 kB] Get:6 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 bison amd64 2:3.0.4.dfsg-1 [259 kB] Get:7 http://us.archive.ubuntu.com/ubuntu xenial/universe amd64 libftdi1 amd64 0.20-4build1 [15.2 kB] Get:8 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 libusb-dev amd64 2:0.1.12-28 [29.9 kB] Get:9 http://us.archive.ubuntu.com/ubuntu xenial/universe amd64 avrdude amd64 6.2-5 [291 kB] Get:10 http://us.archive.ubuntu.com/ubuntu xenial/universe amd64 byacc amd64 20140715-1 [56.9 kB] Fetched 1,501 kB in 7s (198 kB/s) Selecting previously unselected package libsigsegv2:amd64. (Reading database ... 194399 files and directories currently installed.) Preparing to unpack .../libsigsegv2_2.10-4_amd64.deb ... Unpacking libsigsegv2:amd64 (2.10-4) ... Selecting previously unselected package m4. Preparing to unpack .../archives/m4_1.4.17-5_amd64.deb ... Unpacking m4 (1.4.17-5) ... Selecting previously unselected package libfl-dev:amd64. Preparing to unpack .../libfl-dev_2.6.0-11_amd64.deb ... Unpacking libfl-dev:amd64 (2.6.0-11) ... Selecting previously unselected package flex. Preparing to unpack .../flex_2.6.0-11_amd64.deb ... Unpacking flex (2.6.0-11) ... Selecting previously unselected package libbison-dev:amd64. Preparing to unpack .../libbison-dev_2%3a3.0.4.dfsg-1_amd64.deb ... Unpacking libbison-dev:amd64 (2:3.0.4.dfsg-1) ... Selecting previously unselected package bison. Preparing to unpack .../bison_2%3a3.0.4.dfsg-1_amd64.deb ... Unpacking bison (2:3.0.4.dfsg-1) ... Selecting previously unselected package libftdi1:amd64. Preparing to unpack .../libftdi1_0.20-4build1_amd64.deb ... Unpacking libftdi1:amd64 (0.20-4build1) ... Selecting previously unselected package libusb-dev. Preparing to unpack .../libusb-dev_2%3a0.1.12-28_amd64.deb ... Unpacking libusb-dev (2:0.1.12-28) ... Selecting previously unselected package avrdude. Preparing to unpack .../avrdude_6.2-5_amd64.deb ... Unpacking avrdude (6.2-5) ... Selecting previously unselected package byacc. Preparing to unpack .../byacc_20140715-1_amd64.deb ... Unpacking byacc (20140715-1) ... Processing triggers for install-info (6.1.0.dfsg.1-5) ... Processing triggers for man-db (2.7.5-1) ... Processing triggers for libc-bin (2.23-0ubuntu9) ... Processing triggers for doc-base (0.10.7) ... Processing 33 changed doc-base files, 2 added doc-base files... Setting up libsigsegv2:amd64 (2.10-4) ... Setting up m4 (1.4.17-5) ... Setting up libfl-dev:amd64 (2.6.0-11) ... Setting up flex (2.6.0-11) ... Setting up libbison-dev:amd64 (2:3.0.4.dfsg-1) ... Setting up bison (2:3.0.4.dfsg-1) ... update-alternatives: using /usr/bin/bison.yacc to provide /usr/bin/yacc (yacc) in auto mode Setting up libftdi1:amd64 (0.20-4build1) ... Setting up libusb-dev (2:0.1.12-28) ... Setting up avrdude (6.2-5) ... Setting up byacc (20140715-1) ... Processing triggers for libc-bin (2.23-0ubuntu9) ... ubuntu@ubuntu:~$ sudo apt-get install gcc-avr Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: binutils-avr Suggested packages: task-c-devel gcc-doc avr-libc The following NEW packages will be installed: binutils-avr gcc-avr 0 upgraded, 2 newly installed, 0 to remove and 385 not upgraded. Need to get 14.1 MB of archives. After this operation, 74.1 MB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://us.archive.ubuntu.com/ubuntu xenial/universe amd64 binutils-avr amd64 2.25+Atmel3.5.0-2 [1,425 kB] Get:2 http://us.archive.ubuntu.com/ubuntu xenial/universe amd64 gcc-avr amd64 1:4.9.2+Atmel3.5.0-1 [12.7 MB] Fetched 14.1 MB in 7s (1,945 kB/s) Selecting previously unselected package binutils-avr. (Reading database ... 194706 files and directories currently installed.) Preparing to unpack .../binutils-avr_2.25+Atmel3.5.0-2_amd64.deb ... Unpacking binutils-avr (2.25+Atmel3.5.0-2) ... Selecting previously unselected package gcc-avr. Preparing to unpack .../gcc-avr_1%3a4.9.2+Atmel3.5.0-1_amd64.deb ... Unpacking gcc-avr (1:4.9.2+Atmel3.5.0-1) ... Processing triggers for man-db (2.7.5-1) ... Setting up binutils-avr (2.25+Atmel3.5.0-2) ... Setting up gcc-avr (1:4.9.2+Atmel3.5.0-1) ... ubuntu@ubuntu:~$ sudo apt-get install avr-libc Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: avr-libc 0 upgraded, 1 newly installed, 0 to remove and 385 not upgraded. Need to get 4,378 kB of archives. After this operation, 37.3 MB of additional disk space will be used. Get:1 http://us.archive.ubuntu.com/ubuntu xenial/universe amd64 avr-libc all 1:1.8.0+Atmel3.5.0-1 [4,378 kB] Fetched 4,378 kB in 7s (555 kB/s) Selecting previously unselected package avr-libc. (Reading database ... 195450 files and directories currently installed.) Preparing to unpack .../avr-libc_1%3a1.8.0+Atmel3.5.0-1_all.deb ... Unpacking avr-libc (1:1.8.0+Atmel3.5.0-1) ... Processing triggers for man-db (2.7.5-1) ... Setting up avr-libc (1:1.8.0+Atmel3.5.0-1) ... ubuntu@ubuntu:~$ sudo apt-get install libc6-dev Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: libc-dev-bin libc6 libc6-dbg Suggested packages: glibc-doc The following packages will be upgraded: libc-dev-bin libc6 libc6-dbg libc6-dev 4 upgraded, 0 newly installed, 0 to remove and 381 not upgraded. Need to get 8,411 kB of archives. After this operation, 2,048 B of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://security.ubuntu.com/ubuntu xenial-security/main amd64 libc6-dev amd64 2.23-0ubuntu10 [2,079 kB] Get:2 http://security.ubuntu.com/ubuntu xenial-security/main amd64 libc-dev-bin amd64 2.23-0ubuntu10 [68.7 kB] Get:3 http://security.ubuntu.com/ubuntu xenial-security/main amd64 libc6-dbg amd64 2.23-0ubuntu10 [3,683 kB] Get:4 http://security.ubuntu.com/ubuntu xenial-security/main amd64 libc6 amd64 2.23-0ubuntu10 [2,580 kB] Fetched 8,411 kB in 12s (671 kB/s) Preconfiguring packages ... (Reading database ... 197925 files and directories currently installed.) Preparing to unpack .../libc6-dev_2.23-0ubuntu10_amd64.deb ... Unpacking libc6-dev:amd64 (2.23-0ubuntu10) over (2.23-0ubuntu9) ... Preparing to unpack .../libc-dev-bin_2.23-0ubuntu10_amd64.deb ... Unpacking libc-dev-bin (2.23-0ubuntu10) over (2.23-0ubuntu9) ... Preparing to unpack .../libc6-dbg_2.23-0ubuntu10_amd64.deb ... Unpacking libc6-dbg:amd64 (2.23-0ubuntu10) over (2.23-0ubuntu9) ... Preparing to unpack .../libc6_2.23-0ubuntu10_amd64.deb ... Unpacking libc6:amd64 (2.23-0ubuntu10) over (2.23-0ubuntu9) ... Setting up libc6:amd64 (2.23-0ubuntu10) ... Setting up libc-dev-bin (2.23-0ubuntu10) ... Setting up libc6-dev:amd64 (2.23-0ubuntu10) ... Setting up libc6-dbg:amd64 (2.23-0ubuntu10) ... Processing triggers for libc-bin (2.23-0ubuntu9) ... Processing triggers for man-db (2.7.5-1) ... ubuntu@ubuntu:~$ cd ~/Desktop ubuntu@ubuntu:~/Desktop$ wget http://academy.cba.mit.edu/classes/embedded_programming/firmware.zip --2018-02-19 12:32:28-- http://academy.cba.mit.edu/classes/embedded_programming/firmware.zip Resolving academy.cba.mit.edu (academy.cba.mit.edu)... 18.85.8.25 Connecting to academy.cba.mit.edu (academy.cba.mit.edu)|18.85.8.25|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 141728 (138K) [application/zip] Saving to: ‘firmware.zip’ firmware.zip 100%[===================>] 138.41K 273KB/s in 0.5s 2018-02-19 12:32:29 (273 KB/s) - ‘firmware.zip’ saved [141728/141728] ubuntu@ubuntu:~/Desktop$ unzip firmware.zip Archive: firmware.zip creating: fabISP_mac.0.8.2_firmware/ inflating: fabISP_mac.0.8.2_firmware/.DS_Store creating: __MACOSX/ creating: __MACOSX/fabISP_mac.0.8.2_firmware/ inflating: __MACOSX/fabISP_mac.0.8.2_firmware/._.DS_Store inflating: fabISP_mac.0.8.2_firmware/main.c inflating: __MACOSX/fabISP_mac.0.8.2_firmware/._main.c inflating: fabISP_mac.0.8.2_firmware/main.elf inflating: fabISP_mac.0.8.2_firmware/main.hex inflating: fabISP_mac.0.8.2_firmware/main.o inflating: fabISP_mac.0.8.2_firmware/Makefile inflating: __MACOSX/fabISP_mac.0.8.2_firmware/._Makefile inflating: fabISP_mac.0.8.2_firmware/usbconfig.h inflating: __MACOSX/fabISP_mac.0.8.2_firmware/._usbconfig.h creating: fabISP_mac.0.8.2_firmware/usbdrv/ inflating: fabISP_mac.0.8.2_firmware/usbdrv/.DS_Store creating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/ inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._.DS_Store inflating: fabISP_mac.0.8.2_firmware/usbdrv/asmcommon.inc inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._asmcommon.inc inflating: fabISP_mac.0.8.2_firmware/usbdrv/Changelog.txt inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._Changelog.txt inflating: fabISP_mac.0.8.2_firmware/usbdrv/CommercialLicense.txt inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._CommercialLicense.txt inflating: fabISP_mac.0.8.2_firmware/usbdrv/License.txt inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._License.txt inflating: fabISP_mac.0.8.2_firmware/usbdrv/oddebug.c inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._oddebug.c inflating: fabISP_mac.0.8.2_firmware/usbdrv/oddebug.h inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._oddebug.h inflating: fabISP_mac.0.8.2_firmware/usbdrv/oddebug.o inflating: fabISP_mac.0.8.2_firmware/usbdrv/Readme.txt inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._Readme.txt inflating: fabISP_mac.0.8.2_firmware/usbdrv/USB-ID-FAQ.txt inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._USB-ID-FAQ.txt inflating: fabISP_mac.0.8.2_firmware/usbdrv/USB-IDs-for-free.txt inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._USB-IDs-for-free.txt inflating: fabISP_mac.0.8.2_firmware/usbdrv/usbconfig-prototype.h inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._usbconfig-prototype.h inflating: fabISP_mac.0.8.2_firmware/usbdrv/usbdrv.c inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._usbdrv.c inflating: fabISP_mac.0.8.2_firmware/usbdrv/usbdrv.h inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._usbdrv.h inflating: fabISP_mac.0.8.2_firmware/usbdrv/usbdrv.o inflating: fabISP_mac.0.8.2_firmware/usbdrv/usbdrvasm.asm inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._usbdrvasm.asm inflating: fabISP_mac.0.8.2_firmware/usbdrv/usbdrvasm.o inflating: fabISP_mac.0.8.2_firmware/usbdrv/usbdrvasm.S inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._usbdrvasm.S inflating: fabISP_mac.0.8.2_firmware/usbdrv/usbdrvasm12.inc inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._usbdrvasm12.inc inflating: fabISP_mac.0.8.2_firmware/usbdrv/usbdrvasm128.inc inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._usbdrvasm128.inc inflating: fabISP_mac.0.8.2_firmware/usbdrv/usbdrvasm15.inc inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._usbdrvasm15.inc inflating: fabISP_mac.0.8.2_firmware/usbdrv/usbdrvasm16.inc inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._usbdrvasm16.inc inflating: fabISP_mac.0.8.2_firmware/usbdrv/usbdrvasm165.inc inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._usbdrvasm165.inc inflating: fabISP_mac.0.8.2_firmware/usbdrv/usbdrvasm18-crc.inc inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._usbdrvasm18-crc.inc inflating: fabISP_mac.0.8.2_firmware/usbdrv/usbdrvasm20.inc inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._usbdrvasm20.inc inflating: fabISP_mac.0.8.2_firmware/usbdrv/USBID-License.txt inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._USBID-License.txt inflating: fabISP_mac.0.8.2_firmware/usbdrv/usbportability.h inflating: __MACOSX/fabISP_mac.0.8.2_firmware/usbdrv/._usbportability.h ubuntu@ubuntu:~/Desktop$ cd ls bash: cd: ls: No such file or directory ubuntu@ubuntu:~/Desktop$ ls examples.desktop firmware.zip ubiquity.desktop fabISP_mac.0.8.2_firmware __MACOSX ubuntu@ubuntu:~/Desktop$ cd fabISP_mac.0.8.2_firmware/ ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ ls main.c main.elf main.hex main.o Makefile usbconfig.h usbdrv ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ make clean rm -f main.hex main.lst main.obj main.cof main.list main.map main.eep.hex main.elf *.o usbdrv/*.o main.s usbdrv/oddebug.s usbdrv/usbdrv.s ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ make hex avr-gcc -Wall -Os -DF_CPU=20000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -c usbdrv/usbdrv.c -o usbdrv/usbdrv.o avr-gcc -Wall -Os -DF_CPU=20000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -x assembler-with-cpp -c usbdrv/usbdrvasm.S -o usbdrv/usbdrvasm.o avr-gcc -Wall -Os -DF_CPU=20000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -c usbdrv/oddebug.c -o usbdrv/oddebug.o avr-gcc -Wall -Os -DF_CPU=20000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -c main.c -o main.o main.c:88:13: warning: always_inline function might not be inlinable [-Wattributes] static void delay ( void ) ^ avr-gcc -Wall -Os -DF_CPU=20000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -o main.elf usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o rm -f main.hex main.eep.hex avr-objcopy -j .text -j .data -O ihex main.elf main.hex avr-size main.hex text data bss dec hex filename 0 1986 0 1986 7c2 main.hex ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ make fuse avrdude -c stk500v1 -P /dev/ttyACM0 -b19200 -p attiny44 -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied avrdude done. Thank you. Makefile:119: recipe for target 'fuse' failed make: *** [fuse] Error 1 ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ make program avrdude -c stk500v1 -P /dev/ttyACM0 -b19200 -p attiny44 -U flash:w:main.hex:i avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied avrdude done. Thank you. Makefile:125: recipe for target 'flash' failed make: *** [flash] Error 1 ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ make fuse avrdude -c stk500v1 -P /dev/ttyACM0 -b19200 -p attiny44 -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied avrdude done. Thank you. Makefile:119: recipe for target 'fuse' failed make: *** [fuse] Error 1 ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ make fuse avrdude -c stk500v1 -P /dev/ttyACM0 -b19200 -p attiny44 -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied avrdude done. Thank you. Makefile:119: recipe for target 'fuse' failed make: *** [fuse] Error 1 ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ make fuse avrdude -c stk500v1 -P /dev/ttyACM0 -b19200 -p attiny44 -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied avrdude done. Thank you. Makefile:119: recipe for target 'fuse' failed make: *** [fuse] Error 1 ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ make fuse avrdude -c stk500v1 -P /dev/ttyACM0 -b19200 -p attiny44 -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied avrdude done. Thank you. Makefile:119: recipe for target 'fuse' failed make: *** [fuse] Error 1 ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ make clean rm -f main.hex main.lst main.obj main.cof main.list main.map main.eep.hex main.elf *.o usbdrv/*.o main.s usbdrv/oddebug.s usbdrv/usbdrv.s ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ make hex avr-gcc -Wall -Os -DF_CPU=20000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -c usbdrv/usbdrv.c -o usbdrv/usbdrv.o avr-gcc -Wall -Os -DF_CPU=20000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -x assembler-with-cpp -c usbdrv/usbdrvasm.S -o usbdrv/usbdrvasm.o avr-gcc -Wall -Os -DF_CPU=20000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -c usbdrv/oddebug.c -o usbdrv/oddebug.o avr-gcc -Wall -Os -DF_CPU=20000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -c main.c -o main.o main.c:88:13: warning: always_inline function might not be inlinable [-Wattributes] static void delay ( void ) ^ avr-gcc -Wall -Os -DF_CPU=20000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -o main.elf usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o rm -f main.hex main.eep.hex avr-objcopy -j .text -j .data -O ihex main.elf main.hex avr-size main.hex text data bss dec hex filename 0 1986 0 1986 7c2 main.hex ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ make fuse avrdude -c stk500v1 -P /dev/ttyACM0 -b19200 -p attiny44 -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied avrdude done. Thank you. Makefile:119: recipe for target 'fuse' failed make: *** [fuse] Error 1 ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ sudo make fuse avrdude -c stk500v1 -P /dev/ttyACM0 -b19200 -p attiny44 -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.02s avrdude: Device signature = 0x1e9207 (probably t44) avrdude: reading input file "0xDF" avrdude: writing hfuse (1 bytes): Writing | ################################################## | 100% 0.01s avrdude: 1 bytes of hfuse written avrdude: verifying hfuse memory against 0xDF: avrdude: load data hfuse data from input file 0xDF: avrdude: input file 0xDF contains 1 bytes avrdude: reading on-chip hfuse data: Reading | ################################################## | 100% 0.01s avrdude: verifying ... avrdude: 1 bytes of hfuse verified avrdude: reading input file "0xFF" avrdude: writing lfuse (1 bytes): Writing | ################################################## | 100% 0.02s avrdude: 1 bytes of lfuse written avrdude: verifying lfuse memory against 0xFF: avrdude: load data lfuse data from input file 0xFF: avrdude: input file 0xFF contains 1 bytes avrdude: reading on-chip lfuse data: Reading | ################################################## | 100% 0.01s avrdude: verifying ... avrdude: 1 bytes of lfuse verified avrdude: safemode: Fuses OK (E:FF, H:DF, L:FF) avrdude done. Thank you. ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ sudo make program avrdude -c stk500v1 -P /dev/ttyACM0 -b19200 -p attiny44 -U flash:w:main.hex:i avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.02s avrdude: Device signature = 0x1e9207 (probably t44) 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 "main.hex" avrdude: writing flash (1986 bytes): Writing | ################################################## | 100% 2.88s avrdude: 1986 bytes of flash written avrdude: verifying flash memory against main.hex: avrdude: load data flash data from input file main.hex: avrdude: input file main.hex contains 1986 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 1.45s avrdude: verifying ... avrdude: 1986 bytes of flash verified avrdude: safemode: Fuses OK (E:FF, H:DF, L:FF) avrdude done. Thank you. avrdude -c stk500v1 -P /dev/ttyACM0 -b19200 -p attiny44 -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.02s avrdude: Device signature = 0x1e9207 (probably t44) avrdude: reading input file "0xDF" avrdude: writing hfuse (1 bytes): Writing | ################################################## | 100% 0.01s avrdude: 1 bytes of hfuse written avrdude: verifying hfuse memory against 0xDF: avrdude: load data hfuse data from input file 0xDF: avrdude: input file 0xDF contains 1 bytes avrdude: reading on-chip hfuse data: Reading | ################################################## | 100% 0.01s avrdude: verifying ... avrdude: 1 bytes of hfuse verified avrdude: reading input file "0xFF" avrdude: writing lfuse (1 bytes): Writing | ################################################## | 100% 0.01s avrdude: 1 bytes of lfuse written avrdude: verifying lfuse memory against 0xFF: avrdude: load data lfuse data from input file 0xFF: avrdude: input file 0xFF contains 1 bytes avrdude: reading on-chip lfuse data: Reading | ################################################## | 100% 0.01s avrdude: verifying ... avrdude: 1 bytes of lfuse verified avrdude: safemode: Fuses OK (E:FF, H:DF, L:FF) avrdude done. Thank you. ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ lsusb Bus 002 Device 005: ID 2341:0043 Arduino SA Uno R3 (CDC ACM) Bus 002 Device 003: ID 0781:5567 SanDisk Corp. Cruzer Blade Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 064e:a21b Suyin Corp. Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ lsusb Bus 002 Device 005: ID 2341:0043 Arduino SA Uno R3 (CDC ACM) Bus 002 Device 003: ID 0781:5567 SanDisk Corp. Cruzer Blade Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 064e:a21b Suyin Corp. Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ lsusb Bus 002 Device 005: ID 2341:0043 Arduino SA Uno R3 (CDC ACM) Bus 002 Device 003: ID 0781:5567 SanDisk Corp. Cruzer Blade Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 064e:a21b Suyin Corp. Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ lsusb Bus 002 Device 005: ID 2341:0043 Arduino SA Uno R3 (CDC ACM) Bus 002 Device 003: ID 0781:5567 SanDisk Corp. Cruzer Blade Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 064e:a21b Suyin Corp. Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ lsusb Bus 002 Device 083: ID 2341:0043 Arduino SA Uno R3 (CDC ACM) Bus 002 Device 003: ID 0781:5567 SanDisk Corp. Cruzer Blade Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 064e:a21b Suyin Corp. Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ lsusb Bus 002 Device 083: ID 2341:0043 Arduino SA Uno R3 (CDC ACM) Bus 002 Device 003: ID 0781:5567 SanDisk Corp. Cruzer Blade Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 064e:a21b Suyin Corp. Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ lsusb Bus 002 Device 083: ID 2341:0043 Arduino SA Uno R3 (CDC ACM) Bus 002 Device 003: ID 0781:5567 SanDisk Corp. Cruzer Blade Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 064e:a21b Suyin Corp. Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$ lsusb Bus 002 Device 083: ID 2341:0043 Arduino SA Uno R3 (CDC ACM) Bus 002 Device 003: ID 0781:5567 SanDisk Corp. Cruzer Blade Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 064e:a21b Suyin Corp. Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ubuntu@ubuntu:~/Desktop/fabISP_mac.0.8.2_firmware$
And here's a screenshot of my work.
I had a little extra time, so I decided to do some testing with flexible PCB, so I inserted the image to CorelDraw and colored the edges red to cut.
Then I set the cut job as I did last week but changed the settings to:
It worked perfectly from the very first try, I guess it was my lucky day!
You can download my files here.