HobbyKing.com New Products Flash Sale
Reply
Thread Tools
Old Mar 27, 2013, 05:33 PM
We want... Information!
Bruce Abbott's Avatar
Hastings, New Zealand
Joined Jan 2001
5,192 Posts
Discussion
Reprogramming a Turnigy Servo Signal Reverser

The Turnigy Servo Signal Reverser from HobbyKing is a cheap and easy way to reverse the direction of a servo. At only $1.99 each, how could you lose? Well I bought 5 of them and only 1 worked.

Physically the faulty units appeared to be good, so perhaps the fault was in the firmware? My suspicions were confirmed when I found that the servo input signal was being shorted to ground as it entered the MCU on pin 10, but only when the device was powered up and out of reset - indicating that the port pin was being initialized as an output instead of an input. There are 5 pads on the bottom of the board suggesting that the MCU could be re-flashed. But which MCU is it? After a lot of Googling and comparing datasheets I determined that it is a uPD78F9212 manufactured by Renesas (formerly NEC).

This chip is in the 78K0S/Kx1 series which is being phased out, but luckily data sheets and software development tools are still available. The official programmer is ridiculously expensive and certainly not worth buying just to revive a few $2 devices. However on Renesas's Japanese website I found a package called WriteEZ2, which a includes a circuit diagram. I also found a DIY programmer at Electronic Lives MFg, with a different circuit and source code. From this I have developed my own hardware and software which is compatible with WriteEZ2 but simpler to build and operate, and some new code to replace the bad firmware. So for anybody who has a dead Turnigy server reverser, now you can revive it!

Perhaps it's not worth doing if you only have one or two that don't work, but being able to reflash the chip opens up other possibilities. The board could be used for various projects which require a single servo input and output, or as an rc switch to control LEDs or other devices, or for other applications. The on-board 3.3V regulator is rated up to 24V, and the MCU has several unused I/O pins (3 of which are accessible through the in-circuit programming pads). The uPD78F9212 has features similar to a PIC12F683 or ATTiny15L, and free software development tools are available.

To help anyone who wants to try writing their own firmware, I have attached an archive with 3 versions of my servo reverser source code - written in c for IAR Embedded Workbench and CC78K0S, and in assembly language for RA78KOS.
Bruce Abbott is offline Find More Posts by Bruce Abbott
Reply With Quote
Sign up now
to remove ads between posts
Old Mar 27, 2013, 09:03 PM
Registered User
Joined Oct 2012
224 Posts
Oh, great

uPD78F9212 microcontroller is hard to find, 12F683 or atiny13 probably common.
if I remember correctly, you have a similar project using 12f675
fantasy1988 is offline Find More Posts by fantasy1988
Reply With Quote
Old Mar 28, 2013, 07:13 AM
Life begins at transition
Australia, VIC, Sale
Joined May 2007
3,593 Posts
Awesome, i did the same - I have a bunch of them hoping to reflash them for various signal conditioning. Could never figure out what u they used.

Thanks very much for the research!
Odysis is offline Find More Posts by Odysis
Reply With Quote
Old Apr 01, 2013, 10:29 AM
Thermite + ice = Big boom.
boaterguy's Avatar
Canada, ON, Ottawa
Joined Apr 2009
2,377 Posts
Not quite on the topic of programming, but what's the point of Q1? Couldn't the PWM pin just go straight to servo out?
boaterguy is offline Find More Posts by boaterguy
Reply With Quote
Old Apr 01, 2013, 11:02 AM
Happy FPV flyer
Kilrah's Avatar
United Arab Emirates, Dubai
Joined Sep 2006
4,898 Posts
PWM straight from the uC would be 3.3V only. Some servos/ESC don't like this, so that circuit "amplifies" it to the full supply voltage.
Kilrah is offline Find More Posts by Kilrah
Reply With Quote
Old Apr 01, 2013, 11:40 AM
Thermite + ice = Big boom.
boaterguy's Avatar
Canada, ON, Ottawa
Joined Apr 2009
2,377 Posts
Oh I see now.
Thanks.
boaterguy is offline Find More Posts by boaterguy
Reply With Quote
Old Apr 17, 2013, 07:54 AM
We want... Information!
Bruce Abbott's Avatar
Hastings, New Zealand
Joined Jan 2001
5,192 Posts
For those of you who prefer using a mouse over typing into a command line, I have developed a Windows desktop application for my 78K0S programmer.

