Hacking cartridge HP 84/85

Powder and inkjet printing
User avatar
dragonator
Site Admin
Posts: 595
Joined: Fri Aug 14, 2015 4:48 pm
Location: The Nethelands
Contact:

Re: Hacking cartridge HP 84/85

Post by dragonator »

40 nanoseconds for a pin write is pretty fast. I can imagine it being too slow for you, but it is a good reference for me.

For the port you will need to puzzle a little in the core.h: https://github.com/PaulStoffregen/cores ... ore_pins.h

Teensy 4.0 is __IMXRT1062__. This is handy to know since some block only apply to this

Moving from the top

CORE_PIN0_BIT :is which bit of a port is which pin. In this case it is said to be 3 (the 3rd bit).

CORE_PIN0_BITMASK (1<<(CORE_PIN0_BIT)) :creates the actual number which is used to write the port.

CORE_PIN0_PORTSET :determines to which port this is written. GPIO6_DR_SET in this case, port 6

Then there is a whole lot of information that is not relevant. It all applies to the __IMXRT1052__. Move until "#endif // __IMXRT1052__"

A lot further down below there is what digitalWrite(0, 1); is translated to:
CORE_PIN0_PORTSET = CORE_PIN0_BITMASK;, which becomes GPIO6_DR_SET = 1<<3
digitalWrite(0, 0); is translated to:
CORE_PIN0_PORTCLEAR = CORE_PIN0_BITMASK;, which becomes GPIO6_DR_CLEAR = 1<<3

Now these functions can only set pins that are 1 in the mask to high (GPIO_DR_SET) or low (GPIO_DR_CLEAR).

A direct write to the port should be GPIO6_DR, followed by the bits that need to be high and low. GPIO6 = 8; should set GPIO6 pin 3 (which was 0) to high, and GPIO6 = 0; should make all pins 0. However this also writes ALL pins on the port to 0, which is bad. The code to just write pin 0 should be:

Code: Select all

byte pinTable[] = {0,3,4,5,6,7,8,9};
void setup() {
for(int i=0; i<8; i++) {
  pinMode(pinTable[i],OUTPUT); 
  }
}

void loop() {
 GPIO6_DR = GPIO6_DR | 8;
 GPIO6_DR = GPIO6_DR & ~8; //the ~ inverts the 1's and 0's.
}
note that only pin 0 should become 1 and 0 really fast. Every other pin does nothing at the moment. That is because actually figuring out which pin does what would take over an hour with excel, mapping out each pin.

Looking at the values though I am afraid that there are no full ports broken out on the Teensy 4.0
MAsic12345
Posts: 116
Joined: Sat Aug 25, 2018 5:26 pm
Location: Poland

Re: Hacking cartridge HP 84/85

Post by MAsic12345 »

dragonator wrote: Thu Oct 03, 2019 6:14 pm
CORE_PIN0_BIT :is which bit of a port is which pin. In this case it is said to be 3 (the 3rd bit).

CORE_PIN0_BITMASK (1<<(CORE_PIN0_BIT)) :creates the actual number which is used to write the port.

CORE_PIN0_PORTSET :determines to which port this is written. GPIO6_DR_SET in this case, port 6

I’ve got it sorted out and that's what happened,
if I understand correctly?
Attachments
Безымянный.png
Безымянный.png (46.44 KiB) Viewed 29761 times
MAsic12345
Posts: 116
Joined: Sat Aug 25, 2018 5:26 pm
Location: Poland

Re: Hacking cartridge HP 84/85

Post by MAsic12345 »

dragonator wrote: Thu Oct 03, 2019 6:14 pm

Code: Select all

byte pinTable[] = {0,3,4,5,6,7,8,9};
void setup() {
for(int i=0; i<8; i++) {
  pinMode(pinTable[i],OUTPUT); 
  }
}

void loop() {
 GPIO6_DR = GPIO6_DR | 8;
 GPIO6_DR = GPIO6_DR & ~8; //the ~ inverts the 1's and 0's.
}
i used your code here is the result
Безымянный.png
Безымянный.png (80.62 KiB) Viewed 29761 times


