0
votes

I am trying to create a simple functionality by using portG.

If the switch in PG0 is closed, The led in PG1 should be turned on. Else, The led should be off. However, I do not know how to use one bit as output while the other one is input.

enter image description here

1
There's a port configuration register for that. Once you configure which pins are input and which are output, you can write to the port and the output pins will respond to the value you write. - Erik Eidt

1 Answers

1
votes

A C program like this should work:

#include <avr/io.h>

void main() {
  DDRG |= (1 << 1);
  while (true) {
    if (PING & (1 << 0)) {
      // Button is pressed so drive PG1 high.
      PORTG |= (1 << 1);
    }
    else {
      PORTG &= ~(1 << 1);
    }
  }
}

We can use Godbolt.org to convert that program to assembly:

main:
        lds r24,100
        ori r24,lo8(2)
        sts 100,r24
.L2:
        lds r24,99
        sbrs r24,0
        rjmp .L3
        lds r24,101
        ori r24,lo8(2)
        rjmp .L5
.L3:
        lds r24,101
        andi r24,lo8(-3)
.L5:
        sts 101,r24
        rjmp .L2

(That's not a very good-looking assembly program because of the arbitrary numbers like 99 and 101, but you can probably figure out what registers those numbers refer to and replace those numbers with regester names. You'd also want to rename the labels.)