Hotfix release available: 2014-09-29d "Hrun". upgrade now! [46.4] (what's this?)
Hotfix release available: 2014-09-29c "Hrun". upgrade now! [46.3] (what's this?)

User Tools


Embedded Programming

Embedded Programming

Goal

* read a microcontroller data sheet * program your board to do something, with as many different programming languages and programming environments as possible

Microcontroller

I intended to use Attiny 45 and therefore I read the datasheet of Attiny 25/45/85. One of the most important thing in the sheet is the functions of the pins. This matters when you lay components and wiring them. Based on the datasheet, I made another board with a compact design. I used the following pins:

  1. RESET
  2. XTAL1 (crystal)
  3. XTAL2 (crystal)
  4. GND
  5. MOSI
  6. MISO / Arduino Pin 1
  7. Not used.
  8. VCC

—-

Programming

I used Arduino as ISP because I could not make it work in electronics production after several attempts. I installed Arduino and Arduino as ISP package in ---- Manager. After uploading the Arduino as ISP example to Arduino Uno, I selected 'Attiny 45' as board to upload the program to Attiny via Arduino with the following pins connected.

pin name:    not-mega:         mega(1280 and 2560)
slave reset: 10:               53
MOSI:        11:               51
MISO:        12:               50
SCK:         13:               52

My board had an external 20 Mhz oscillator. Therefore I could set my Attiny 45 to run 20 Mhz. I checked 20 Mhz clock and burned bootloader in Arduino IDE. Then it was ready to upload to my board. I uploaded the following code. This was a modified code of Sweep example. The servo motor will continuously turn in one direction for a few seconds and then turn to the other.

#include <SoftwareServo.h> 
SoftwareServo myservo;             // create servo object to control a servo 
void setup() {
  myservo.attach(1);                  // attaches the servo on pin 1 to the servo object 
}
void loop() {
  turn(5);
  delay(1000);
}
void turn(int delayTime) {
// turn the servo with speed decided by delayTime
// delayTime should not be smaller than the time the servo needs to reach the position (about 5 miliseoncds)
  int i=0;
  for(i = 0; i < 180; i++) {           // goes from 0 degrees to 180 degrees, in steps of 1 degree 
    myservo.write(i);                 // tell servo to go to position in variable 'pos' 
    delay(delayTime);                // waits for the servo to reach the position 
    SoftwareServo::refresh();
  } 
  for(i = 180; i >=  0; i--) {         // goes from 180 degrees to 0 degrees                          
    myservo.write(i);                 // tell servo to go to position in variable 'pos' 
    delay(delayTime);                // waits 15ms for the servo to reach the position 
    SoftwareServo::refresh();
  } 
}
Or watch the video at Youtube