Embedded programming
This week the assignment was to:
ATtiny24/44/84 is a low-power CMOS 8-bit microcontroller based on the AVR enhanced RISC architecture. By executing powerful instructions in a single clock cycle, the ATtiny24/44/84 achieves throughputs approaching 1 MIPS per MHz allowing the system designer to optimize power consumption versus processing speed.
The attiny44 has a similar pinout as the attiny 84 and 24. below is a picture of the pinout diagram
pinout diagram
My aim was to program with as many environments as possible and as many languages as possible. some of the environments i tried are:
To install arduino ide in ubuntu 16.0 i used the command
sudo apt-get update && sudo apt-get install arduino arduino-coreI set on to test the two IDEs (arduino and Eclipse). i wrote a sketch on Arduino as follows. It was pretty straightforward .The eclipse IDE however posed a lot of challenges since it did not have all the required plugins. The arduino sketch set the 4th pin as the pushbutton pin and the 5th one as the led pin. it then sets the led pin as output and the button pin as input. In the main loop the code is set to check if the button pin is high (pressed) to turn on the led otherwise the led stayed off
programming with arduino
programming with eclipse
I found Gcc a good platform to use for programming especially on linux. I simply wrote my code on a text editor and saved it as a .c file. I also wrote a makefile for the program. I saved both files in one folder. I then entered that directory using terminal. and typed the make command. Running this command creates a hexadecimal file with the suffix .hex which can now be uploaded using the command below
avrdude -c usbtiny -p t44 -u -U flash:w:blink.c.hex:i
-c: This is the programmer used. in my case i used fabisp so i wrote usbtiny
-p: This denotes the type of chip you are programming. the attiny44 is denoted using t44
-u: represents the type of memory which in this case is flash memory.
The file name is blink.c.hex and the command is terminated using the :i.
Terminal output after typing the make command
Terminal output after program upload
#include <avr/io.h>
#include<util/delay.h>
int main (void)
{
DDRB = 0b00000100;
//create an infinite loop
while(1) {
//turns B2 HIGH
PORTB =0b00000100;
//PAUSE 100 miliseconds
_delay_ms(100);
//turns B2 LOW
PORTB= 0b00000000;
//PAUSE 100 miliseconds
_delay_ms(100);
};
}
The program for blinking the led is written i c language. since the led is connected to pin 2 on port b i used the following command to turn it on which sets PB2 to high
PORTB =0b00000100; //turns B2 HIGH _delay_ms(100); //PAUSE 100 miliseconds
To turn the led off is controlled by the code segment below which sets PB2 to zero
PORTB= 0b00000000; //turns B2 LOW //PAUSE 100 miliseconds _delay_ms(100);
loading program using fab isp
connection
connection
I then went on to program the button so that it can control the led. Unfortunately i had connected the button to pin4 which is the RESET pin. The outcome was not as expected. The led went off when the button was pressed instead of blinking faster. Check the video below.
To solve this problem i had to disable the reset pin. This i did by entering the following command.
avrdude -c avrispmkII -p t44 -u -U hfuse:w:0x5A:m
This brought the feedback below
felicity@felicity-HP-Pavilion-15-Notebook-PC:~$ avrdude -c avrispmkII -p t44 -u -U hfuse:w:0x5A:m -v
avrdude: Version 6.2
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "/etc/avrdude.conf"
User configuration file is "/home/felicity/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
Using Port : usb
Using Programmer : avrispmkII
avrdude: usbdev_open(): Found AVRISP mkII, serno: 000200066355
AVR Part : ATtiny44
Chip Erase delay : 4500 us
PAGEL : P00
BS2 : P00
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 256 4 0 4000 4500 0xff 0xff
flash 65 6 32 0 yes 4096 64 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 1 0 0 0 0 0x00 0x00
Programmer Type : STK500V2
Description : Atmel AVR ISP mkII
Programmer Model: AVRISP mkII
Hardware Version: 1
Firmware Version Master : 1.24
Vtarget : 5.2 V
SCK period : 8.00 us
avrdude: stk500v2_command(): command failed
avrdude: stk500v2_program_enable(): bad AVRISPmkII connection status: Unknown status 0x00
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
avrdude done. Thank you.
#include <avr/io.h>
#include < util/delay.h & gt
int main(void)
{
DDRB |= 1 << PINB2; // setting PB2 as output
DDRB &= ~(1 << PINB3); // setting PB3 as input
PORTB |= 1 << PINB3; // sets PB3 high
while (1)
{
PORTB ^= 1 << PINB2; // toggle on and off on PB2
if (bit_is_clear(PINB, 3)) //Button press
{
_delay_ms(10); //Fast
}
else
{
_delay_ms(100); //Slow, from previous
}
}
}
break it down the following are the segments of the code
Since the button is connected to PB3 i set this to input. i also set PB2(button pin) as output. In this code segment i have used a method called bit shifting whereby i shift a binary 1 or 0 to a pin in a port by using the OR |= 1 << PINB2; operation. For setting a pin as an output i shift a 1 to the location and perform an AND operation then take the compliment~(1 << PINB3) of the outcome in order to set it to 0
DDRB |= 1 << PINB2; // setting PB2 as output DDRB &= ~(1 << PINB3); // setting PB3 as input PORTB |= 1 << PINB3; // sets PB3 high
Here the code checks for a button press usind the line if (bit_is_clear(PINB, 3)) then it makes the blinking faster by setting the delay to 10 miliseconds. Otherwise the blink rate is 100 miliseconds. The code PORTB ^= 1 << PINB2; turns the led on and off by changing the state of PB2 high and low respectively
while (1)
{
PORTB ^= 1 << PINB2; // toggle on and off on PB2
if (bit_is_clear(PINB, 3)) //Button press
{
_delay_ms(10); //Fast
}
else
{
_delay_ms(100); //Slow, from previous
}
}
After this the circuit responded as desired