About this Blog

This blog is an engineering log book; for me to record the progress on my many projects and hopefully to inspire you.

Some projects do not get off the ground, they remain as interesting thoughts, a select few get some work done on them, even fewer get close to completion, and none get completed because unfortunately I subscribe to the theory: "If something ain't broke then it doesn't have enough features". If you'd like to collaborate on some work to get something to a useable state then send me some communications.

Being a blog, posts are listed in chronological order. However I usually have multiple projects on the go and will try to post some of my earlier work. With this in mind I'll try to add labels to each post so all posts relevant to one project can be easily extracted.

Enjoy and happy hacking.

Friday, August 29, 2008

It's Alive!

LEDs are a flashing. How exciting! Nothing gets a hardware engineer going like a couple of flashing LEDs. It symbolises success. Half the battle is won when you can program a piece of hardware to flash some LEDs. It means that you:
  1. Soldered the major components correctly,
  2. Have a working power supply,
  3. Have a tool chain for compiling programs for the hardware,
  4. Have a method for downloading the code to the hardware.
So I removed the 8MHz resonator connected to pins 2 and 3, not needed since the PIC has an internal RC oscillator. I soldered two LED resistor pairs between ground and pins 2 and 3 respectively. I then grabbed some assembly code from this site, and modified it to output to the two LEDs alternately. It is listed here:

; An LED Blinker

list p=12f675
include "p12f675.inc"

small_delay_tmp equ 0x20
long_delay_tmp equ 0x21

goto main

movlw 0xff
movwf small_delay_tmp
decfsz small_delay_tmp, F
goto small_delay_L1

; ----------------------------
; W contains count on entry.
; Store it in a temp variable.
; Keep on decrementing and
; calling small_delay
; ----------------------------

movwf long_delay_tmp
call small_delay
decfsz long_delay_tmp, F
goto long_delay_L1

; ----------------------------
; The main LED blinker
; ----------------------------


clrf GPIO
movlw 0x7
movwf CMCON ; disable comparator
movlw 0x0
movwf TRISIO ; All pins outputs

bcf GPIO, GP5
bsf GPIO, GP4
movlw 0xFF
call long_delay
bsf GPIO, GP5
bcf GPIO, GP4
movlw 0xFF
call long_delay
goto infinite


I assembled it through piklab with gpasm from gputils. I then downloaded it through the ICD2 programmer again using piklab, configured so that the board is powered through the ICD2 (it doesn't seem to work otherwise). Amazingly the LED's flash, just like they are supposed to. Yay.

I'm not a fan of programming in assembler, so I'm going to try a couple of C compilers like SDCC. Unfortunately the PIC12F675 has only 1 kwords (1 word = 14 bits = 1 opcode) of program space, so to getting a C program to fit maybe a challenge. But why not try.


George said...

Great blog! I have the same servo and I was just wondering if it was possible to increase the dead band of the input signal so it centres easier? If there is a way to do this in software or by adding minimal discrete components, then I'd be interested in trying it. You would be helping me a ton. Thanks.

Will said...

Yeah, should definitely be possible in software. Interesting that you want to increase the dead band. The other way would be to put some electronics between the pot and the micro. The electronics would lie to the micro about the position (i.e. it hasn't changed when the change is small). Although I can't think of a minimal component solution to do this. Give me a month or so and I'll have some working code. Just out of interest - what are you using the servo for?