Tuesday, December 9, 2014

Assembling The Boards

Originally I meant to contract out board assembly to some technicians on craigslist but I think I want greater control over even this stage of the process at least for the prototype(s).

So in keeping with the age old adage "if you want something done well, do it yourself" I have assembled the tools Ill need.

Soldering SMD parts almost always requires either a reflow oven or a hot plate. There is a $300 electronic reflow oven on ebay. Chinese made, works and doesnt take up too much space. However on youtube and on reddit various individuals have expressed more success using hotplates to reflow solder. Some even use electric skillets and an infrared temperature monitor

I purchased a $100 electronic hotplate on Ebay (YADGONG 946C from a seller in California with two) with enough surface area to handle an 8x8 sized board. Mine is 7.6 x 5.4. I also bought an IR temperature sensor for around $12 ... shipping included for both














Of course I might have need to do rework and I definitely need to hand solder some through hole parts on the board. With that in mind I bought the 2 in 1 SRS 852D+ reflow soldering station. This cost me about $61 on Ebay shipping included





Finally and possibly the most important tool on an Engineer/Inventors lab (outside of a digital multimeter) is an analog scope. My favorite Engineer vlogger Dave Johnson (eevblog on youtube) recommends ditching the fancy usb/pc scopes and getting a nice dual channel analog oscilloscope for starters. So I bought this Tektronix 464 100Mhz Dual Channel scope on Ebay for about $129 with $30 shipping from Rochester, NY.









Various other small tools like hand pump to lift and place SMT, soldering tools and tweezers, rework wire, solder paste, solder flux and enough parts to make a prototype and perhaps an initial run of 10 has been purchased on Ebay, CircuitSpecialists and Mouser


Once the solder paste and boards arrive I am good to go.

Monday, December 1, 2014

Message from Board Fabrication Plant ... boards are done and shipped

Pictures attached ... should be here in about a week and a half. cant wait. Btw
I am currently reading "Makers: The Next Industrial Revolution" by Chris Anderson.




I also got a stencil made since I plan on assembling/soldering this board at home. I bought a Hotplate and rework/soldering station last week on ebay in anticipation



Wednesday, November 19, 2014

project EGWU complete !!!






Its been a year ... a whole year since I set about designing this board. At lot has happened distractions wize some enormously stressful none of which I am comfortable going into on here.

But I  have finally completed the layout. Actually I finished the layout about a month ago but had been touching up and correcting problems since. Even this week - after submitting the gerber files to the Chinese PCB Fab plant (from Ebay) that will be doing the boards  ... I still had to revise it two more times (the plots not the layout) to satisfy them.

I am off the whole thanksgiving week and I am looking for a much needed "staycation". Ill also use the opportunity to start on the firmware. It will be another two and a half to three weeks before I see the 5 boards I ordered


Sillkscreen layer below







Wednesday, January 8, 2014

IAR kickstart dev kit for the LPC1788

Long story short I am working on my first commercial product and the lpc17xx series of cortex-m3 processors fits the bill.  Picked up this lpc1788 system on ebay for a whopping $47 + $16 = $63 verses the 399.99 it used to cost new. Board appears to power up - comes with JLINK lite for debugging ... Heres a breakdown and pics


LPC1788-SK evaluation board
Microcontroller
  • LPC1788FBD208 LQFP

User interfaces
  • 2x user buttons
  • LCD 3.5’’ 320x200 24bit color TFT with backlight and touch screen

Debug interfaces

  • JTAG/SWD connector - 20 pin 0.1’’
  • SWD connector - small 9 pin 0.05’’
  • ETMv3 connector - small 19 pin 0.05’’

Communication interfaces
  • RS232/ICSP
  • USB host and OTG
  • CAN driver and connector
  • IrDA
  • 100 Mbit Ethernet 12C routed to connector
  • UXT connector
  • EXT connector
  • QEI connector

Power functions
  • Multiple power supply options:
    - J-Link (pin 19)
    - Trace connector (pin 11&13)
    - External supply
  • Power supply LED

Additional features
  • Audio in and out
  • SD/MMC card connector
  • Trimpot
  • Accelerometer

Schematic for download (PDF)

J-Link Lite for ARM
J-Link Lite for ARM is a small JTAG/SWD hardware debug probe; it connects via USB to the PC host running Windows.
 






Thursday, November 21, 2013

the sort of bugs that keep you up at night - ripping your hair out

Ok so I figured Id test this $50 investment real quick, before I get back to work I am doing with the Xilinx Xcv3 Spartan board. Figured Id modify the my stm32 firmware/linker scripts for the different I/O ports on this board. Figured Id get it to where I was originally with USB access - didnt think it would take three days ...

I had encountered a serious error right off the bat. Where the code was generating hard faults with fault #3 in execution and systick handler #15 pending and never running (after the first time).

The cortex m3 pushes 8 registers on the stack whenever it takes an exception. So I modified stm32_nvic_fault_handler as follows

asm ("mrs r0, msp");
asm ("ldr   r1, [r0, #24]");

The value returned was something like 0x2000 0887. Checked the map file flash.map and found that was a line of code in the stm32_uart_puts() routine. I tried to disassemble it from within gdb and it balked after address 0x2000 0888.

I used monitor mdw 0x20000888 3 to look at the three words immediately after loading the file "load" and before setting a break point and running to main. I noticed that the value was changing when I got to main ... it made no sense.


I started to wonder why the stack (monitor reg sp) held a value other than the 0x20010000 I wanted it set to. After all the first instruction in main was forcing the stack with