This is my first attempt at creating a Windows XP GUI program, so there are probably a few bugs and/or incompatibilities. Does it work on Vista, Windows 7 or 8? Can it detect all Com ports? Do the controls display correctly with different desktop themes and settings? What about foreign language Windows versions? Should I have designed the interface differently?

Any feedback will be greatly appreciated. You don't have to build any hardware to try out the application - just have a play with the controls and tell me what you think!

As usual, full source code is included in the archive.
Bruce Abbott is offline Find More Posts by Bruce Abbott
Reply With Quote
Old Apr 30, 2013, 04:08 AM
We want... Information!
Bruce Abbott's Avatar
Hastings, New Zealand
Joined Jan 2001
5,192 Posts
A mystery - Solved!

My programmer was doing a good job of re-flashing my 'dead' servo reversers, but I wondered - why did the original firmware not work? Could I read out the code and analyze it?

The chips were not locked, which would make most MCU's an 'open book' for extracting the firmware. But the uPD78K0S series is different. There is no command to read back data that has been programmed into it. You can check whether a block is erased or not, but it will not let you see what has been stored in it. I guess that's why they didn't protect the chip after programming it - since it's effectively read protected anyway.

So was it 'game over' for extracting the firmware? Not quite. I couldn't read it with a programmer, but if I could get some of my own code into it then I could read the ROM internally, and send the codes out via a port pin in serial format. Since the chip isn't protected, I just needed to find a blank space in the ROM to write the code to, and change the reset vector so it pointed to my code instead of the existing firmware.

Did I say 'just'? Well it wasn't quite that easy. I figured there was a good chance that the ROM wasn't full up, so the last block was probably free (my code only takes up about 240 bytes, less than 1 block). Re-flashing that block was easy. The problem was the reset vector, which is at address 0000H in block 0. About 130 bytes of start-up code and other interrupt vectors usually reside in that same block, so I couldn't erase it without without wiping out a significant amount of the firmware that I wanted to view.

