The device has the following peripherals: Optorelay, clock button, LED.
Let’s write a program in the Atmel Studio 7.0 environment for the Atmega 8a microcontroller where
the device has three operating modes:
Display of the selected mode
- The selected mode is constantly displayed by blinking LED
mode 1 LED turns on for 0.5s every 2s
mode 2 the LED turns on 2 times for 0.5 s every 2 s (pause between
inclusions 1c)
mode 3 LED turns on 3 times 0.5s every 2s (pause between
inclusions 1c) - Switching modes
The operating mode is selected by pressing the “Ticked” button
button” number of presses will correspond to the selected logic
Press scanning time 10s from the moment of the first press - Operation modes
The device must switch relay “OP1” with different time
at intervals depending on the selected operating mode
mode 1 – 1 activation per second
mode 2 – 3 switching on per second
mode 2 – always on
It is necessary to write software in the Atmel Studio 7.0 environment:
The “Remote” LED should indicate the currently selected operating logic on
device
The device must switch relay “OP1” at different time intervals
specified in two different operating logics
Ports:
Optorelay “Op1” – PC1
LED “Remote” – PC4
Tact button “Remote_Button” – PC5
Please help me im try to do it, but dont know how to use Proteus 8 for test
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#define LED_PORT PORTC
#define LED_DDR DDRC
#define LED_PIN PC4
#define BUTTON_PIN PINC
#define BUTTON_DDR DDRC
#define BUTTON_PORT PORTC
#define BUTTON PC5
#define RELAY_PORT PORTC
#define RELAY_DDR DDRC
#define RELAY_PIN PC1
#define MODE1 1
#define MODE2 2
#define MODE3 3
volatile uint8_t mode = MODE1;
void initIO() {
BUTTON_DDR &= ~(1 << BUTTON);
BUTTON_PORT |= (1 << BUTTON);
LED_DDR |= (1 << LED_PIN);
RELAY_DDR |= (1 << RELAY_PIN);
}
void toggleRelay(uint8_t mode) {
switch (mode) {
case MODE1:
RELAY_PORT ^= (1 << RELAY_PIN);
_delay_ms(500);
break;
case MODE2:
for (uint8_t i = 0; i < 3; i++) {
RELAY_PORT ^= (1 << RELAY_PIN);
_delay_ms(166);
RELAY_PORT ^= (1 << RELAY_PIN);
_delay_ms(333);
}
break;
case MODE3:
for (uint8_t i = 0; i < 3; i++) {
RELAY_PORT ^= (1 << RELAY_PIN);
_delay_ms(250);
RELAY_PORT ^= (1 << RELAY_PIN);
_delay_ms(750);
}
break;
default:
break;
}
}
void changeMode() {
uint8_t count = 0;
uint8_t button_state = (BUTTON_PIN & (1 << BUTTON));
while (count < 10) {
_delay_ms(1000);
if ((BUTTON_PIN & (1 << BUTTON)) != button_state) {
button_state = (BUTTON_PIN & (1 << BUTTON));
count++;
} else {
count = 0;
}
}
mode = (mode % 3) + 1;
}
int main() {
initIO();
while (1) {
toggleRelay(mode);
switch (mode) {
case MODE1:
LED_PORT |= (1 << LED_PIN);
_delay_ms(500);
LED_PORT &= ~(1 << LED_PIN);
_delay_ms(1500);
break;
case MODE2:
LED_PORT |= (1 << LED_PIN);
_delay_ms(500);
LED_PORT &= ~(1 << LED_PIN);
_delay_ms(500);
LED_PORT |= (1 << LED_PIN);
_delay_ms(500);
LED_PORT &= ~(1 << LED_PIN);
_delay_ms(1500);
break;
case MODE3:
LED_PORT |= (1 << LED_PIN);
_delay_ms(500);
LED_PORT &= ~(1 << LED_PIN);
_delay_ms(500);
LED_PORT |= (1 << LED_PIN);
_delay_ms(500);
LED_PORT &= ~(1 << LED_PIN);
_delay_ms(500);
LED_PORT |= (1 << LED_PIN);
_delay_ms(500);
LED_PORT &= ~(1 << LED_PIN);
_delay_ms(1500);
break;
default:
break;
}
changeMode();
}
return 0;
}
New contributor
firefoxx is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.