PORTL Atmega 2560

Go To Last Post
15 posts / 0 new
Author
Message
#1
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Hello all,

i got problem using PORTL on Atmega 2560, i got this error message when i code PORTL.6 = 1 :

"the first argument of the '.' operator must be of 'struct' or 'union' type"

this error only occur when i use PORTL, so anyone can help me ?

Here is my code :


#include 
#include 
#include 
#include 
#include 

#define MAX 0xFF

int i;
int encoder_axis_1, encoder_axis_2, encoder_axis_3, encoder_axis_4, encoder_axis_5;
unsigned char lcd_encoder_axis_1[5], lcd_encoder_axis_2[5], lcd_encoder_axis_3[5], lcd_encoder_axis_4[5], lcd_encoder_axis_5[5];

void lcd_setting()
{
    /*
    LCD on port C
    */
    
    #asm
    .equ __lcd_port=0x08 ;PORTC
    #endasm
}

void oscillator_setting()
{
    /*
    Crystal Division Factor : 1
    */
   
    #pragma optsize-
    CLKPR=0x80;
    CLKPR=0x00;
    #ifdef _OPTIMIZE_SIZE_
    #pragma optsize+
    #endif
}
  
void ports_setting()
{
     /*
    board configuration
    
        F0F7K0K7    
    E0             A0
    E7             A7
    H0             J7
    H7     uC      J0
    B4             C7
    B7             C0
    G0
    G5
        L0L7D0D7    
    */   

    PORTF =0b00000000;
    DDRF  =0b11111111;  
    
       
    //DDRK    = 0xFF;         
    //PORTK   = 0x00;         
        
    //PORT A
    //DDRA = 0b11111111;  
 
    
    //PORT B
    //DDRB = 0b11111111;  
    
       
    //PORT C
    //DDRC = 0b11111111;  
   
    
    PORTD= 0b00000000; 
    DDRD = 0b00000000; 
    
    //PORTE = 0b00000000;
    DDRE  = 0b11111111; 
    
    //PORT G
    //DDRG = 0b11111111;  
  
    
    //PORTH
    //DDRH = 0b11111110;
    
    
    //PORTJ
    //DDRJ = 0b11111110; 
   
     
    //PORTL= 0b11111111;
    DDRL = 0b11111111; 
    

void timers_setting()
{
    /*
    Timer/Counter 5 initialization
    Clock source: System Clock
    Clock value: 16000.000 kHz
    Mode: Ph. correct PWM top=00FFh
    OC5A output: Discon.
    OC5B output: Non-Inv.
    OC5C output: Non-Inv.
    Noise Canceler: On
    Input Capture on Falling Edge
    Timer 5 Overflow Interrupt: Off
    Input Capture Interrupt: Off
    Compare A Match Interrupt: Off
    Compare B Match Interrupt: Off
    Compare C Match Interrupt: Off
    */
    TCCR5A=0x29;
    TCCR5B=0x81;
    TCNT5H=0x00;
    TCNT5L=0x00;
    ICR5H=0x00;
    ICR5L=0x00;
    OCR5AH=0x00;
    OCR5AL=0x00;
    OCR5BH=0x00;
    OCR5BL=0x00;
    OCR5CH=0x00;
    OCR5CL=0x00;
} 

void interrupt_setting()
{
    /*
    External Interrupt(s) initialization
    INT0: On
    INT0 Mode: Rising Edge
    INT1: On
    INT1 Mode: Rising Edge
    INT2: On
    INT2 Mode: Rising Edge
    INT3: On
    INT3 Mode: Rising Edge
    INT4: On
    INT4 Mode: Rising Edge
    INT5: On
    INT5 Mode: Rising Edge
    INT6: On
    INT6 Mode: Rising Edge
    INT7: On
    INT7 Mode: Rising Edge
    */
    EICRA=0xFF;
    EICRB=0xFF;
    EIMSK=0xFF;
    EIFR=0xFF;
}  

void motor_control(float duty_cycle_axis_1, int input_1_axis_1, int input_2_axis_1, float duty_cycle_axis_2, int input_1_axis_2, int input_2_axis_2)
{
     /*
    Motor Control
    Axis_1 :
    PWM_axis_1          = PORTL.5 OCR5C
    input_1_axis_1      = PORTL.6
    input_2_axis_1      = PORTL.7

    Axis_2 :
    PWM_axis_2          = PORTL.4 OCR5B
    input_1_axis_2      = PORTL.2
    input_2_axis_2      = PORTL.3  
    */    

    OCR5BH  = MAX*duty_cycle_axis_2;
    OCR5BL  = MAX*duty_cycle_axis_2;
    OCR5CH  = MAX*duty_cycle_axis_1;
    OCR5CL  = MAX*duty_cycle_axis_1;
    
    PORTL.2 = input_1_axis_2;
    PORTL.3 = input_2_axis_2;
    PORTL.6 = input_1_axis_1;
    PORTL.7 = input_2_axis_1;
}

void motor_stop()
{
    motor_control(0,0,0,0,0,0);
}

interrupt [INT1] void ext_int1_isr(void)
{
    encoder_axis_1++;
}


interrupt [INT2] void ext_int2_isr(void)
{
    encoder_axis_2++;
}


interrupt [INT3] void ext_int3_isr(void)
{
    encoder_axis_3++;
}


interrupt [INT4] void ext_int4_isr(void)
{
    encoder_axis_4++;
}


interrupt [INT5] void ext_int5_isr(void)
{
    encoder_axis_5++;
}

void test_encoder()
{
    #asm ("sei");
    while( encoder_axis_1 <= 145 )
    {
        motor_control(0.5,1,0,0,1,0);           
    }
    motor_stop();
    #asm ("cli");
}

void brake_axis_2_off()
{
    PORTF.0 = 1;
}

void brake_axis_3_off()
{
    PORTF.1 = 1;
}

void brake_axis_2_on()
{
    PORTF.0 = 0;
}

void brake_axis_3_on()
{
    PORTF.1 = 0;
}

void main(void)
{  
    lcd_init(16);
    oscillator_setting();
    ports_setting();
    timers_setting();
    lcd_setting();
    interrupt_setting();
    
    lcd_gotoxy(0,0);
    lcd_putsf("ready");
    delay_ms(3000);
    lcd_clear();
    
    while(1)
    {
        brake_axis_2_off();
        brake_axis_3_off();
    }
     
}

the compiler error on the motor_control function, at

    PORTL.2 = input_1_axis_2;
    PORTL.3 = input_2_axis_2;
    PORTL.6 = input_1_axis_1;
    PORTL.7 = input_2_axis_1;

if i change to another port, the error gone, example

    PORTE.2 = input_1_axis_2;
    PORTE.3 = input_2_axis_2;
    PORTE.6 = input_1_axis_1;
    PORTE.7 = input_2_axis_1;

:?: [/code]

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

The . I/O register bit syntax of CodeVision will only work for I/O registers in the range of the IN/OUT instructions.

So use the conventional bit-manipulation techniques. See Programming 101 in the Tutorials forum.

Quote:

PORTL.2 = input_1_axis_2;

So where is input_1_axis_2 and its cousins declared? And how does it get set? On an AVR, it is not very efficient--it takes several instructions--to "copy" a bit value to an I/O pin.

Lee

You can put lipstick on a pig, but it is still a pig.

I've never met a pig I didn't like, as long as you have some salt and pepper.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

thx lee,

but i still confused why i can't use the PORTL, is it a special PORT ?

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

What is the I/O address of PORTL? or PINL? or DDRL? or PORTK? or PORTJ? or UCSR3B?

Can those addresses be reached in I/O space using SBI/CBI instructions, or only in SRAM space?

Then look in the compiler's documentation--manual, Help--for "Bit Level Access to the I/O Registers".

You can put lipstick on a pig, but it is still a pig.

I've never met a pig I didn't like, as long as you have some salt and pepper.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

i already read the header of mega2560.h, here is the code :

// CodeVisionAVR C Compiler
// (C) 1998-2005 Pavel Haiduc, HP InfoTech S.R.L.

// I/O registers definitions for the ATmega2560

#ifndef _MEGA2560_INCLUDED_
#define _MEGA2560_INCLUDED_

#pragma used+
sfrb PINA=0;
sfrb DDRA=1;
sfrb PORTA=2;
sfrb PINB=3;
sfrb DDRB=4;
sfrb PORTB=5;
sfrb PINC=6;
sfrb DDRC=7;
sfrb PORTC=8;
sfrb PIND=9;
sfrb DDRD=0xa;
sfrb PORTD=0xb;
sfrb PINE=0xc;
sfrb DDRE=0xd;
sfrb PORTE=0xe;
sfrb PINF=0xf;
sfrb DDRF=0x10;
sfrb PORTF=0x11;
sfrb PING=0x12;
sfrb DDRG=0x13;
sfrb PORTG=0x14;
sfrb TIFR0=0x15;
sfrb TIFR1=0x16;
sfrb TIFR2=0x17;
sfrb TIFR3=0x18;
sfrb TIFR4=0x19;
sfrb TIFR5=0x1a;
sfrb PCIFR=0x1b;
sfrb EIFR=0x1c;
sfrb EIMSK=0x1d;
sfrb GPIOR0=0x1e;
sfrb EECR=0x1f;
sfrb EEDR=0x20;
sfrb EEARL=0x21;
sfrb EEARH=0x22;
sfrw EEAR=0X21;   // 16 bit access
sfrb GTCCR=0x23;
sfrb TCCR0A=0x24;
sfrb TCCR0B=0x25;
sfrb TCNT0=0x26;
sfrb OCR0A=0x27;
sfrb OCR0B=0x28;
sfrb GPIOR1=0x2a;
sfrb GPIOR2=0x2b;
sfrb SPCR=0x2c;
sfrb SPSR=0x2d;
sfrb SPDR=0x2e;
sfrb ACSR=0x30;
sfrb OCDR=0x31;
sfrb SMCR=0x33;
sfrb MCUSR=0x34;
sfrb MCUCR=0x35;
sfrb SPMCSR=0x37;
sfrb RAMPZ=0x3b;
sfrb EIND=0x3c;
sfrb SPL=0x3d;
sfrb SPH=0x3e;
sfrb SREG=0x3f;
#pragma used-

#define WDTCSR (*(unsigned char *) 0x60)
#define CLKPR (*(unsigned char *) 0x61)
#define PRR0 (*(unsigned char *) 0x64)
#define PRR1 (*(unsigned char *) 0x65)
#define OSCCAL (*(unsigned char *) 0x66)
#define PCICR (*(unsigned char *) 0x68)
#define EICRA (*(unsigned char *) 0x69)
#define EICRB (*(unsigned char *) 0x6a)
#define PCMSK0 (*(unsigned char *) 0x6b)
#define PCMSK1 (*(unsigned char *) 0x6c)
#define PCMSK2 (*(unsigned char *) 0x6d)
#define TIMSK0 (*(unsigned char *) 0x6e)
#define TIMSK1 (*(unsigned char *) 0x6f)
#define TIMSK2 (*(unsigned char *) 0x70)
#define TIMSK3 (*(unsigned char *) 0x71)
#define TIMSK4 (*(unsigned char *) 0x72)
#define TIMSK5 (*(unsigned char *) 0x73)
#define XMCRA (*(unsigned char *) 0x74)
#define XMCRB (*(unsigned char *) 0x75)
#define ADCL (*(unsigned char *) 0x78)
#define ADCH (*(unsigned char *) 0x79)
#define ADCW (*(unsigned int *) 0x78) // 16 bit access
#define ADCSRA (*(unsigned char *) 0x7a)
#define ADCSRB (*(unsigned char *) 0x7b)
#define ADMUX (*(unsigned char *) 0x7c)
#define DIDR2 (*(unsigned char *) 0x7d)
#define DIDR0 (*(unsigned char *) 0x7e)
#define DIDR1 (*(unsigned char *) 0x7f)
#define TCCR1A (*(unsigned char *) 0x80)
#define TCCR1B (*(unsigned char *) 0x81)
#define TCCR1C (*(unsigned char *) 0x82)
#define TCNT1L (*(unsigned char *) 0x84)
#define TCNT1H (*(unsigned char *) 0x85)
#define ICR1L (*(unsigned char *) 0x86)
#define ICR1H (*(unsigned char *) 0x87)
#define OCR1AL (*(unsigned char *) 0x88)
#define OCR1AH (*(unsigned char *) 0x89)
#define OCR1BL (*(unsigned char *) 0x8a)
#define OCR1BH (*(unsigned char *) 0x8b)
#define OCR1CL (*(unsigned char *) 0x8c)
#define OCR1CH (*(unsigned char *) 0x8d)
#define TCCR3A (*(unsigned char *) 0x90)
#define TCCR3B (*(unsigned char *) 0x91)
#define TCCR3C (*(unsigned char *) 0x92)
#define TCNT3L (*(unsigned char *) 0x94)
#define TCNT3H (*(unsigned char *) 0x95)
#define ICR3L (*(unsigned char *) 0x96)
#define ICR3H (*(unsigned char *) 0x97)
#define OCR3AL (*(unsigned char *) 0x98)
#define OCR3AH (*(unsigned char *) 0x99)
#define OCR3BL (*(unsigned char *) 0x9a)
#define OCR3BH (*(unsigned char *) 0x9b)
#define OCR3CL (*(unsigned char *) 0x9c)
#define OCR3CH (*(unsigned char *) 0x9d)
#define TCCR4A (*(unsigned char *) 0xa0)
#define TCCR4B (*(unsigned char *) 0xa1)
#define TCCR4C (*(unsigned char *) 0xa2)
#define TCNT4L (*(unsigned char *) 0xa4)
#define TCNT4H (*(unsigned char *) 0xa5)
#define ICR4L (*(unsigned char *) 0xa6)
#define ICR4H (*(unsigned char *) 0xa7)
#define OCR4AL (*(unsigned char *) 0xa8)
#define OCR4AH (*(unsigned char *) 0xa9)
#define OCR4BL (*(unsigned char *) 0xaa)
#define OCR4BH (*(unsigned char *) 0xab)
#define OCR4CL (*(unsigned char *) 0xac)
#define OCR4CH (*(unsigned char *) 0xad)
#define TCCR2A (*(unsigned char *) 0xb0)
#define TCCR2B (*(unsigned char *) 0xb1)
#define TCNT2 (*(unsigned char *) 0xb2)
#define OCR2A (*(unsigned char *) 0xb3)
#define OCR2B (*(unsigned char *) 0xb4)
#define ASSR (*(unsigned char *) 0xb6)
#define TWBR (*(unsigned char *) 0xb8)
#define TWSR (*(unsigned char *) 0xb9)
#define TWAR (*(unsigned char *) 0xba)
#define TWDR (*(unsigned char *) 0xbb)
#define TWCR (*(unsigned char *) 0xbc)
#define TWAMR (*(unsigned char *) 0xbd)
#define UCSR0A (*(unsigned char *) 0xc0)
#define UCSR0B (*(unsigned char *) 0xc1)
#define UCSR0C (*(unsigned char *) 0xc2)
#define UBRR0L (*(unsigned char *) 0xc4)
#define UBRR0H (*(unsigned char *) 0xc5)
#define UDR0 (*(unsigned char *) 0xc6)
#define UCSR1A (*(unsigned char *) 0xc8)
#define UCSR1B (*(unsigned char *) 0xc9)
#define UCSR1C (*(unsigned char *) 0xca)
#define UBRR1L (*(unsigned char *) 0xcc)
#define UBRR1H (*(unsigned char *) 0xcd)
#define UDR1 (*(unsigned char *) 0xce)
#define UCSR2A (*(unsigned char *) 0xd0)
#define UCSR2B (*(unsigned char *) 0xd1)
#define UCSR2C (*(unsigned char *) 0xd2)
#define UBRR2L (*(unsigned char *) 0xd4)
#define UBRR2H (*(unsigned char *) 0xd5)
#define UDR2 (*(unsigned char *) 0xd6)
#define PINH (*(unsigned char *) 0x100)
#define DDRH (*(unsigned char *) 0x101)
#define PORTH (*(unsigned char *) 0x102)
#define PINJ (*(unsigned char *) 0x103)
#define DDRJ (*(unsigned char *) 0x104)
#define PORTJ (*(unsigned char *) 0x105)
#define PINK (*(unsigned char *) 0x106)
#define DDRK (*(unsigned char *) 0x107)
#define PORTK (*(unsigned char *) 0x108)
#define PINL (*(unsigned char *) 0x109)
#define DDRL (*(unsigned char *) 0x10a)
#define PORTL (*(unsigned char *) 0x10b)
#define TCCR5A (*(unsigned char *) 0x120)
#define TCCR5B (*(unsigned char *) 0x121)
#define TCCR5C (*(unsigned char *) 0x122)
#define TCNT5L (*(unsigned char *) 0x124)
#define TCNT5H (*(unsigned char *) 0x125)
#define ICR5L (*(unsigned char *) 0x126)
#define ICR5H (*(unsigned char *) 0x127)
#define OCR5AL (*(unsigned char *) 0x128)
#define OCR5AH (*(unsigned char *) 0x129)
#define OCR5BL (*(unsigned char *) 0x12a)
#define OCR5BH (*(unsigned char *) 0x12b)
#define OCR5CL (*(unsigned char *) 0x12c)
#define OCR5CH (*(unsigned char *) 0x12d)
#define UCSR3A (*(unsigned char *) 0x130)
#define UCSR3B (*(unsigned char *) 0x131)
#define UCSR3C (*(unsigned char *) 0x132)
#define UBRR3L (*(unsigned char *) 0x134)
#define UBRR3H (*(unsigned char *) 0x135)
#define UDR3 (*(unsigned char *) 0x136)

// Interrupt vectors definitions

#define INT0 2
#define INT1 3
#define INT2 4
#define INT3 5
#define INT4 6
#define INT5 7
#define INT6 8
#define INT7 9
#define PCINT0 10
#define PCINT1 11
#define PCINT2 12
#define WDT 13
#define TIM2_COMPA 14
#define TIM2_COMPB 15
#define TIM2_OVF 16
#define TIM1_CAPT 17
#define TIM1_COMPA 18
#define TIM1_COMPB 19
#define TIM1_COMPC 20
#define TIM1_OVF 21
#define TIM0_COMPA 22
#define TIM0_COMPB 23
#define TIM0_OVF 24
#define SPI_STC 25
#define USART0_RXC 26
#define USART0_UDRE 27
#define USART0_TXC 28
#define ANA_COMP 29
#define ADC_INT 30
#define EE_RDY 31
#define TIM3_CAPT 32
#define TIM3_COMPA 33
#define TIM3_COMPB 34
#define TIM3_COMPC 35
#define TIM3_OVF 36
#define USART1_RXC 37
#define USART1_UDRE 38
#define USART1_TXC 39
#define TWI 40
#define SPM_READY 41
#define TIM4_CAPT 42
#define TIM4_COMPA 43
#define TIM4_COMPB 44
#define TIM4_COMPC 45
#define TIM4_OVF 46
#define TIM5_CAPT 47
#define TIM5_COMPA 48
#define TIM5_COMPB 49
#define TIM5_COMPC 50
#define TIM5_OVF 51
#define USART2_RXC 52
#define USART2_UDRE 53
#define USART2_TXC 54
#define USART3_RXC 55
#define USART3_UDRE 56
#define USART3_TXC 57

#define USART_RXC USART0_RXC
#define USART_DRE USART0_UDRE
#define USART_TXC USART0_TXC

// Needed by the power management functions (sleep.h)
#define __SLEEP_SUPPORTED__
#define __POWERDOWN_SUPPORTED__
#define __POWERSAVE_SUPPORTED__
#define __STANDBY_SUPPORTED__
#define __EXTENDED_STANDBY_SUPPORTED__
#asm
	#ifndef __SLEEP_DEFINED__
	#define __SLEEP_DEFINED__
	.EQU __se_bit=0x01
	.EQU __sm_mask=0x0E
	.EQU __sm_powerdown=0x04
	.EQU __sm_powersave=0x06
	.EQU __sm_standby=0x0C
	.EQU __sm_ext_standby=0x0E
	.EQU __sm_adc_noise_red=0x02
	.SET power_ctrl_reg=smcr
	#endif
#endasm

#endif

i saw in that header PORTH to PORTL defined in different way from PORTA to PORTG, but i don't know how to modify this header.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Did you read the section in the manual that I pointed out?

Modifying the header file will do you no good--see the conditions for using the dot syntax in that section.

Did you find the Programming 101 article, and read it?
https://www.avrfreaks.net/index.p...

You can put lipstick on a pig, but it is still a pig.

I've never met a pig I didn't like, as long as you have some salt and pepper.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

hallo,

after i read the tutorial i change my code to :

    PORTL = (input_1_axis_2 << 2); 
    PORTL = (input_2_axis_2 << 3);
    PORTL = (input_1_axis_1 << 6);
    PORTL = (input_2_axis_1 << 7);

and it works !! thanks for the help

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Are you sure you mean "=" and not "|=" or "&=~" ? As it stands your setting the entire 8 bits to get one single bit set. As long as all bits are mutually exclusive you'll be OK but as soon as you need bit combinations you have a problem.

While CV's bit access method on low ports is a nice (non standard) feature it's downside seems to be that it prevents folks learning the "standard" way to set and clear bits with good old ORs and AND/NOTs

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Grrr--I've gotten out of the bed on the wrong side today, Cliff. How does the feature (and we've gone over and over the historical roots) "prevent" anything?

