我和我的朋友正在開發一個涉及編程attiny48的項目。 我們正在編碼Atmel Studio 6.2。AVR C函數從Main函數工作,但不從其他函數
爲了讓我們在C語言和嵌入式編程方面有所收穫,我們試圖製作一個LED閃光燈。下面是代碼,我們到目前爲止有:
User.h
ifndef USER_H_
#define USER_H_
#include <avr/io.h>
// # Defines
#define F_CPU 1000000UL
// Function Prototypes
extern void Delay_Ms(uint16_t ms);
extern void Init(void);
extern uint8_t Check_Infrared(void);
extern void Toggle_PC0 (void);
#endif /* USER_H_ */
user.c的
#include <avr/io.h>
#include <delay.h>
#include "User.h"
void Delay_Ms(uint16_t ms)
{
uint32_t Delay_Cycles;
for (Delay_Cycles = (ms * (F_CPU/10000)) ; Delay_Cycles > 0 ; Delay_Cycles--);
}
void Init(void)
{
// Define Output Pins
DDRC = DDRC |(1<<DDC0); // PC0 is digital output
while(1)
{
PINC = (1<<PINC0); // Toggle PC0, This is the LED we have connected
//_delay_ms(1000); This is the builtin Delay which works here
Delay_Ms(1000); //we have established that this fails
}
}
MAIN.C
#include <avr/io.h>
#include "User.h"
int main(void)
{
Init();
while(1)
{
PINC = (1<<PINC0); // Toggle PC0
Delay_Ms(1000); //if we let it get here, it works!
}
}
小號o發生了什麼事情是:main()調用函數Init(),在那裏我們複製了應該使LED閃爍的while循環。在這裏,它不起作用。 如果我們註釋掉Init()函數中的while(1)循環,則main()中的while(1)循環會運行並且LED會閃爍。
我們玩過代碼,並確定Delay_Ms(ms)在從main()調用時起作用,但在從Init()調用時不起作用。我們懷疑這與定義,defs,include或頭文件的順序有關,但作爲缺乏經驗的C程序員,我們有點失落。
我們可以使用內置的延遲功能,但這個問題可能會在其他地方出現,在未來!
任何提示讚賞!
當控制傳遞給init()時,它會運行自己的while循環,因爲它將它放入一個無止境的循環中。嘗試從那裏刪除。把它的內容放在外面。 – SanVed