Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronic Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Register Log in

check value of the pins

Status
Not open for further replies.

foxbrain

Full Member level 2
Joined
Feb 1, 2010
Messages
142
Helped
5
Reputation
10
Reaction score
4
Trophy points
1,298
Location
Damas
Activity points
2,322
How can I check the value of the pins of one of the atmega16a ports?
i know how to check a value of one pin only by : Address & (1<<pin) ....
i'm using avr studio
thanks
 
Last edited:

dariush_abbasi

Member level 3
Joined
Oct 2, 2010
Messages
63
Helped
1
Reputation
2
Reaction score
1
Trophy points
1,288
Activity points
1,682
Hi,
Would you please explain what you want to do?
I don't have your compiler and don't know its syntax but in PIC for example if you want to check whether the B PORT is equal to 8 ,you can simply use and if instruction.
Code:
if(PORTB == 8){}
 

Arch Zone

Full Member level 3
Joined
Dec 18, 2011
Messages
171
Helped
37
Reputation
74
Reaction score
37
Trophy points
1,308
Location
Daerah Khusus Ibukota Jakarta, Indonesia
Activity points
2,281
Try this.
This example explains if we want to test bit 0, 4 and 5 of Pin C

Ldi R16,0 ;port c as input
Out 0x14,R16

In R16,0x13 ;read from pin C
andi R16,0x31 ;discard another bits : xxxx xxxx & 0011 0001 ---> 00xx 000x
Cpi R16,0x31 ;compare immediate with 0x31
brne not_equal
.....


not_equal:
.....
 

foxbrain

Full Member level 2
Joined
Feb 1, 2010
Messages
142
Helped
5
Reputation
10
Reaction score
4
Trophy points
1,298
Location
Damas
Activity points
2,322
Would you please explain what you want to do?
sorry for dis explain ....
first i'm using atmega16a and i'm using avr studio as a compiler.
second i'm programming in C language.
third i want (for example): if pins 0,1,2 are high and the others are low (3--7) then do something......
i tried to put IF(PINC==0b00000111){do something} but it didn't work
 

Arch Zone

Full Member level 3
Joined
Dec 18, 2011
Messages
171
Helped
37
Reputation
74
Reaction score
37
Trophy points
1,308
Location
Daerah Khusus Ibukota Jakarta, Indonesia
Activity points
2,281
Basicly, AVR studio is only for assembly language, but it's can be combined with c (avrgcc or others).
From my last post, you can learn it's algorithm and convert to c language.

unsigned char a; //for avrgcc uint8 a;
DDRC=0x00; //Port C as input
PORTC=0x00; //disable pull-up or you can change it with PORTC=0xFF (enable pull-up)
a=PINC; //store conditions of pins, so we only have to read it once.
if (a==0x03)
{
.....
.....
.....
}
else
{
if (a==...)
{
.....
.....
.....
}
else
{

};
};


and let me know, where it doesn't work.

Thanks.
 

alexan_e

Administrator
Joined
Mar 16, 2008
Messages
11,895
Helped
2,021
Reputation
4,158
Reaction score
2,031
Trophy points
1,393
Location
Greece
Activity points
64,377
PC4 to PC7 are JTAG pins by default, have you disabled the JTAG fuse (JTAGEN)?
You have to disable the fuse in order for the pins to operate as normal I/O.


You code is fine
IF(PINC==0b00000111){do something}
Alex
 

foxbrain

Full Member level 2
Joined
Feb 1, 2010
Messages
142
Helped
5
Reputation
10
Reaction score
4
Trophy points
1,298
Location
Damas
Activity points
2,322
Arch Zone:
i meant avrgcc when i said avr studio because it is added to it........
unsigned char a; //for avrgcc uint8 a;
u meant uint8_t because uint8 didn't work by the compiler...
but even this code didn't work
alexan_e:
i'm exactly working on portD and on pins from 0 to 3 i'm connecting to them a dtmf receiver so i want to make every button on the telephone has a meaning .....
the code u wrote didn't work i tried it.
 

alexan_e

Administrator
Joined
Mar 16, 2008
Messages
11,895
Helped
2,021
Reputation
4,158
Reaction score
2,031
Trophy points
1,393
Location
Greece
Activity points
64,377
The code is fine , if for some reason the value is not the one you expect this is not a problem of the above code.
Maybe your device is giving a different signal of maybe you need to enable the internal pull up resistors.
Also make sure that the pins are set as inputs.
What do you mean when you say that it is not working, can you be more specific?

Concerning the comment of the previous post you can use unsigned char or signed char or uint8_t etc , as long as you use in the condition a binary or hex value the comparison result is exactly the same, there is only a difference if you want to use a decimal format number >127 .
 

foxbrain

Full Member level 2
Joined
Feb 1, 2010
Messages
142
Helped
5
Reputation
10
Reaction score
4
Trophy points
1,298
Location
Damas
Activity points
2,322
dtmfdecoder_schematic.gif
i'm using this schematic but the addition is that i'm connecting it to atmega16a to portD0-3 and i'm connecting all portC to leds
and the code is:
#include <avr/io.h>
#include <util/delay.h>
#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
int main(void)
{
uint8_t z;
DDRC=0xFF;
PORTC=0x00;
DDRD=0x00;


while(1)
{
z=PIND;
_delay_ms(50);
if(z==0x04)
{
SETBIT(PORTC,1);
}
else {}
_delay_ms(1000);
PORTC=0x00;
}
return 0;
}
so if i pressed 2 the led on portC1 should blink while nothing is happening...
 
Last edited:

alexan_e

Administrator
Joined
Mar 16, 2008
Messages
11,895
Helped
2,021
Reputation
4,158
Reaction score
2,031
Trophy points
1,393
Location
Greece
Activity points
64,377
Is port D connected to the led anodes (DS1-DS5)?
Are the leds in place?
Is the voltage at the led anode 5v then the led is on?
 

foxbrain

Full Member level 2
Joined
Feb 1, 2010
Messages
142
Helped
5
Reputation
10
Reaction score
4
Trophy points
1,298
Location
Damas
Activity points
2,322
it looks i found the error
it's because i left the other pins of PIND not connected to the ground....
 

alexan_e

Administrator
Joined
Mar 16, 2008
Messages
11,895
Helped
2,021
Reputation
4,158
Reaction score
2,031
Trophy points
1,393
Location
Greece
Activity points
64,377
Note that (z==0x04) checks for an exact value of all 8 bits , are you sure that this is what you want?
Can be sure that the other 7 bits are 0?
 

foxbrain

Full Member level 2
Joined
Feb 1, 2010
Messages
142
Helped
5
Reputation
10
Reaction score
4
Trophy points
1,298
Location
Damas
Activity points
2,322
but how can i specify only the first 4 pins in portD0-3 in my code?
 

alexan_e

Administrator
Joined
Mar 16, 2008
Messages
11,895
Helped
2,021
Reputation
4,158
Reaction score
2,031
Trophy points
1,393
Location
Greece
Activity points
64,377
if you want to mask the first 4 bits then you can use if((z & 0x0F) == (0x04)) so that you set them to 0 and then the code checks is the last four are 1000

Or in the step where you assign the variable

z= (PIND & 0x0F);
 
Status
Not open for further replies.
Toggle Sidebar

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Top