Atmega2560 PWM bits disable

Status
Not open for further replies.

imranahmed

Advanced Member level 3
Joined
Dec 4, 2011
Messages
817
Helped
3
Reputation
6
Reaction score
3
Trophy points
1,298
Location
Karachi,Pakistan
Activity points
6,492
Please let me know I am using Atmega2560 program by Arduino IDE not ArduinoMega2560, I run a code successfully all is well, I attached a button on interrupt.
Output is a fan and 2 leds, fan is drive by L293 module. I want L293 connected to two PWM channel and 2 led connected to different PWM channel and I want to stop LEDs and motor when press button. It is not stoping.

Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <Arduino.h>

void initPWM()
{
  DDRB |= (1 << 5);  // PORTB5 pin as output for LED 1
  TCCR1A = _BV(COM1A1) | _BV(WGM10); // non-inverting mode, fast pwm with top as 0xFF
  TCCR1B = _BV(CS11); // prescaler set to clk/8

  DDRE |= (1 << 3); // PORTE3 pin as output for motor driver IN1
  TCCR3A = _BV(COM3A1) | _BV(WGM30);   // non-inverting mode, fast pwm with top as 0xFF
  TCCR3B = _BV(CS31);// prescaler set to clk/8

  DDRH |= (1 << 3); // PORTH3 pin as output for motor driver IN2
  TCCR4A = _BV(COM4A1) | _BV(COM4A0) | _BV(WGM40); // inverting mode, fast pwm with top as 0xFF
  TCCR4B = _BV(CS41);   // prescaler set to clk/8

  DDRL |= (1 << 3); // PORTL3 pin as output for LED2
  TCCR5A = _BV(COM5A1) | _BV(COM5A0) | _BV(WGM50); // inverting mode, fast pwm with top as 0xFF
  TCCR5B = _BV(CS51);   // prescaler set to clk/8
}

//Set motor speed and direction with count registers using information obtained by ADC
void changeDutyCycle(int dutycycle) {
  OCR1A = dutycycle;  // set PWM duty cycle for LED 1
  OCR3A = dutycycle;  // set PWM duty cycle for motor driver IN1
  OCR4A = dutycycle;  // set PWM duty cycle for motor driver IN2
  OCR5A = dutycycle;  // set PWM duty cycle for LED 2

}

int main()
{

  initPWM();// initialize PWM
  sei();// initialize Interrupts

  while (1)
  {
    if (flag == 1) {
      changeDutyCycle(128); // read ADC value is 1024/4 = 256 and set motor speed accordingly
    } else {
      changeDutyCycle(0);   // Stop PWM signals    
    }
  }


  return 0;
}
// Establish ISR using external interput on PORTD
ISR (INT0_vect) {
  flag =! flag; // flag with invert command
}
 

Hi,

Code: I don't see pin change interrupt setup.

Nor do we see the schematic. Did you add a debouncing circuit. Your SW is rather sensitive to contact bouncing.

Klaus
 

Hi,

Code: I don't see pin change interrupt setup.

Nor do we see the schematic. Did you add a debouncing circuit. Your SW is rather sensitive to contact bouncing.

Klaus

void initSwitchPD0(); // This is include in main

Code:
void initSwitchPD0()
{
  DDRD &= ~(1 << DDD2);     // Clear the PD0 pin
  // PD0 (INT0 pin) is now an input

  PORTD |= (1 << PORTD0);    // turn On the Pull-up
  // PD0 is now an input with pull-up enabled
  EICRA |= (1 << ISC01);    // set INT0 to trigger on ANY logic change
  EIMSK |= (1 << INT0);     // Turns on INT0

}
 

There is no mention on your code about any button:

I attached a button on interrupt (...) I want to stop LEDs and motor when press button

Code:
// Establish ISR using external interput on PORTD
ISR (INT0_vect) {
  flag =! flag; // flag with invert command
}
Take a time to review your questions.
 

Also you should declare any variable that is modified in a ISR as 'volatile' so that the compiler knows that it could be updated 'somewhere else' and always reads form the variable and not some internally cached copy.
I suggest that you show us all of your code that includes al of the changes you have made since the original post - it can be very confusing when you show snippets of code that don't relate back to the original.
Susan
 

In attachment there is complete code, I want to read ADC value and change PWM accordingly and a switch is attached for stop motor and 2 LED`s.
LED`s are connected to 2 separate PWM channels and motor connected other 2 PWM channels.
 

Attachments

  • src.rar
    116.5 KB · Views: 88

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…