Does GCC's extended goto syntax "prevent folks" from using it in the "standard" way?

You can put lipstick on a pig, but it is still a pig.

I've never met a pig I didn't like, as long as you have some salt and pepper.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Quote:

How does the feature (and we've gone over and over the historical roots) "prevent" anything?

It does not - but it draws beginners into a mindset of believing that setting/clearing bits is as simple as setting XXXX.n to 0 or 1. They come to rely on it and are then sadly let down when it is not applicable to out of range registers. Surely Pavel could offer it for higher registers and just do an RMW rather than an SBI/CBI "behind the user's back"?

What's that word they used to always use to describe the 68000? Ah, yes, "orthogonal".

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

if i want to use a bit combination should i make a macro? what should i do to make PORTL = 0b00110011 using that method ?

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

If you write the bits (and only the bits) one at a time you can make any combination you like. If you wanted PORTL to contain 0b00110011 you could do it as:

PORTL = 0x33;

but you could equally do it as:

PORTL |= (1 << 5);
PORTL |= (1 << 4);
PORTL |= (1 << 1);
PORTL |= (1 << 0);

as four separate single bit setting operations. The difference being that for a few cycles only some but not all of the pattern bits will be set but this does give you individual bit control.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

so if use this code :

void motor_control(int input_1_axis_1, int input_2_axis_1, int input_1_axis_2, int input_2_axis_2)
{
    PORTL |= (input_1_axis_2 << 2); 
    PORTL |= (input_2_axis_2 << 3);
    PORTL |= (input_1_axis_1 << 6);
    PORTL |= (input_2_axis_1 << 7);
}

can i call the function like this to make the PORTL contain 0b00110011 ?:

motor_control(1,0,1,0);
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Quote:

can i call the function like this to make the PORTL contain 0b00110011 ?:

No because in your parameter list only input_1_axis_1 (bit 6) and input_1_axis_2 (bit 2) are set so, assuming PORTL starts at 0x00 this would set it to be 0b01000100

That is an issue for you - you set bit with |= but have no way to ever reset them. I guess what you really mean is:

void motor_control(int input_1_axis_1, int input_2_axis_1, int input_1_axis_2, int input_2_axis_2) 
{
    if (input_1_axis_2) { 
        PORTL |= (1 << 2); 
    }
    else {
        PORTL &= ~(1 << 2); 
    }
    if (input_2_axis_2) {
        PORTL |= (1 << 3); 
    }
    else {
        PORTL &= ~(1 << 3); 
    }
    if (input_1_axis_1) {
        PORTL |= (1 << 6); 
    }
    else {
        PORTL &= ~(1 << 6); 
    }
    if (input_2_axis_1) {
        PORTL |= (1 << 7); 
    }
    else {
        PORTL &= ~(1 << 7); 
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Owh oke that's solve my problem, thanks a lot for helping me..