but I still can’t understand how to change the pin
can’t understand why the eight at the end of the team

Code: Select all

GPIO6_DR = GPIO6_DR | 8;
User avatar
dragonator
Site Admin
Posts: 595
Joined: Fri Aug 14, 2015 4:48 pm
Location: The Nethelands
Contact:

Re: Hacking cartridge HP 84/85

Post by dragonator »

Now that you have confirmed that the code works, you are 80% of the way there. The 25MHz is going to be the absolute maximum.

Two things to explain what is happening here:

1, the very basics, but important. Binary numbers. Microcontrollers work with binary numbers. Each binary digit is called a bit. 8 bits make a byte, and an 8 bit number can be anything between 00000000 (0) and 11111111 (255). Most Teensy's do most of their operations in 32 bit numbers.

2. A microcontroller has it's I/O pins in ports. This is so that a pin state (high or low) can be represented with a number for a whole port of pins at the same time. Teensy has a 32 bit wide port for I/O pins. This is the table you made. On the teensy the ports are numbered.The example you used is port 6, or GPIO6_DR. Pin 0 is bit 3 in that port, and pin 1 is bit 2.

This means that if I have a number I write to that port, the second bit determines the state of pin 0. 00000000000000000000000000001000 is bit 3 being high, and all other bits being low. The numbers go from right to left and start at 0. If you decode this to a human readable number, it becomes 8.

Two links to help:
https://www.arduino.cc/reference/en/lan ... itwiseand/
https://www.arduino.cc/reference/en/lan ... bitwiseor/

What you wrote to the port is "GPIO6_DR = GPIO6_DR | 8;". You do not simply want to go "GPIO6_DR = 8;" because it will write a 0 to all other pins. You only want to affect pin 0. The or command is explained in the second link. It will combine the current state of port 6 with the bits that 1 in the number 8 (only the third bit). The next command does the same thing, only making it low. ~10101010 equals 01010101. It flips all the bits. And will only keep something 1 if the bit in both numbers is 1. This means that the single 0 on bit 3 is the only pin that will change. All other pins will stay the same.

A way to easily make the number with the right bits is to use bitshift.

https://www.arduino.cc/reference/en/lan ... shiftleft/
https://www.arduino.cc/reference/en/lan ... hiftright/

This is a lot of new information, but I hope it will help you understand more what it is you are doing.
MAsic12345
Posts: 116
Joined: Sat Aug 25, 2018 5:26 pm
Location: Poland

Re: Hacking cartridge HP 84/85

Post by MAsic12345 »

finally I could figure it out
it was incredibly hard
14124.png
14124.png (24.3 KiB) Viewed 29747 times

Code: Select all

byte pinTable[] = {0,1,2,3,4,5,6,7,8,9};
void setup() 
{
for(int i=0; i<10; i++) 
  {
  pinMode(pinTable[i],OUTPUT); 
  }

}
char a[] = {1,0,1,0,1,0,1,0,1,0,1,0,1,0};
char b[] = {1,0,1,0,1,0,1,0,1,0,1,0,1,0};
char c[] = {1,0,1,0,1,0,1,0,1,0,1,0,1,0};
char d[] = {1,0,1,0,1,0,1,0,1,0,1,0,1,0};
char e[] = {1,0,1,0,1,0,1,0,1,0,1,0,1,0};

void loop() 
{
  for(int i=0;i<14;i++)
  {

  if(a[i]==1)
    {
    GPIO6_DR = GPIO6_DR | 8;    //PIN 0
    }
    else
    {
    GPIO6_DR = GPIO6_DR & ~8;
    }
//////////////////////////////////////
  if(b[i]==1)
    {
    GPIO6_DR = GPIO6_DR | 4;    //PIN 1
    }
    else
    {
    GPIO6_DR = GPIO6_DR & ~4;
    }
//////////////////////////////////////
  if(c[i]==1)
    {
    GPIO9_DR = GPIO9_DR | 16;    //PIN 2
    }
    else
    {
    GPIO9_DR = GPIO9_DR & ~16;
    }
//////////////////////////////////////
  if(d[i]==1)
    {
    GPIO9_DR = GPIO9_DR | 32;   //PIN 3
    }
    else
    {
    GPIO9_DR = GPIO9_DR & ~32; 
    }
//////////////////////////////////////
  if(e[i]==1)
    {
    GPIO9_DR = GPIO9_DR | 64;    //PIN 4
    }
    else
    {
    GPIO9_DR = GPIO9_DR & ~64;
    }

  }
}
of course you can do simultaneous switching using 1010101
but that’s enough for me I used 1000000 in turn

