seeeduno XIAOでPIC12F1840用のライターを作ってみます。 PICkit3のバッタもんも安く手に入るのに、、、 e電子工房さんのPICerFT(ファームウェア不要USB接続ライタ)っていう素晴らしいものもあるのに、、、
まぁ、やってみたいだけです。
参考資料はPIC16F/LF1847/PIC12F/LF1840 Memory Programming Specificationです。
まぁ、やってみたいだけです。
参考資料はPIC16F/LF1847/PIC12F/LF1840 Memory Programming Specificationです。
$ V_{PP} $はデータシートによると8V~9Vで、LT1054のデータシートによると
$ V_{IN} = 3.5V\ to\ 15V $
$ V_{OUT} \approx 2V_{IN} – \left(V_L + 2V_{DIODE}\right)$
$ V_L = LT1054\ VOLTAGE\ LOSS$
で$V_{IN}=5V$, $V_{DIODE}=0.6V$, $V_L=0.35V$なので$V_{OUT}=8.45V$でまぁまぁイケてるでしょ。
$ V_{IN} = 3.5V\ to\ 15V $
$ V_{OUT} \approx 2V_{IN} – \left(V_L + 2V_{DIODE}\right)$
$ V_L = LT1054\ VOLTAGE\ LOSS$
で$V_{IN}=5V$, $V_{DIODE}=0.6V$, $V_L=0.35V$なので$V_{OUT}=8.45V$でまぁまぁイケてるでしょ。
で、参考資料によるとseeeduinoXIAO-->PICではPICが立下りでデータを取得(なので立ち上がりでデータセット)、PIC-->seeeduinoXIAOでは立ち上がりでデータを取得なのかなーと思って作ったけどうまく動かないので、先人の成果物を参考にする。ということで、PICerFTを急遽作って(というかseeeduinoXIAOをAE-UM232Rをつなぎ変えて)波形を観測すると、コマンド時はICSPCLKがH時にずっとICSPDATをキープしている。データ送信時は、ICSPCLKがLの時にICSPDATをキープしている。さらに、PROGRAMMING MODEに入ってから数10ms待っている。で、そっくりそのまま真似てみる。とりあえずMPLAB+picKit3で書き込んだEEPROMを読み込みます。
スピードではPICerFTにかないませんが、ちゃんと動いているようです。まずは動くことが大事です♡
- #define MCLR (0) //HIGH=ON, LOW=OFF
- #define VDD (1)//LOW=ON, HIGH=OFF
- #define ICSPDAT (10)
- #define ICSPCLK (8)
- #define TENTS 10
- #define TENTH 10
- #define TEXIT 10
- #define CLOCK_HHOLD 1
- #define CLOCK_LHOLD 1
- #define TDLY 10
- void picSendCommandH(){
- digitalWrite(ICSPCLK,LOW);
- digitalWrite(ICSPDAT,HIGH);
- delayMicroseconds(CLOCK_LHOLD);
- digitalWrite(ICSPCLK,HIGH);
- delayMicroseconds(CLOCK_HHOLD);
- digitalWrite(ICSPCLK,LOW);
- delayMicroseconds(CLOCK_LHOLD);
- }
- void picSendCommandL(){
- digitalWrite(ICSPCLK,LOW);
- digitalWrite(ICSPDAT,LOW);
- delayMicroseconds(CLOCK_LHOLD);
- digitalWrite(ICSPCLK,HIGH);
- delayMicroseconds(CLOCK_HHOLD);
- digitalWrite(ICSPCLK,LOW);
- delayMicroseconds(CLOCK_LHOLD);
- }
- void picSendDataH(){
- digitalWrite(ICSPCLK,HIGH);
- delayMicroseconds(CLOCK_HHOLD);
- digitalWrite(ICSPDAT,HIGH);
- delayMicroseconds(CLOCK_HHOLD);
- digitalWrite(ICSPCLK,LOW);
- delayMicroseconds(CLOCK_LHOLD);
- }
- void picSendDataL(){
- digitalWrite(ICSPCLK,HIGH);
- delayMicroseconds(CLOCK_HHOLD);
- digitalWrite(ICSPDAT,LOW);
- delayMicroseconds(CLOCK_HHOLD);
- digitalWrite(ICSPCLK,LOW);
- delayMicroseconds(CLOCK_LHOLD);
- }
- void (*func[32])(void);
- void dummy(){
- delayMicroseconds(1);
- }
- void picSendCommand(uint8_t sendData){
- pinMode(ICSPDAT,OUTPUT);
- pinMode(ICSPCLK,OUTPUT);
- for(int i=0;i<6;i++){
- if(sendData&0x01){
- func[i]=picSendCommandH;
- }else{
- func[i]=picSendCommandL;
- }
- sendData=sendData>>1;
- }
- for(int i=0;i<6;i++){
- (*func[i])();
- }
- digitalWrite(ICSPDAT,LOW);
- }
- void picSendData(uint16_t sendData,uint8_t bit_length_to_send){
- pinMode(ICSPDAT,OUTPUT);
- pinMode(ICSPCLK,OUTPUT);
- for(int i=0;i<bit_length_to_send;i++){
- if(sendData&0x01){
- func[i]=picSendDataH;
- }else{
- func[i]=picSendDataL;
- }
- sendData=sendData>>1;
- }
- for(int i=0;i<bit_length_to_send;i++){
- (*func[i])();
- }
- digitalWrite(ICSPDAT,LOW);
- }
- uint16_t picRecv(uint8_t bit_length_to_receive){
- uint16_t rcv;
- pinMode(ICSPDAT,INPUT);
- pinMode(ICSPCLK,OUTPUT);
- rcv=0x0000;
- for(int i=0;i<bit_length_to_receive;i++){
- rcv=rcv<<1;
- digitalWrite(ICSPCLK,HIGH);
- delayMicroseconds(CLOCK_HHOLD);
- digitalWrite(ICSPCLK,LOW);
- if(digitalRead(ICSPDAT)){
- rcv|=0x01;
- }else{
- rcv&=0xFE;
- }
- delayMicroseconds(CLOCK_LHOLD);
- }
- return rcv;
- }
- void LOAD_CONFIGURATION(){
- picSendCommand(0x00);
- delayMicroseconds(TDLY);
- picSendData(0x7FFE,16);
- delayMicroseconds(TDLY);
- }
- uint16_t READ_DATA_FROM_PROGRAM_MEMORY(){
- picSendCommand(0x04);
- delayMicroseconds(TDLY);
- return picRecv(16);
- }
- uint16_t READ_DATA_FROM_DATA_MEMORY(){
- picSendCommand(0x05);
- delayMicroseconds(TDLY);
- return picRecv(16);
- }
- void INCREMENT_ADDRESS(){
- picSendCommand(0x06);
- delayMicroseconds(TDLY);
- }
- void PROGRAMMING_MODE_ENTRY_VDD_FIRST(){
- pinMode(ICSPDAT,OUTPUT);
- pinMode(ICSPCLK,OUTPUT);
- pinMode(MCLR,OUTPUT);
- pinMode(VDD,OUTPUT);
- digitalWrite(ICSPDAT,LOW);
- digitalWrite(ICSPCLK,LOW);
- digitalWrite(MCLR,LOW);
- digitalWrite(VDD,LOW);
- delayMicroseconds(TENTS);
- digitalWrite(MCLR,HIGH);
- delayMicroseconds(TENTH);
- }
- void PROGRAMMING_MODE_ENTRY_VPP_FIRST(){
- pinMode(ICSPDAT,OUTPUT);
- pinMode(ICSPCLK,OUTPUT);
- pinMode(MCLR,OUTPUT);
- pinMode(VDD,OUTPUT);
- digitalWrite(ICSPDAT,LOW);
- digitalWrite(ICSPCLK,LOW);
- digitalWrite(MCLR,LOW);
- digitalWrite(VDD,HIGH);
- delayMicroseconds(100);
- digitalWrite(MCLR,HIGH);
- delayMicroseconds(TENTS);
- digitalWrite(VDD,LOW);
- delayMicroseconds(TENTH);
- }
- void PROGRAMMING_MODE_EXIT_VDD_FIRST(){
- pinMode(ICSPDAT,OUTPUT);
- pinMode(ICSPCLK,OUTPUT);
- pinMode(MCLR,OUTPUT);
- digitalWrite(ICSPDAT,LOW);
- digitalWrite(ICSPCLK,LOW);
- digitalWrite(MCLR,LOW);
- delayMicroseconds(TEXIT);
- }
- void PROGRAMMING_MODE_EXIT_VPP_FIRST(){
- pinMode(ICSPDAT,OUTPUT);
- pinMode(ICSPCLK,OUTPUT);
- pinMode(VDD,OUTPUT);
- pinMode(MCLR,OUTPUT);
- digitalWrite(ICSPDAT,LOW);
- digitalWrite(ICSPCLK,LOW);
- digitalWrite(VDD,HIGH);
- delayMicroseconds(TEXIT);
- digitalWrite(MCLR,LOW);
- }
- void setup() {
- for(int i=0;i<32;i++){
- func[i]=dummy;
- }
- pinMode(VDD,OUTPUT);
- digitalWrite(VDD,HIGH);
- delay(200);
- PROGRAMMING_MODE_ENTRY_VDD_FIRST();
- delay(20);
- LOAD_CONFIGURATION();
- READ_DATA_FROM_DATA_MEMORY();
- for(int i=0;i<16;i++){
- INCREMENT_ADDRESS();
- READ_DATA_FROM_DATA_MEMORY();
- }
- PROGRAMMING_MODE_EXIT_VDD_FIRST();
- pinMode(VDD,OUTPUT);
- digitalWrite(VDD,HIGH);
- pinMode(ICSPDAT,INPUT);
- pinMode(ICSPCLK,INPUT);
- }
- void loop() {
- }
あいかわらず、コメントなしの不親切なコードです。まぁプロじゃないので。
コメントをお書きください