AtmelStudio и ATTiny13A ошибка <'sleep_enable' undeclared>

nikollor
Offline
Зарегистрирован: 08.11.2019

С AVR и в частности Attiny13А имел дело всего один раз - год назад в режиме аврала приблизительно освоил, написал прошивку и выбросил из головы. Но теперь потребовалось слегка поправить код, а исходник почил в недрах умершего ssd. По скриншотам восстановил код, отправляю в билд, а он мне с улыбкой пишет

Error 'sleep_enable' undeclared (first use in this function)

При этом <avr/sleep.h> прикреплен, но смущает, что в нем дефайны только для ATMega, он что, хочет мне сказать, что за год attiny разучился спать?

AtmelStudio свежескачанный 7.0.2389

ошибки:

------ Build started: Project: saber_c, Configuration: Debug AVR ------
Build started.
Project "saber_c.cproj" (default targets):
Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\Studio\7.0\Vs\Compiler.targets" from project "c:\users\nikollor\Documents\Atmel Studio\7.0\saber_c\saber_c\saber_c.cproj" (target "Build" depends on it):
	Task "RunCompilerTask"
		Shell Utils Path C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils
		C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils\make.exe all --jobs 2 --output-sync 
		.././main.c: In function 'main':
c:\users\nikollor\Documents\Atmel Studio\7.0\saber_c\saber_c\main.c(78,4): error: 'sleep_enable' undeclared (first use in this function)
		    sleep_enable;
		    ^
c:\users\nikollor\Documents\Atmel Studio\7.0\saber_c\saber_c\main.c(78,4): info: each undeclared identifier is reported only once for each function it appears in
c:\users\nikollor\Documents\Atmel Studio\7.0\saber_c\saber_c\main.c(79,4): error: 'sleep_cpu' undeclared (first use in this function)
		    sleep_cpu;
		    ^
c:\users\nikollor\Documents\Atmel Studio\7.0\saber_c\saber_c\main.c(80,4): error: 'sleep_disable' undeclared (first use in this function)
		    sleep_disable;
		    ^
		make: *** [main.o] Error 1
		Building file: .././main.c
		Invoking: AVR/GNU C Compiler : 5.4.0
		"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-gcc.exe"  -x c -funsigned-char -funsigned-bitfields -DDEBUG  -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATtiny_DFP\1.3.229\include"  -O1 -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2 -Wall -mmcu=attiny13a -B "C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATtiny_DFP\1.3.229\gcc\dev\attiny13a" -c -std=gnu99 -MD -MP -MF "main.d" -MT"main.d" -MT"main.o"   -o "main.o" ".././main.c" 
c:\users\nikollor\Documents\Atmel Studio\7.0\saber_c\saber_c\Debug\Makefile(76,1): error: recipe for target 'main.o' failed
	Done executing task "RunCompilerTask" -- FAILED.
Done building target "CoreBuild" in project "saber_c.cproj" -- FAILED.
Done building project "saber_c.cproj" -- FAILED.

Build FAILED.
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========

 

Код:

#define F_CPU 1000000UL

#include <avr/io.h>
#include <avr/sleep.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define RED			(PORTB |= (1 << PB0))
#define RED_OFF		(PORTB &= ~(1 << PB0))
#define GREEN		(PORTB |= (1 << PB2))
#define GREEN_OFF	(PORTB &= ~(1 << PB2))
#define BLUE		(PORTB |= (1 << PB4))
#define BLUE_OFF	(PORTB &= ~(1 << PB4))
#define WHITE		(PORTB |= (1 << PB3))
#define WHITE_OFF	(PORTB &= ~(1 << PB3))
#define ALL			(PORTB |= ((1 << PB0)|(1 << PB2)|(1 << PB3)|(1 << PB4)))
#define ALL_OFF		(PORTB &= ~((1 << PB0)|(1 << PB2)|(1 << PB3)|(1 << PB4)))


typedef unsigned char byte;
unsigned int trig, count;
unsigned short pushtime;

ISR (PCINT0_vect) {
	while ((PINB & (1 << PB1)) == 0)
	{
	}
}



int main(void)
{
	DDRB	= 0b00011101;
	PORTB	= 0b00000010;
	
	count = 0;
	
    /* Replace with your application code */
    while (1) 
    {
		switch (count) {
			case 0 : { ALL_OFF;					break;	}
			case 1 : { ALL_OFF;	RED;			break;	}
			case 2 : { ALL_OFF;	GREEN;			break;	}
			case 3 : { ALL_OFF;	BLUE;			break;	}
			case 4 : { ALL_OFF;	WHITE;			break;	}
			case 5 : { ALL_OFF;	ALL; count = 0;	break;	}
			default: { count = 0;						}
			}
		
		pushtime = 0;
		
		while ((PINB & (1 << PB1)) == 0)
		{
			pushtime++;
			_delay_ms(10);
		}
		
		if ((pushtime > 10) & (pushtime <= 150) )
		{
			count++;
		}
		
		if (pushtime > 150)
		{
			GIMSK |= (1 << PCIE);
			PCMSK |= (1 << PB1);
			ALL_OFF;
			sei();
			set_sleep_mode (SLEEP_MODE_PWR_DOWN);
			sleep_enable;
			sleep_cpu;
			sleep_disable;
			cli();			
		}
		
		_delay_ms(100);
		
    }
}

 

 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nikollor пишет:
он что, хочет мне сказать, что за год attiny разучился спать?

Нет, он хочет Вам сказать, что за год Вы разучились программировать. Надо не sleep_enable, а sleep_enable().

И, кстати, раз уж Вы включили sleep.h, кто или что мешает просто в него посмотреть?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А что там в мэйкфайле на 76 строке ? Имею ввиду лог - 24ю строку

Евгений раньше ответил, но все равно интересно...

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

Строки 72,73,74

sleep_enable();
sleep_cpu();
sleep_disable();

Упс. Опередили.

Цитата:

Имею ввиду лог - 24ю строку

А что там должно быть?

UPD. Оптимизатор переменную pushtime (а точнее строки 56,57) выбрасывает нафиг, а без оптимизации код не влезает.