Yahoo Groups archive

AVR-Chat

Index last updated: 2026-04-28 22:41 UTC

Message

Re: [AVR-Chat] passing an AVR port's bit pointer to to a function

2010-08-07 by Jeff Blaine

Erikc,

Yes, exactly like that.  Thanks!

73/jeff/ac0c
www.ac0c.com



From: erikc 
Sent: Friday, August 06, 2010 6:20 PM
To: AVR-Chat@yahoogroups.com 
Subject: Re: [AVR-Chat] passing an AVR port's bit pointer to to a function


  
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.com




[Non-text portions of this message have been removed]

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.