Thank dragonator
User avatar
dragonator
Site Admin
Posts: 595
Joined: Fri Aug 14, 2015 4:48 pm
Location: The Nethelands
Contact:

Re: Hacking cartridge HP 84/85

Post by dragonator »

One more thing to try that will actually do it all together. I hope I wrote it right, it is difficult for me to test here. I works on port 7 bits 0 to 3, so pin 10-13. Let me know if it actually works or where it gives errors.

Code: Select all

byte pinTable[] = {10,12,11,13}; //port 7 bit 0,1,2 and 3

char a[] = {1,0,0,0,1,0,1,0,0,0,1,1,1,0};
char b[] = {0,1,0,0,1,0,1,0,0,0,1,1,0,0};
char c[] = {0,0,1,0,1,0,1,0,0,1,1,1,0,0};
char d[] = {0,0,0,1,1,0,1,0,1,1,1,1,1,0};

long pulse[14];
long decode_pulse;

void setup() 
{
for(int i=0; i<4; i++) 
  {
    pinMode(pinTable[i],OUTPUT); 
  }
  
  for(int i=0;i<14; i++) //encode the values to a single value that can be written to a port
  {
    pulse[i] = 0; //reset pulse
    bitWrite(pulse[i], 0, a[i]); //write 10 (a)
    bitWrite(pulse[i], 1, b[i]); //write 12 (b)
    bitWrite(pulse[i], 2, c[i]); //write 11 (c)
    bitWrite(pulse[i], 3, d[i]); //write 13 (d)
  }
}

void loop()
{   
  for(int i=0;i<14; i++)
  {
    decode_pulse = GPIO7_DR & ~15; //reset the first 4 bits of the port
    GPIO7_DR = decode_pulse| pulse[i]; //set the first 4 bits of the port
  }
}
MAsic12345
Posts: 116
Joined: Sat Aug 25, 2018 5:26 pm
Location: Poland

Re: Hacking cartridge HP 84/85

Post by MAsic12345 »

dragonator wrote: Mon Oct 07, 2019 5:15 pm One more thing to try that will actually do it all together. I hope I wrote it right, it is difficult for me to test here. I works on port 7 bits 0 to 3, so pin 10-13. Let me know if it actually works or where it gives errors.

no mistakes
Attachments
1123.png
1123.png (59.23 KiB) Viewed 29727 times
MAsic12345
Posts: 116
Joined: Sat Aug 25, 2018 5:26 pm
Location: Poland

Re: Hacking cartridge HP 84/85

Post by MAsic12345 »

Attachments
Безымянный.png
Безымянный.png (45.32 KiB) Viewed 29615 times
MAsic12345
Posts: 116
Joined: Sat Aug 25, 2018 5:26 pm
Location: Poland

Re: Hacking cartridge HP 84/85

Post by MAsic12345 »

finally the result of this long work.
it was hardcore for a person who did not do this before
it is a great joy and victory for me
Thanks to the people who helped me in this. Thank you very much.
Attachments
C0020T01.jpg
C0020T01.jpg (378.76 KiB) Viewed 29615 times
bigbomber
Posts: 9
Joined: Mon Aug 08, 2016 10:56 pm

Re: Hacking cartridge HP 84/85

Post by bigbomber »

congratulations!!!!
it is a very good to hear that HP 85 is hacked!!!
can you give us a conclusion about pinout, timings and nozzles physical specifications?
I'm very interested in your project
Post Reply