佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

楼主: pic

【练习】PIC 编程 - LED闪灯 (功力挑战)

  [复制链接]
 楼主| 发表于 22-5-2009 09:03 AM | 显示全部楼层
原帖由 Yapl 于 20-5-2009 07:52 PM 发表
问个问题,如果我在picc 里
TRISA=0xFF;  //port a = input
PORTA=0x00;  
我的porta是接去+5v ,和resistor串联(logic high,从头到尾都接着)
这时PORTA=0x00还是0xFF呢?
就算我打了PORTA=0x00;他还是会变成0xFF吗?

当你读Port A, 你是得到0xFF。
但是当你把TRISA=0x00; 时, PortA 有可能变成0x00。
回复

使用道具 举报


ADVERTISEMENT

发表于 24-5-2009 07:00 PM | 显示全部楼层
int savertc;
int currentrtc;

currentrtc=(rtc&0x0FF)-((savertc>>8)&0x0FF);

为什么要&0x0FF? AND了不是一样吗?
看书里面的
回复

使用道具 举报

发表于 25-5-2009 08:40 AM | 显示全部楼层
原帖由 Yapl 于 24-5-2009 07:00 PM 发表
int savertc;
int currentrtc;

currentrtc=(rtc&0x0FF)-((savertc>>8)&0x0FF);

为什么要&0x0FF? AND了不是一样吗?
看书里面的


AND 了未必一样。 这个&只是masking.拿最后八个bits.
比如说savertc = 0x1234
savertc&0xFF = 0x34.
明白吗?
回复

使用道具 举报

发表于 25-5-2009 08:42 AM | 显示全部楼层
原帖由 Yapl 于 20-5-2009 07:52 PM 发表
问个问题,如果我在picc 里
TRISA=0xFF;  //port a = input
PORTA=0x00;  

我的porta是接去+5v ,和resistor串联(logic high,从头到尾都接着)
这时PORTA=0x00还是0xFF呢?
就算我打了PORTA=0x00;他还是会变成0x ...


writtin to output port的时候, 最好是用latch,不用port.
回复

使用道具 举报

发表于 25-5-2009 08:54 AM | 显示全部楼层
原帖由 fritlizt 于 25-5-2009 08:40 AM 发表


AND 了未必一样。 这个&只是masking.拿最后八个bits.
比如说savertc = 0x1234
savertc&0xFF = 0x34.
明白吗?

嗯明白了,但是它直接declare成 8bits 的unsigned char不就好了吗?为什么还要declare成16bits 的int =.="
回复

使用道具 举报

发表于 25-5-2009 08:59 AM | 显示全部楼层
原帖由 pic 于 22-5-2009 09:03 AM 发表

当你读Port A, 你是得到0xFF。
但是当你把TRISA=0x00; 时, PortA 有可能变成0x00。

嗯会变0x00吧,我研究着I2C,看到有programming code是这样control clock的
void setstart(void)                                                                //TCLK & SDATA assumed to be high
{
        sdata=0;                                                                        //take data low while clk is high               
        tclk=0;                                                                                //take clk low while data is low
}
原帖由 fritlizt 于 25-5-2009 08:42 AM 发表


writtin to output port的时候, 最好是用latch,不用port.

这边我不太明白哈哈,我还在学习中
回复

使用道具 举报

Follow Us
发表于 25-5-2009 09:42 AM | 显示全部楼层
原帖由 Yapl 于 25-5-2009 08:54 AM 发表

嗯明白了,但是它直接declare成 8bits 的unsigned char不就好了吗?为什么还要declare成16bits 的int =.="


某些情况下你会需要到。
可能你的rtc return你hh:mm:ss。
不过你只需要compare ss, 但是其他情况你还是需要hh:mm,你就需要&,让yy:mm变成0.
明白吗?
回复

使用道具 举报

发表于 25-5-2009 09:50 AM | 显示全部楼层
原帖由 Yapl 于 25-5-2009 08:59 AM 发表

嗯会变0x00吧,我研究着I2C,看到有programming code是这样control clock的


这边我不太明白哈哈,我还在学习中


你用什么mcu还有什么compiler?
为什么不用hardware i2c?
而且有些compiler有soft i2c library,也不用自己写。 除非你想了解i2c.