asm ("ldr sp, =(0x20000000 + (64 * 1024) - 4)");

Thats when I noticed that when arm-linux-gnueabi-gdb ./usb_test.out runs it prints out

xPSR: 0x01000000 pc: 0x0800125 msp: 0x20000890

Where was it getting this value? The command
monitor reset halt
Should be placing it in a known state. But where was that. I checked the map file and found nothing that would lead me to believe it was using information I provided. I checked the openocd scripts for odd initialization parameters.

Then I remember that on the arm7 board I had a similar problem because the board would start up running from flash. So when I dumped the value of 0x0 it was 0x2000 0890.

EUREKA!!!

Jtag still allows it to boot from eeprom on reset before it grabs control and the stack value was corrupting my program in ram.

So the solution would have to be the same I did with the arm7 and other cortex-m3. I will wipe out the contents of flash.

I did it with.

monitor flash probe 0
monitor flash protect 0 0 127 off
monitor reset halt
monitor stm32f1x mass_erase 0
monitor flash protect 0 0 127 on 
 

Now arm-linux-gnueabi-gdb ./usb_test.out starts off with

xPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc

No where near my program at ram address 0x2000 0000 (64k of it on this ZET)



No more hard faults and my systick stay-alive-LED blinks once a second. Next Ill tackle uart and usb  ... if I have time













I purchased The Definitive Guide To Arm cortex-m3 this morning as well. It should shed a little more light on some gotchas - not necessarily listed or described well in the arm cortex m3 and the stm32 manuals

STM32F103ZET6 ARM Cortex-M3 Development Board

STM32F103ZET6(development board ) with FSMC,NAND/NOR FLASH 
STM32 development board based on STMicroelectronics (ST) has introduced the highest series of ARM CortexM3 chip configuration as the core component STM32F103ZET6
On-board resources:
* CPU: STM32F103ZET6; (LQFP144-pin, on-chip integrated 512K flash, 64KRAM, 12Bit A / D, D / A; PWM, CAN, USB, SDIO, FSMC and other resources)
* Outside the expanded board 512K SRAM, 2M NOR FLASH (on-board support for the largest 1024k SRAM, 16M of NOR FLASH) to meet the large capacity data acquisition, processing and analysis requirements
 

* Board outside 128M NAND FLASH expand to meet the rich color of the picture storage, data storage form, document management applications and so on
*FSMC control, color touch module configuration TSC2046 controller, support for a SD card (SPI mode) can be used to store pictures, in support of AT45DBxxx of a DATA FLASH (can be used for storage)
 

* All the way CAN communication interface, the drive chip SN65VHD230

* Two-way RS232 interface
 

* All the way RS485 communication interface

* A SD card connector SDIO control

* A I2C memory interface, the standard 24LC02 (EEPROM)

* A SPI memory interface, AT45DB161D or M45PE16V (DATA FLASH)
* All the way adjustment potentiometer ADC input

* Three-way leads to ADC input terminals

* Two-way terminal block PWM output leads

* Two-way leads to DAC output terminals
* A buzzer, the five users LED lights, a power indicator light, a USB communication indicator, four user keys, a system reset button
 * Power Select jumper to support the external 5V power supply, USB power supply or power supply by JLINK
* Board Size: 13CM X 10CM 




Tuesday, November 12, 2013

[peekstm32] the problem was data toggle

The odd thing was that the problem lay with JUST the peek function or host "IN" packets. I played around with the stm32_endp_isr_user_out() routines "IN" packet handling section. Wasnt sure of the state of DTOG_TX so I figured Id force it to 0 instead 1.

Immediately the first peek command from the next run worked and failed there after. After playing around with DTOG_TX forced to 1, toggled I finally deleted it, essentially leaving it floating and that worked

Basically delete this line from stm32_endp_isr_user_out()
        stm32_usb_set_epr_dtog(wdEndP,\
                               1,\
                               STM32_USB_EPR_DTOG_TX_OFFSET);


End Result - arm m-3 minicom:
--------RESET----------- 27uS
--------RESET----------- 28uS
80 06 00 01 00 00 40 00
--------RESET----------- 28uS
00 05 3E 00 00 00 00 00
usb device address = 3E
80 06 00 01 00 00 12 00
80 06 00 02 00 00 09 00
80 06 00 02 00 00 20 00
80 06 00 03 00 00 FF 00
80 06 02 03 09 04 FF 00
80 06 01 03 09 04 FF 00
80 06 03 03 09 04 FF 00
00 09 01 00 00 00 00 00
00 08 ED FE 04 5C 00 40
user req peek   [40005C04]=7021
00 08 ED FE 04 5C 00 40
user req peek   [40005C04]=3061
00 08 ED FE 04 5C 00 40
user req peek   [40005C04]=7021
00 08 ED FE 04 5C 00 40
user req peek   [40005C04]=3061
00 08 ED FE 40 60 00 40
user req peek   [40006040]=00
01 0C ED FE 40 60 00 40
user req poke   [40006040]=B0
00 08 ED FE 40 60 00 40
user req peek   [40006040]=B0



On the host linux pc side:
sudo ./peekstm32.out 0x40005c04
[40005c04] = 7021
sudo ./peekstm32.out 0x40005c04
[40005c04] = 3061
sudo ./peekstm32.out 0x40005c04
[40005c04] = 7021
sudo ./peekstm32.out 0x40005c04
[40005c04] = 3061
sudo ./peekstm32.out 0x40006040
[40006040] = 0
sudo ./peekstm32.out 0x40006040 0xb0
sudo ./peekstm32.out 0x40006040
[40006040] = b0

DONE!!!