At first I thought it might be possible to simply overwrite the reset vector to point to a lower address (it would have to be lower, because FlashROM bits can only be written down to 0, and to write any 1's I would have to erase the whole block). Unfortunately that idea didn't work out, because when you try to write 0 bits into a byte that has already been programmed, other 1 bits that you don't want changed tend to get dragged down with them. Furthermore I didn't know exactly where the vector was pointing to anyway, and if it was out by even 1 byte then it would miss the jump to my code.

So I 'sacrificed' one chip by erasing the whole of block 0 and then putting my own code in it. This worked perfectly, and I was able to read the rest of the ROM (using my programmer as a serial interface). But there was important stuff in that first block, and I still had one 'dead' chip left. Was there another way to do it? Yes!

The answer was to write all 0's into the reset vector. Now the vector is pointing to location 0000H, ie. itself. On start up the CPU jumps to location 0, then tries to execute the reset vector as instructions. Luckily the opcode for 00H is "ROR A,1" which simply rotates the contents of the A register and then advances to the next location. After two ROR instructions the program counter should advance to location 0002H, an unused area of the ROM where I could place a jump to my code. And it worked!!!

Having extracted the firmware, the only thing left to do was disassemble it and try to figure out its purpose. I got as far as determining that it reads an analog voltage and produces a proportional servo pulse before the penny dropped - this code is for not for a servo reverser, it's for a servo Tester. The only remaining question is, which servo tester is has 3 LEDs, a push-button and a pot, is switchable between standard (1530us) and high speed (770us) servos, and uses an NEC chip?

Code:
;=============================================================================
;	                 Turnigy? Servo Tester? 
;=============================================================================
;for uPD78F9212                               Bruce Abbott www.bhabbott.net.nz   
;
; I extracted this code from a DOA Turnigy Servo Signal Reverser. So far I 
; have figured that it does the following:-
;
; 1. Reads an analog voltage (potentiometer?) on pin 8 (P2.3) 
; 2. Reads a digital input (switch?) on pin 3 (P4.0)
; 3  Reads a digital input (pushbutton?) on pin 10 (P4.5)
; 4. Sequences 3 digital ouputs (LEDs?) on pins 15, 14, 11 (P4.2-P4.4)
; 5. Generates a repetitive output pulse on pin 16 (P2.3/TO00). 
; 
; Output pulse width is either centered on 770us with a frame time of 1.785ms, 
; or centered on 1530us with a frame time of 15ms. 
;
; This firmware appears to be for a servo tester! 
;
; NOTE: This disassembly is for educational purposes only. I have redacted 
;       some code to ensure that it can't be used to 'clone' the original.      
;

ORG 0000H		
 DW RESET_START		; Reset vector

ORG 000CH
 DW R0385		; INTTMH1 int vector (8 bit timer)
 DW R0373		; NTTM000 int vector (16 bit timer)

ORG 0080H
  DB 09EH		; Option Byte
  DB 083H  		; Protect Byte

ORG 0082H
RESET_START:
 DI			; disable interrupts
 MOV   IF0,#0H		; clear interrupt flags 
 MOV   MK0,#0FFH	; clear all interrupt masks

 MOV   LVIS,#9H		; set low voltage level detect to 2.35V
 SET1  LVIM.7H		; enable LVIM 
L0091:
 BT    LVIM.0H,$L0091	; wait until Vdd voltage rises above cutoff	
 SET1  LVIM.1H		; set LVIM to reset if low voltage

 MOV   PCC,#0H		; CPU clock = periphral clock 
 MOV   PPCC,#0H		; clock = 8MHz  

 MOVW  AX,#0FEEFH
 MOVW  SP,AX		; initialize stack pointer to FEEF

 MOVW  HL,#0FE7FH	; 1 byte *below* start of RAM <--- BUG!
L00A6:
 MOV   A,#0H	
 MOV   [HL],A
 INCW  HL	        ; clear RAM from FE7F to FEFF = 129 bytes (!) 
 MOVW  AX,HL		
 CMPW  AX,#0FF00H
 BC    $L00A6

 MOV   PM2,#0F8H	; P2.0-P2.2 are ouputs
 MOV   PM3,#0FBH	; P3.2 = output
 MOV   PM4,#21H		; P4.1-P4.5 are outputs
 MOV   PMC2,#08H	; Port Mode Control set for analog input on P2.3
 MOV   PU4,#21H		; enable pullups on Port 4
 MOV   ADM,#39H		; set ADC conversion time (28uS)
 MOV   ADS,#03H		; select P2.3 for ADC input  
 MOV   CRC00,#00H	; CR010 and CR000 set as timer compare registers
 MOV   TOC00,#17H	; 16 bit timer one shot mode with output
 MOV   PRM00,#0F1H	; 16 bit timer clock set to 2MHz
 MOV   TMC00,#0CH	; clear 16 bit timer
 SET1  ADM.7H		; 16 bit timer restart on CR000 match, output low on CR010 match 
 MOVW  AX,#01D4CH	
 MOVW  CR000,AX		; CR000 = 7500 output frame time = 3.75mS
 MOVW  AX,#05F0H		
 MOVW  CR010,AX		; CR010 = 1520 output pulse time = 760uS 
 MOV   CMP01,#00CH	; clear 8 bit timer compare register 1
 MOV   TMHMD1,#0B0H	; 8 bit timer stopped, set to 8MHz, PWM mode, output high 
 MOV   MK0,#0CFH	; enable both timer interrupts
L00E8:
 BF    IF0.7H,$L00E8	; wait until A/D conversion complete
 CLR1  IF0.7H		; clear ADC interrupt
 EI

;----- operating mode 1	-----
 MOV   WDTM,#66H
L00F5:
 SET1  P4.2H		; P4.2 = high = LED 1 on
 CLR1  P4.3H		; P4.3 = low  
 CLR1  P4.4H		; P4.4 = low  
 MOV   WDTE,#0ACH
 BF    IF0.7H,$L0126	; branch if no A/D interrupt 
 CLR1  IF0.7H		; clear A/D interrupt
 CALL  !R0269		; measure pot voltage
 .
 .
 .                      ; ***REDACTED***
 .
 .
L0126: 
 CALL  !R034A		; check mode button
 BF    0FE83H.2H,$L00F5 ; loop if flag #2 false

;----- operating mode 2	-----
 CLR1  0FE83H.2H	; flag #2 = false
L0130:
 SET1  P4.3H		; P4.3 = high = LED 2 on
 CLR1  P4.2H		; P4.2 = low  
 CLR1  P4.4H		; P4.4 = low
 MOV   WDTE,#0ACH
 BT    P4.0H,$L014A	; branch if P4.0 is high = pulse rate selector switch off 
; short pulse settings 
 MOVW  AX,#0DF2H	; 3570	= 1.785ms
 MOVW  0FE88H,AX
 MOVW  AX,#604H		; 1540	= 0.77ms
 BR    $L0152
; long pulse settings
L014A:
 MOVW  AX,#7530H	; 30000	= 15ms
 MOVW  0FE88H,AX
 MOVW  AX,#0BF4H	; 3060	= 1.53ms
L0152:
 .
 .
 .                      ; ***REDACTED***
 .
 .
 CALL  !R034A		; check mode button
 BF    0FE83H.2H,$L0130	; loop if flag #2 false

;----- operating mode 3	-----
 CLR1  0FE83H.2H	; else flag #2 = false
L0168:
 SET1  P4.4H		;P4.4 = high = LED 3 on
 CLR1  P4.2H		;P4.2 = low
 CLR1  P4.3H		;P4.3 = low
 MOV   WDTE,#0ACH
 CLR1  0FE8DH.0H	; flag #3 = false
 BF    P4.0H,$L017E	; branch if P4.0 low
 SET1  0FE8DH.0H	; else flag #3 = true
L017E:
 BT    0FE8DH.0H,$L01AC	; branch if flag #3 true, standard pulse timing (1.52ms)

;----- short pulse timing (770us) -----
 BF    0FE8DH.2H,$L01A4	; branch if flag #5 false
 INC   0FEB3H		; position +1
 CMP   0FEB3H,#0FAH	 
 BC    $L01CE		; branch if < 250
 MOV   0FEB3H,#0H	; position = 0
 DI
 MOVW  AX,#0DF2H	; 3570 = 1.785ms (timer 2 cycle time)
 MOVW  0FE88H,AX
 MOVW  0FE86H,AX
 MOVW  AX,#604H		; 1540 = 770us (timer 2 output high time)
 MOVW  0FE8AH,AX
 MOVW  0FE84H,AX
 EI
L01A4
 CLR1  0FE8DH.2H	; clear flag #5
 MOVW  AX,#0DF2H	; 3570 = 1.785ms 
 BR    $L01D4

;----- long pulse timing (1.52ms) -----
L01AC:
 BT    0FE8DH.2H,$L01CE	; branch if flag #5 true
 INC   0FEB3H		; position + 1 
 CMP   0FEB3H,#0FAH
 BC    $L01A4		; branch if < 250
 MOV   0FEB3H,#0H	; position = 0
 DI
 MOVW  AX,#7530H	; 30000	= 15ms  (timer 2 cycle time)
 MOVW  0FE88H,AX
 MOVW  0FE86H,AX
 MOVW  AX,#0BF4H	; 3060 = 1.52ms	 (timer 2 output high time)
 MOVW  0FE8AH,AX
 MOVW  0FE84H,AX
 EI
L01CE:
 SET1  0FE8DH.2H	; flag #5 = true
 MOVW  AX,#7530H	; 30000 = 15ms

L01D4:
 MOVW  0FE88H,AX

 BF    IF0.7H,$L01F4	; branch if ADIF not set
 CLR1  IF0.7H
 MOVW  AX,ADCR		; get ADC result (10 bits)
 MOV   B,#4H		; count = 4
L01E2:			
 ROR   A,1
 AND   A,#7FH		
 XCH   A,X		; 16 bit shift right = divide by 2 
 RORC  A,1		 
 XCH   A,X
 DBNZ  B,$L01E2		; 4 times = divide by 16 = 6 bit analog voltage
 XCH   A,X
 CMP   A,#2H
 BNC   $L01F2		; if < 2 then = 2 
 MOV   A,#2H
L01F2:
 MOV   0FE82H,A		; store 6 bit analog voltage
L01F4:
 MOV   A,0FEB2H
 CMP   A,0FE82H		
 BC    $L0259		; branch if < analog voltage
 MOV   0FEB2H,#0H
 MOVW  AX,0FE84H
 BT    0FE8DH.1H,$L0216	; branch if flag #4 true
 .
 .
 .                      ; ***REDACTED***
 .
 .
 BT    0FE8DH.1H,$L0243	; branch if flag #4 true
 BT    0FE8DH.0H,$L0239	; branch if flag #3 true
 CMPW  AX,#320H		; 800
 BNC   $L0259
 SET1  0FE8DH.1H	; flag #4 = true
 BR    $L0259
L0239:
 CMPW  AX,#708H		; 1800 
 BNC   $L0259
 SET1  0FE8DH.1H	; flag #4 = true
 BR    $L0259
L0243:
 BT    0FE8DH.0H,$L0251	; branch if flag #3 true
 CMPW  AX,#8D4H 
 BC    $L0259
 CLR1  0FE8DH.1H	; flag #4 = false
 BR    $L0259
L0251:
 CMPW  AX,#1130H	; 4400
 BC    $L0259
 CLR1  0FE8DH.1H	; flag #4 = false
L0259:
 CALL  !L034A		; check mode button
 BT    0FE83H.2H,$L0263	
 BR    !L0168		; if flag #2 false then loop back to mode 3
L0263:
 CLR1  0FE83H.2H	; flag #2 = false
 BR    !L00F5		; loop back to mode 1

;------------------------------------------------------------------
;                          Subroutines
;------------------------------------------------------------------

; ----- measure pot voltage -----
R0269:
 MOV   B,#0FH		; count = 15
 MOVW  HL,#0FEAEH
L026F:
 MOV   A,[HL]
 MOV   E,A
 MOV   A,[HL+1H]	; AX, DE = [HL]
 MOV   D,A		 
 MOV   A,[HL+2H]
 MOV   X,A		; AX = [HL+2]	 ; move older samples down
 MOV   A,[HL+3H]
 XCHW  AX,DE		; AX <-> DE 
 MOV   [HL+3H],A
 XCH   A,X		; [HL+2] = AX
 MOV   [HL+2H],A
 DECW  HL		; HL - 2
 DECW  HL
 DBNZ  B,$L026F		; 15 times

 MOVW  AX,ADCR		; get ADC result
 MOVW  0FE92H,AX	; insert into top of array 
 MOV   B,#0FH		; sample count = 15
 MOVW  HL,#0FE94H
L0290:
 XCH   A,X
 ADD   A,[HL]
 XCH   A,X		; add to sample 
 ADDC  A,[HL+1H]
 INCW  HL		; next sample
 INCW  HL
 DBNZ  B,$L0290		; get 15 ADC measurements
 .
 .
 .                      ; ***REDACTED***
 .
 .
 MOVW  AX,HL
 MOVW  0FE8EH,AX	; return pot voltage
 RET

 .
 .
 .                      ; ***REDACTED***
 .
 .
 
;----- calc long pulse width from pot voltage ----- 
R02DF:
 MOVW  AX,#7530H        ; FE88 = 30000 = 15ms
 MOVW  0FE88H,AX
 MOVW  AX,0FE8EH	
 ROR   A,1
 AND   A,#7FH
 XCH   A,X		; DE = fe8e / 2
 RORC  A,1
 XCH   A,X
 MOVW  DE,AX
 MOV   B,#2H
L02F0:
 .
 .                      ; ***REDACTED*** 
 .
 .
 ADDW  AX,#708H		; AX = AX + 1800 (= 900us)
 RET

;----- calc short pulse width from pot voltage -----
R0311:
 MOVW  AX,#0DF2H	; FE88 = 3570 (= 1.785ms) 
 MOVW  0FE88H,AX
 MOVW  AX,0FE8EH	
 ROR   A,1
 AND   A,#7FH
 XCH   A,X
 .
 .                      ; ***RADACTED***
 .
 .
 ADDW  AX,#320H		; AX = AX + 800 (= 400us)
 RET

;----- mode button check-----
R034A:
 BT    P4.5H,$L035F       ; branch if P4.5 is high (pushbutton released?)
 BT    0FE83H.0H,$L0358	  ; branch if flag #0 true
 CMP   0FE80H,#0DCH	  
 BNC   $L0358	          ; branch if ticker #2 >= 220 
 RET			  ; else return            (debounce button?)  
L0358:
 MOV   0FE80H,#0H	  ; clear ticker #2
 SET1  0FE83H.0H	  ; flag #0 = true
 RET			  ; return
L035F:
 CMP   0FE80H,#0DCH	  ; if ticker #1 >= 11
 BC    $L0372
 MOV   0FE80H,#0H	  ; clear ticker #1
 BT    0FE83H.0H,$L036C	  ; branch if flag #0 true
 RET			  ; else return
L036C: 
 CLR1  0FE83H.0H	  ; flag #0 = false
 SET1  0FE83H.2H	  ; flag #2 = true (button pressed?)
L0372:
 RET			  ; return


;----- 16 bit timer interrupt -----  
;      Servo Pulse PWM output
R0373:
 PUSH  AX
 MOVW  AX,TM00
 CMPW  AX,#320H		 ; timer < 800 ?
 BNC   $L0383
 MOVW  AX,0FE84H
 MOVW  CR010,AX		 ; yes, update CR000, CR010
 MOVW  AX,0FE86H
 MOVW  CR000,AX
L0383:
 POP   AX
 RETI

;----- 8 bit timer interrupt -----  
;         Button Debounce
R0385:
 INC   0FEB2H		 ; increment ticker #2 
 INC   0FE80H		 ; increment ticker #1
 RETI
Bruce Abbott is offline Find More Posts by Bruce Abbott
Reply With Quote
Old Jun 12, 2013, 06:50 PM
We want... Information!
Bruce Abbott's Avatar
Hastings, New Zealand
Joined Jan 2001
5,192 Posts
Here is some code for slowing down a servo. This may be useful for operating retracts via a standard servo, deploying flaps, slowing motor spool up in a scale heli, etc.

Traversing speed is set by connecting the CLK and/or DATA pads to ground. There are four possibilities - 1 second (default), 1.5 seconds, 2 seconds, and 3 seconds.
Bruce Abbott is offline Find More Posts by Bruce Abbott
Reply With Quote
Old Jul 13, 2013, 01:35 AM
We want... Information!
Bruce Abbott's Avatar
Hastings, New Zealand
Joined Jan 2001
5,192 Posts
Here's an update to the GUI 78KOS Programming application. This version adds block write/erase/check, read status of each byte in a block, and write to part of a block. I have also prettied it up a bit and fixed a few bugs.
Bruce Abbott is offline Find More Posts by Bruce Abbott
Reply With Quote
Old Aug 20, 2013, 04:42 AM
We want... Information!
Bruce Abbott's Avatar
Hastings, New Zealand
Joined Jan 2001
5,192 Posts
RC Switch

Here's another simple project that re-purposes the Turnigy Servo Signal Reverser - a radio controlled switch that takes a standard servo signal (<1.4ms = off, >1.6ms = on).

It uses the existing on-board driver transistor, which can switch up to 80mA of current. This is enough to light a few LEDs or operate a small 5V relay. For switching higher currents a power MOSFET could be added.
Bruce Abbott is offline Find More Posts by Bruce Abbott
Last edited by Bruce Abbott; Aug 20, 2013 at 04:51 AM.
Reply With Quote
Old Aug 20, 2013, 06:33 AM
Registered User
Joined Feb 2013
137 Posts
switch RC , Thanks Bruce

If you can, add two 2 channel separate ? but if it is complicated to program, probably i will buy more Turnigy Servo Signal Reverser

seems you are interested in this new chip ? UBD 78F9212
Jame David is offline Find More Posts by Jame David
Reply With Quote
Old Aug 20, 2013, 10:06 AM
Thermite + ice = Big boom.
boaterguy's Avatar
Canada, ON, Ottawa
Joined Apr 2009
2,377 Posts
You MUST be retired, no working man has that much time on their hands (or that much wisdom for that matter).
Where did you learn all of this MCU stuff?
boaterguy is offline Find More Posts by boaterguy
Reply With Quote
Old Aug 20, 2013, 08:12 PM
We want... Information!
Bruce Abbott's Avatar
Hastings, New Zealand
Joined Jan 2001
5,192 Posts
Quote:
Originally Posted by boaterguy View Post
You MUST be retired,
I wish!

Quote:
Where did you learn all of this MCU stuff?
I stated learning about microprocessors in 1979, when I built an RCA CDP1802 based kit called the HUG1802 (similar to the ETI 660). I then made an EPROM programmer for it, and designed my own computer using a Motorola 6802 MPU and 6847 video chip. This was before the Internet of course, so I learned it all from books and magazines - with much trial and error...

My first experience with MCU's was hacking into the firmware of an STC PABX console (to correct a bug that the manufacturer refused to fix). That had an Intel 8051, which used an external EPROM for program storage. Years later I discovered the Microchip PIC series, which have internal EEPROM's that can be electrically erased and reprogrammed - one chip does the lot!

Quote:
Originally Posted by Jame David
seems you are interested in this new chip ? UBD 78F9212
The upd78F9212 is an old chip which is not very popular, and I wouldn't have been interested in it except that the Turnigy servo reverser uses one. Even then, I probably wouldn't have bothered to develop a programmer if they had all worked like they were supposed to! However I am glad that I did, because the Turnigy servo reverser is a nice cheap hardware platform.

Currently I am working on a Low Voltage Cutoff circuit for use with older ESC's that don't have an internal LVC, or for multi-engine models where all motors need to cut at the same time.
Bruce Abbott is offline Find More Posts by Bruce Abbott
Reply With Quote
Old Aug 21, 2013, 06:20 AM
We can rebuild it!
djdavies83's Avatar
United Kingdom, Wales, Swffryd
Joined Apr 2010
3,692 Posts
Got a little challenge for you I your interested....

A lot of people are using replacement V911 helicopter PCB for building a 3ch plane, 3ch because they aileron servo is used for rudder, the rudder output is for a motor and is mixed with throttle and gyro, people have asked about reprogramming the board to have a rudder servo output from that pin on the MCU.
http://www.banggood.com/Wholesale-WL...s-p-38688.html
djdavies83 is offline Find More Posts by djdavies83
Reply With Quote
Reply


Thread Tools

Similar Threads
Category Thread Thread Starter Forum Replies Last Post
Sold Turnigy Servo Signal Reverser fatcat1 Aircraft - General - Radio Equipment (FS/W) 3 Mar 03, 2013 08:03 AM
Alert Turnigy 9X looses signal within less than 100m tecdux Multirotor Talk 15 Feb 17, 2013 01:47 PM
Sold HSG-5084MG Dig. Tail Servo for Unvs Signal Roly72 Aircraft - Electric - Helis (FS/W) 1 Jan 03, 2013 08:16 PM
Discussion Turnigy marine 120A Revers? Bernhard BB Racing Boats - Electric 2 Sep 23, 2011 09:07 PM
Discussion servo signal to 0-5k ohm signal Bob K DIY Electronics 5 Apr 05, 2006 03:15 PM