关于latch,  port,你可以在网上找到一些资料。
之前给错一些info. paiseh.write to port是没问题。/ 因为没牵涉到read modify write operation.
是write to bit of port就建议用latch.

[ 本帖最后由 fritlizt 于 25-5-2009 09:58 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 25-5-2009 07:08 PM | 显示全部楼层
但是 base line 和 mid range 的 PIC 都不能 write to latch 的。
回复

使用道具 举报

发表于 25-5-2009 07:31 PM | 显示全部楼层
原帖由 waiweng83 于 25-5-2009 07:08 PM 发表
但是 base line 和 mid range 的 PIC 都不能 write to latch 的。


所以是时候换去pic18鸟。
回复

使用道具 举报

发表于 25-5-2009 11:23 PM | 显示全部楼层
原帖由 fritlizt 于 25-5-2009 09:42 AM 发表


某些情况下你会需要到。
可能你的rtc return你hh:mm:ss。
不过你只需要compare ss, 但是其他情况你还是需要hh:mm,你就需要&,让yy:mm变成0.
明白吗?

哦,明白了
原帖由 fritlizt 于 25-5-2009 09:50 AM 发表


你用什么mcu还有什么compiler?
为什么不用hardware i2c?
而且有些compiler有soft i2c library,也不用自己写。 除非你想了解i2c.

关于latch,  port,你可以在网上找到一些资料。
之前给错一些info. paiseh ...

我用16F84A哈哈paiseh
我要换去16F917来做了,想用hardware的i2c来写,software的timing因该很重要吧,不过我去cytron website download他的RTC project code来看,他们是用software i2c的,不过他们好像都没有setting那些i2c的clock frequency的,就是   
tclk=1;                                        //clk up
tclk=0;                                        //clk down
这样就好了,而且还是用20mhz的crystal,那不是很快?
我用这Hi-tech PICC with MP IDE,hi tech的几乎没有build in software library 的 =.=
那些LCD 的initialize 全部要自己打 =.=
回复

使用道具 举报

发表于 12-7-2009 05:44 PM | 显示全部楼层
原帖由 热爱音乐 于 31-3-2009 06:22 PM 发表
Q2:
#include
#include
#use delay(clock=4000000)
#fuses NOWDT,HS,NOPUT, NOPROTECT,NOLVP

struct pin_map
{
   int unused1:8;
   boolean LED1;
   boolean LED2;
   boolean LED3;
   int unuse ...


#fuses NOWDT,HS,NOPUT, NOPROTECT,NOLVP

这部分我还是不明白,虽然已经看过它的datasheet。请帮帮忙下。。。。
回复

使用道具 举报

 楼主| 发表于 18-7-2009 11:26 AM | 显示全部楼层
原帖由 wilson16 于 12-7-2009 05:44 PM 发表


#fuses NOWDT,HS,NOPUT, NOPROTECT,NOLVP

这部分我还是不明白,虽然已经看过它的datasheet。请帮帮忙下。。。。   
原帖由 wilson16 于 12-7-2009 05:44 PM 发表


#fuses NOWDT,HS,NOPUT, NOPROTECT,NOLVP

这部分我还是不明白,虽然已经看过它的datasheet。请帮帮忙下。。。。   


NOWDT, -  No Watch Dog, 关闭看门狗。
HS- high Speed, >4Mhz 的Crystal
NOPUT - No Power Up Reset
NOPROTECT, - No Protect
NOLVP - No Low Voltage Programming

那一个你不明白?
回复

使用道具 举报

发表于 18-7-2009 08:37 PM | 显示全部楼层
原帖由 pic 于 18-7-2009 11:26 AM 发表



NOWDT, -  No Watch Dog, 关闭看门狗。
HS- high Speed, >4Mhz 的Crystal
NOPUT - No Power Up Reset
NOPROTECT, - No Protect
NOLVP - No Low Voltage Programming

那一个你不明白?


原来这些都要写的。如果不写会怎样?
回复

使用道具 举报

发表于 18-7-2009 11:46 PM | 显示全部楼层
原帖由 wilson16 于 18-7-2009 08:37 PM 发表


原来这些都要写的。如果不写会怎样?


pic可能不能按照你的需求操作。
最好是把configuration bit set好。 除非那个configuration bit 没用到。
回复

使用道具 举报

发表于 19-7-2009 01:20 AM | 显示全部楼层
原帖由 wilson16 于 18-7-2009 08:37 PM 发表


原来这些都要写的。如果不写会怎样?


如果你不写,那 compiler 就会用 default 的。
回复

使用道具 举报


ADVERTISEMENT

发表于 27-3-2010 03:26 AM | 显示全部楼层
对不起,吃了一年才教上来, 希望搂主验收
Q2:

#include <16f648a.h>
#include <stdio.h>
#use delay(clock=4000000)
#fuses NOWDT, INTRC, NOPUT, NOPROTECT, NOLVP
#use fast_io(B)
#use fast_io(A)

struct   pin_map
{
   int unused:8;
   boolean   rb0;
   boolean   rb1;
   boolean   rb2;

};
struct   pin_map  port;
struct   pin_map  direction;
#byte port=0x05
#byte direction=0x85


int16 n,n1,n2;
#INT_RTCC
void timer0_isr()
{
   n++;
   n1++;
   n2++;

   if(n==5000)
   {
      port.rb0=!port.rb0;
      n=0;
   }

   if(n1==10000)
   {
      port.rb1=!port.rb1;
      n1=0;
   }

   if(n2==500)
   {
      port.rb2=!port.rb2;
      n2=0;

   }
   else
   {
      ;
   }

}

main()
{
   enable_interrupts ( GLOBAL );
   enable_interrupts (INT_RTCC);

   setup_timer_0 ( RTCC_DIV_1 | RTCC_INTERNAL );
   set_timer0 ( 155 );

   direction.rb0=0;
   direction.rb1=0;
   direction.rb2=0;


      port.rb0=1;
      port.rb1=1;
      port.rb2=1;



   while(1)
   {

   }


}

评分

参与人数 1积分 +50 收起 理由
pic + 50 Q2 挑战成功。

查看全部评分

回复

使用道具 举报

发表于 27-3-2010 03:27 AM | 显示全部楼层
Q3:

#include <16f648a.h>
#include <stdio.h>
#use delay(clock=4000000)
#fuses NOWDT, INTRC, NOPUT, NOPROTECT, NOLVP
#use fast_io(B)
#use fast_io(A)

struct   pin_map
{
   int unused:8;
   boolean   rb0;
   boolean   rb1;
   boolean   rb2;

};
struct   pin_map  port;
struct   pin_map  direction;
#byte port=0x05
#byte direction=0x85

int16 n,n1,n2,n00,n11,n22;

#INT_RTCC
void timer0_isr()
{
   n++;
   n00++;
   n1++;
   n11++;
   n2++;
   n22++;

   if(n==500)
   {
      port.rb0=0;
      n00=0;
   }
      if(n00==9500)
   {
      port.rb0=1;
      n=0;
   }

   if(n1==3000)
   {
      port.rb1=0;
      n11=0;
   }

      if(n11==17000)
   {
      port.rb1=1;
      n1=0;
   }

   if(n2==100)
   {
      port.rb2=!port.rb2;
      n22=0;

   }
      if(n22==900)
   {
      port.rb2=!port.rb2;
      n2=0;

   }
   else
   {
      ;
   }

}

main()
{
   enable_interrupts ( GLOBAL );
   enable_interrupts (INT_RTCC);

   setup_timer_0 ( RTCC_DIV_1 | RTCC_INTERNAL );
   set_timer0 ( 155 );

   direction.rb0=0;
   direction.rb1=0;
   direction.rb2=0;


      port.rb0=1;
      port.rb1=1;
      port.rb2=1;



   while(1)
   {


   }


}

评分

参与人数 1积分 +80 收起 理由
pic + 80 Q3 的挑战成功。

查看全部评分

回复

使用道具 举报

发表于 27-3-2010 03:28 AM | 显示全部楼层
对不起,忘了改
#include <16f648a.h> -〉#include <16f628a.h>
回复

使用道具 举报

 楼主| 发表于 31-3-2010 09:32 AM | 显示全部楼层
对不起,忘了改
#include  -〉#include
热爱音乐 发表于 27-3-2010 03:28 AM



很好, 早上模拟了, 只是看波形Ok, 我懒惰测量, 算你通过了。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 29-3-2024 01:26 PM , Processed in 0.080975 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表