gpt4 book ai didi

c - PIC12 TRIS 寄存器未设置

转载 作者:太空宇宙 更新时间:2023-11-04 01:05:18 25 4
gpt4 key购买 nike

我正在尝试对 PIC12C508A 进行编程以实现简单的 LED 学习电路。我已经阅读了一些示例,Microchip 数据表、pic12c508a.h 和 pic12c508a.inc。我尝试使用 C 程序和 ASM 程序设置 TRIS 寄存器,但没有成功。使用 MPLAB X、XC8 编译器和内置模拟器来检查 SFR 寄存器,我可以看到即使 WREG 保持正确的值,TRIS 也没有更新。如果有人对此有经验,请检查我的代码,看看我是否做错了什么。

#include <xc.h>

// -- CONFIG
#pragma config MCLRE = ON // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config WDT = OFF // Turn Watchdog Timer Off.
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#pragma config OSC = IntRC // Internal RC Oscillator

// -- Internal Frequency
#define _XTAL_FREQ 400000

int main()
{
TRIS = 0b111010; // 0x3A
//---0-0 Set GP0 and GP2 as outputs

GPIO = 0b000100; // 0x04
//---1-0 Set GP2 as HIGH and GP0 as LOW

for(int countdown = 10; countdown > 0; --countdown) {
__delay_ms(60000); // Delay 1 minute.
}

GPIO = 0b000001; // 0x01
//---0-1 Set GP2 as LOW and GP0 as HIGH

while(1)
NOP();
}

我还尝试了一个与基线 PIC 模型的 Gooligum 教程几乎相同的程序集。

  list  p=12c508a
#include <p12c508a.inc>

__CONFIG _MCLRE_ON & _CP_OFF & _WDT_OFF & _IntRC_OSC

RCCAL CODE 0x0FF ; Processor Reset Vector
res 1 ; Hold internal RC cal value, as a movlw k

RESET CODE 0x000 ; RESET VECTOR
movwf OSCCAL ; Factory Calibration

start
movlw b'111010' ; Configure GP0/GP2 as outputs
tris GPIO ;
movlw b'000100' ; Set GP2 HIGH - GREEN LED
movwf GPIO

goto $ ; loop forever

END

这一切看起来非常简单,但是当我使用断点并检查模拟器中的 SFR 寄存器时,我可以看到 GPIO 和 TRIS 寄存器从未改变,即使 WREG 将保持正确的值。我检查了 XC8 编译器生成的 ASM 输出,它与我在设置寄存器时编写的 ASM 几乎相同。

我也尝试过使用十六进制值和直接整数值,结果是一样的。

最佳答案

答案是程序顶部定义的晶振频率远远超出实际值

#define _XTAL_FREQ 400000 //that's 400KHz INTOSC, impossible

应该是

#define _XTAL_FREQ 4000000 //That's 4MHz INTOSC

@Justin 在其原始帖子下方的评论中指出了这一点。

关于c - PIC12 TRIS 寄存器未设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24687890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com