Go Down

Topic: full adder/subtracter with carry (Read 1 time) previous topic - next topic

z2012

I have 2 8bit bytes that come in from the SPI. I need to add or subtract a 1 to the bytes. So I need help with a code that can add to the lower byte and be able to carry into the high byte when necessary. I also have no idea how to subtract.

The other option is a increment/decrement system for the 16bits.

This is simple using chips. :smiley-roll:

Arrch

Thats a simple if statement. After you add, check if the new value is 0. If so, add 1 to the high byte. Alternatively, you can use a union.

AWOL

Quote
This is simple using chips

Quicker too.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

el_supremo

Just construct a 16-bit integer with the hi and lo bytes, add 1, and you're done.

Pete

PeterH


The other option is a increment/decrement system for the 16bits.


In my opinion this is the only approach that makes sense. From the description you've given it's apparent that the two bytes are conceptually holding a 16-bit value, so if you just store that value in a 16-bit int then manipulating the value becomes trivial.
I only provide help via the forum - please do not contact me for private consultancy.

z2012

The 2 bytes is incremented up or down by 1 then sent back out on the SPI lines. As far as I know SPI wants 8bit binary bytes.

Arrch


The 2 bytes is incremented up or down by 1 then sent back out on the SPI lines. As far as I know SPI wants 8bit binary bytes.


Then use a union.

JimEli

#7
Jun 28, 2013, 11:03 pm Last Edit: Jun 30, 2013, 04:47 pm by JimEli Reason: 1
add:
Code: [Select]

unsigned char low, high;

void setup() {                
}

void loop() {

  //add 1 with carry
 asm(
   "lds r24, (low)  \n\t"  //low byte
   "lds r25, (high) \n\t"  //high byte
   "ldi r23, 1      \n\t"  
   "add r24, r23    \n\t"  //increment low byte by 1
   "adc r25, 0x00   \n\t"  //add carry to high byte
   "sts (low), r24  \n\t"  //save results
   "sts (high), r25 \n\t"
   ::: "r23","r24", "r25"
 );

  //subtract 1 with carry
  asm(
    "lds r24, (low)  \n\t"
    "lds r25, (high) \n\t"
    "ldi r23, 1      \n\t"
    "sub r24, r23    \n\t"
    "sbc r25, 0x00   \n\t"
    "sts (low), r24  \n\t"
    "sts (high), r25 \n\t"
    ::: "r24", "r25"
  );
}


Edit note: for completeness I included the subtraction code. My original thought was that the OP was requesting an assembly language routine.

PeterH


The 2 bytes is incremented up or down by 1 then sent back out on the SPI lines. As far as I know SPI wants 8bit binary bytes.


So, put them into an int, modify the int and then take them out again. Converting between a pair of bytes and an int is quick and easy.
I only provide help via the forum - please do not contact me for private consultancy.

Nick Gammon


add:
Code: [Select]

unsigned char low, high;

void setup() {                
}

void loop() {
 asm(
   "lds r24, (low)  \n\t"  //low byte
   "lds r25, (high) \n\t"  //high byte
   "ldi r23, 1      \n\t"  
   "add r24, r23    \n\t"  //increment low byte by 1
   "adc r25, 0x00   \n\t"  //add carry to high byte
   "sts (low), r24  \n\t"  //save results
   "sts (high), r25 \n\t"
   ::: "r23","r24", "r25"
 );
}



The compiler can handle adding one to an integer. You don't need to drop into assembler for that. ;)
Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

Nick Gammon


I have 2 8bit bytes that come in from the SPI. I need to add or subtract a 1 to the bytes.


Perhaps show your existing code?
Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

z2012

Quote
highbyte = B00000000; //cmd0 NOP to read control SDO
        lowbyte = B00000000;
        digitalWrite(SSP, LOW);
        rdacsethigh = SPI.transfer(highbyte); //sent cmd0
        rdacsetlow = SPI.transfer(lowbyte);   //and read SDO
        digitalWrite(SSP, HIGH);



Sorry I am an electrical engineer, im not into software. How do I convert into and out of the integer?

PeterH

Code: [Select]

int tmp = word(highbyte, lowbyte);
tmp++;
highbyte = highByte(tmp);
lowbyte = lowByte(tmp);


It could be made more compact but you get the idea.
I only provide help via the forum - please do not contact me for private consultancy.

z2012

Thank you PeterH, what you did makes sense.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy