I think so. Are you trying to do something like this?
The code compiles under WINAVR.
(apologies for being a smartass :D )
// code begins //
#include <avr\pgmspace.h>
#include <avr\io.h>
#include <avr\interrupt.h>
#define true 1
#define false 0
char last_one; // previous encoder sample
char fault; // goes high when both lines change at once
int count; // motion accumulator
void idle( void) {} // dummy for encoder not moving
void encoder( char * port, char pin1, char pin2)
{
char this_one; // current encoder sample
char bit_3, bit_2, bit_1, bit_0;
last_one = this_one;
this_one = *port;
bit_3 = this_one & pin1;
bit_2 = this_one & pin2;
bit_1 = last_one & pin1;
bit_0 = last_one & pin2;
if( bit_3)
{
if( bit_2)
{
if( bit_1)
{
if( bit_0) count++;
else idle();
}
else
{
if( bit_0) fault = true;
else count--;
}
}
else
{
if( bit_1)
{
if( bit_0) idle();
else count--;
}
else
{
if( bit_0) count++;
else fault = true;
}
}
}
else
{
if( bit_2)
{
if( bit_1)
{
if( bit_0) fault = true;
else count++;
}
else
{
if( bit_0) count--;
else idle();
}
}
else
{
if( bit_1)
{
if( bit_0) count--;
else fault = true;
}
else
{
if( bit_0) idle();
else count++;
}
}
}
}
int main( void)
{
encoder( &PORTB, 0x08, 0x04);
}
// code ends //
Jeff Blaine wrote:
> erikc,
>
> In this project, yes they are together. But that's not always the case. If I can't find a better solution, then I will just set the routeene to work with a 2x4 pair and provide it an "encoder number" which would resolve to A0/A1 for encoder 1, A2/A3 for encoder 2, etc. That's easy. But given I use a rotary in almost everything now, I'm trying to move toward a function which would not have any prespecified index.
>
> Now that I think of it, I suppose I could set it up with arguments PORT, pin A, pin B.
>
> Something like this: char encoder_service(char *avr_port, unsigned char bit_mask_A, unsigned char bit_mask_B)
>
> Which would then be called as (example):
>
> x = encoder_service(&PORTA, 0x01, 0x02);
>
> Think that would work?
>
> 73/jeff/ac0c
> www.ac0c.com
>
>
>
> From: erikc
> Sent: Friday, August 06, 2010 7:45 AM
> To: AVR-Chat@yahoogroups.com
> Subject: Re: [AVR-Chat] passing an AVR port's bit pointer to to a function
>
>
>
> Will the port bits both be on the same port or can they be on
> different ports? If so, it seems to me that the best way to go would
> be to pass the port bits as a bit mask (i.e. pin7 = 0x80 rather than
> pin7 = 7) and do it that way.
>
> erikc
>
> Jeff Blaine wrote:
>> I have an encoder service function that reads a couple of bits from an AVR and increments a counter if a turn was decoded.
>>
>> To make the function generic, I would like to pass the port bits as arguments to the function.
>>
>> Unfortunately, I cannot quite figure out how to pass the port bits to the function. Appreciate advice as to what I'm overlooking...
>>
>> function prototype looks like this:
>>
>> char encoder_service(char *avr_port_bit_A, char *avr_port_bit_B) {
>>
>> }
>>
>> In the main program, I would have something like this to call the function
>>
>> x = char pointer to PORTA0
>> y = char pointer to PORTA1
>>
>> encoder_service( x , y );
>>
>> Using standard C.
>>
>> 73/jeff/ac0c
>> www.ac0c.comMessage
Re: [AVR-Chat] passing an AVR port's bit pointer to to a function
2010-08-06 by erikc
Attachments
- No local attachments were found for this message.