выложил
- Вложения
-
- AVRGCC7.rar
- (45.2 КБ) 221 скачивание
Код: Выделить всё
LONG COUT: 0001
SHORT COUT: 000Код: Выделить всё
/*
* AVRGCC7.c
*
* Created: 08.03.2021 22:03:58
* Author: shevc
*/
#define F_CPU 8000000UL
// PWM Mode
#define PHASE 0x11 // PWM, Phase Correct, 15kHz
#define FAST 0x19 // PWM, Fast 31kHz
#define PWM_MODE FAST
#define PWM_PIN PB2
#define PWM OCR1B
// нопка
#define SWITCH_PIN PD2
// UART
#define BAUD 9600
#define MYUBRR F_CPU / 16 / BAUD - 1
// DELAY
#define OWN_DELAY
#ifdef OWN_DELAY
#include <util/delay_basic.h>
static void _delay_ms(uint16_t n)
{
while(n-- > 0)
_delay_loop_2(950);
}
#else
#include <util/delay.h>
#endif
#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <avr/power.h>
volatile uint8_t conterTimer = 0;
volatile uint8_t securityTimer = 0;
volatile uint8_t long_counter = 0;
volatile uint8_t short_counter = 0;
volatile uint8_t press_long = 0;
volatile uint8_t press_short = 0;
int button_pressed () {
static uint8_t buffer = 0x00;
buffer = (buffer << 1) | ((PIND & (1 << SWITCH_PIN)) == 0);
return (buffer & 0b00000011);
}
void uart_init (void) {
UBRRH = MYUBRR >> 8;
UBRRL = MYUBRR;
UCSRA = (1 << URSEL);
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
}
unsigned char uart_getc (void) {
//ждем приема байта
while((UCSRA & (1 << RXC)) == 0);
//считываем принІтый байт
return UDR;
}
void send_putc (char c) {
//ждем окончаниІ передачи предыдущего байта
while((UCSRA & ( 1 << UDRE)) == 0);
UDR = c;
}
void send_str (char *str) {
unsigned char c;
while((c = *str++) != 0) {
send_putc(c);
}
}
void send_int (unsigned int c) { // Ётправка числа от 0000 до 9999
unsigned char temp;
c = c%10000;
temp = c/100;
send_putc(temp/10+'0');
send_putc(temp%10+'0');
temp = c%100;
send_putc(temp/10+'0');
send_putc(temp%10+'0');
}
void pwm_on () {
// пределитель на 1
TCCR1A = (1 << COM1B1) | (1 << WGM11);
TCCR1B = (1 << CS10) | PWM_MODE;
ICR1 = 256; // frequency = 8000000/256 = 31.129 kHz,
TCNT1 = 0x00;
//OCR1A = 0x00;
PWM = 255;
}
void pwm_off () {
TCCR1A = 0x00;
}
void sleep_switch_press () {
conterTimer = 0;
long_counter = 0;
short_counter = 0;
// защелка
while (button_pressed ()) {
_delay_ms(32);
}
// включаем внешнее прерывание
MCUCR &= ~ (1 << ISC01 | 1 << ISC00);
GICR = (1 << INT0);
GIFR = (1 << 6);
// включаем сп¤щий режим
sleep_mode();
// отключаем сп¤щий режим
sleep_disable();
// пределитель на 1024, (1024*256)/8000000 = 0.032768 мкс
// 1000ms/32,768 = 30тиков = за 1 сек
TCCR0 = (1 << CS02) | (1 << CS00);
TIMSK = (1 << TOIE0); // timer0 enable
TCNT0 = 256;
pwm_on ();
// отключаем внешнее прерывание
GICR &= ~(1 << INT0);
GIFR &= ~(1 << 6);
}
ISR (INT0_vect) {}
ISR (TIMER0_OVF_vect) {
if (button_pressed ()) {
if (conterTimer < 255) conterTimer++;
if (conterTimer == 40) {
long_counter++;
if (press_long == 0) {
press_long = 1;
}
conterTimer = 0;
}
} else {
if ((conterTimer > 0) && (conterTimer < 22)) {
short_counter++;
if (press_short == 0) {
press_short = 1;
}
conterTimer = 0;
press_long = 0;
}
}
if (short_counter == 5) short_counter = 0;
if (long_counter == 3) long_counter = 0;
TCNT0 = 256;
}
int main (void) {
// UART
uart_init();
// пины - на выход
DDRB = (1 << PWM_PIN) | (1 << PB5) | (1 << PB7);
// пины - на вход
DDRD = (0 << PD2);
// включаем подт¤гивающий (Pull-UP)
PORTD = (1 << SWITCH_PIN);
// тут спим перед вкл, также -
// спим после подачи напруги на ћ
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sei();
// сп¤щий режим
sleep_switch_press();
while (1) {
switch (long_counter) {
case 0:
break;
case 1:
// индикатор активности вкл
PORTB = (1 << PB5);
send_putc(13);
send_str("LONG COUT: ");
send_int(long_counter);
send_putc(13);
send_str("SHORT COUT: ");
send_int(short_counter);
send_putc(13);
break;
case 2:
// индикатор активности выкл
PORTB &= ~ (1 << PB5);
pwm_off();
// сп¤щий режим
sleep_switch_press();
long_counter = 0;
conterTimer = 0;
break;
}
}
return 0;
}Вам тут уже намекали в другом месте на этот явный косяк. Ткну прямо - не помещается 256 в 8 битный регистр, потому что счет начинается с 0, а не с 1!TCNT0 = 256;
Код: Выделить всё
warning: unsigned conversion from 'int' to 'uint8_t' {aka 'volatile unsigned char'} changes value from '256' to '0' [-Woverflow]А что не так с этим барахлом? Своего барахла то нет.beoro писал(а):китайского фальшивого барахла