• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
  • slider image 488
  • slider image 491
:::

論壇索引


Board index » All Posts (sam_fang)




Re: 這次是軟體UART問題請教
#21
初級會員
初級會員


參照:

Ryang 寫道:
參照:

sam_fang 寫道:
Ryang 前輩你好
W401的文件我有找過。
第五章是在教硬體方式的串列傳輸
第六章是教I2C
我都找不到軟體UART的範例。

另外指令USART是否是指硬體?
UART指令是否就是指軟體?


PS:沒學過C語言,也不太會寫單晶片。所以得有範例參考才會修改編寫 ><


第六章的練習 6-1 就有 UART 的程式。I2C 為主,而 UART 為輔功能為自 RS-232 收近資料。


Ryang版主,您好。
看了第六章的6-1範例,那個是用硬體函數做控制嗎?

因為我看了,"hlpC18Lib"的範例,如下所示:
----------------------------------------------------------------
#include <p18C452.h>
#include <sw_uart.h>
void main( void )
{
char data;
// configure software UART
OpenUART();
while( 1 )
{
data = ReadUART(); //read a byte
WriteUART( data ); //bounce it back
}
}
---------------------------------------------------------------------
但我在Compile時會發生,錯誤訊息如下所示:
Error - could not find definition of symbol 'DelayRXHalfBitUART' in file 'openuart.O'.
--------------------------------------------------------------------
找不到能使用軟體函數的方法,
因為打算一組用硬體函數,另一組用軟體函數。
做雙uart控制 =.=..

發表於: 2008/10/23 14:30
頂部


當Timer0和Rx寫在一起卻不動作(思想陷在死迴圈)
#22
初級會員
初級會員


我已經陷入不知道該怎麼改的地步了,嘗試過把高低中斷互換也沒用><~ 懇請高手幫忙協助,感激萬分。

程式主要的問題在於,當有資料經由RX送進來時,但RX的中斷卻無發生。不要說顯示第2Byte的值,我光連0xAA都顯示不出。(應該是RX中斷都沒發生)

程式構想如下:
程式會判別ADC值,一開始
1.當ADC>0x33,PORTCbits.RC2燈亮、PORTCbits.RC1燈滅(並送出USART:0x31)。
2.當持續5秒後,ADC>0x33。PORTCbits.RC2燈滅、PORTCbits.RC1燈亮(並送出USART:0x32)。
3.當ADC<0x19,PORTCbits.RC2燈亮、PORTCbits.RC1燈亮(並送出USART:0x33)。
4.當持續10秒後,ADC<0x19。PORTCbits.RC2燈滅、PORTCbits.RC1燈滅(並送出USART:0x34)。

但只要接受到RX中斷,PORTB的燈就會按照接收的第二BYTE顯示。
----------------------------------------------

#include <p18f2321.h>
#include <delays.h>
#include <usart.h>
#include <adc.h>
#include <timers.h>


#pragma config OSC=HS, BOR=OFF, BORV=2, PWRT=ON, WDT=OFF, LVP=OFF

#define TMR0_VAL 65536-9840


struct Flag
{
unsigned START:1;
}FLAGbits;

unsigned char rxbuf[1];
unsigned char rxbuf_index;
unsigned char ADC_TEMP;
unsigned int time_cnt;

void Init_TMR0(void);
void timer0_isr (void);
void Rx_isr(void);
void Init_USART(void);
void Init_MCU(void);
void ADC_CKLEVEL(void);
void shutter_dip(void);


#pragma code low_vector=0x18
void low_interrupt(void)
{
_asm GOTO Rx_isr _endasm
}
#pragma code

#pragma interrupt Rx_isr

void Rx_isr (void)
{
unsigned char RX_Temp;
PIR1bits.RCIF = 0;
PORTB=0xAA;
rxbuf[rxbuf_index] = ReadUSART();
rxbuf_index++;

if(!(rxbuf_index<2))
{
PORTB = rxbuf[1];
rxbuf_index=0;
}
}

#pragma code high_vector=0x08
void high_interrupt (void)
{
_asm GOTO timer0_isr _endasm
}
#pragma code

#pragma interrupt timer0_isr

void timer0_isr (void)
{
INTCONbits.TMR0IF=0;
WriteTimer0(TMR0_VAL);

if(time_cnt>0)
time_cnt--;
}


void main (void)
{
Init_MCU();
Init_USART();
Init_TMR0();
TRISC = 0x00;
//PORTC=0xFF;

INTCONbits.TMR0IF=0;
INTCON2bits.TMR0IP=1;

RCONbits.IPEN=1;
INTCONbits.GIEL=1;
INTCONbits.GIEH=1;

WriteUSART(0x00);
while(BusyUSART());

TRISB=0x00;
PORTB=0x00;
rxbuf_index=0;
ADC_TEMP=1;

while (1)
{
switch(ADC_TEMP)
{
case 1:
{
Delay10TCYx(10);
ConvertADC() ;
while(BusyADC());

if(ADRESH>=0x33)
{
time_cnt=500;
ADC_TEMP=2;
PORTCbits.RC2=0;
PORTCbits.RC1=1;
WriteUSART(0x31);
while(BusyUSART());
}
}
break;

case 2:
{


Delay10TCYx(10);
ConvertADC() ;
while(BusyADC());
if(ADRESH>=0x33)
{
if(time_cnt==0)
{
ADC_TEMP=3;
PORTCbits.RC2=1;
PORTCbits.RC1=0;
WriteUSART(0x32);
while(BusyUSART());
}
}
else
ADC_TEMP=1;
}
break;

case 3:
{

Delay10TCYx(10);
ConvertADC() ;
while(BusyADC());

if(ADRESH<=0x19)
{
time_cnt=1000;
ADC_TEMP=4;
PORTCbits.RC2=0;
PORTCbits.RC1=0;
WriteUSART(0x33);
while(BusyUSART());

}
}
break;

case 4:
{
Delay10TCYx(10);
ConvertADC() ;
while(BusyADC());
if(ADRESH<=0x19)
{
if(time_cnt==0)
{
ADC_TEMP=1;
PORTCbits.RC2=1;
PORTCbits.RC1=1;
WriteUSART(0x34);
while(BusyUSART());
}
}
else
ADC_TEMP=3;
}
break;
}//SWITCH ADC
}//while
}

void Init_MCU(void)
{
ADCON0=0x05; //CH1:05 CH0:01
ADCON1=0x0D; //A:AN0、AN1
ADCON2=0x3A;

TRISA=0xFF;
TRISB=0xFF;
TRISC=0XB9;
//TRISCbits.TRISC6=0;
//TRISCbits.TRISC7=1;

PORTA=0xFF;
PORTB=0xFF;
PORTC=0xF9;

FLAGbits.START=0;
}

void Init_USART(void)
{
OpenUSART( USART_TX_INT_OFF &
USART_RX_INT_ON &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX &
USART_BRGH_HIGH,
12 );
PIR1bits.RCIF=0;
IPR1bits.RCIP=0;
}

void Init_TMR0 (void)
{
OpenTimer0( TIMER_INT_ON &
T0_16BIT &
T0_SOURCE_INT &
T0_EDGE_RISE &
T0_PS_1_1 );

WriteTimer0(TMR0_VAL);
INTCONbits.TMR0IF=0;
INTCON2bits.TMR0IP=0;

INTCONbits.PEIE = 1;
INTCONbits.GIE = 1;
}

發表於: 2008/10/18 16:15
頂部


Re: 這次是軟體UART問題請教
#23
初級會員
初級會員


謝謝 Ryang 版主

當我把usart和timer0的問題解決後,我會努力研究第六章的範例。

非常謝謝您

發表於: 2008/10/18 16:03
頂部


Re: 這次是軟體UART問題請教
#24
初級會員
初級會員


謝謝 leowang 指教。
不過組語我看不懂 =.=..

而且現在也不太會用C18內崁組語。

發表於: 2008/10/18 0:27
頂部


Re: 這次是軟體UART問題請教
#25
初級會員
初級會員


Ryang 前輩你好
W401的文件我有找過。
第五章是在教硬體方式的串列傳輸
第六章是教I2C
我都找不到軟體UART的範例。

另外指令USART是否是指硬體?
UART指令是否就是指軟體?


PS:沒學過C語言,也不太會寫單晶片。所以得有範例參考才會修改編寫 ><

發表於: 2008/10/17 13:46
頂部


這次是軟體UART問題請教
#26
初級會員
初級會員


再一次請教關於軟體UART的問題。
我有購買曾百由 老師著作的書籍。
裡面有提到可以使用軟體UART的方式做傳輸

在硬體上,設定一些暫存器並設定0x18低優先中斷位子
可是軟體呢??是否要設定什麼呢???

有否範例程式可供參考。
(目前猜測讀取用ReadUART,傳送用WriteUART。DelayTXbitUART、DelayRXHalfBitUART、DelayRXBitUART這應該是關係到鮑率吧?)
----------------------------------------------------------------------
在網站上也有試的尋找,不過不知道是不是本人眼矬,實在找不到。

再一次請教高手指教。

發表於: 2008/10/17 11:22
頂部


Re: PIC18F_USART_RX問題(用C18)
#27
初級會員
初級會員


感謝 master 前輩指導,剛試驗成功。
正在瞭解這種寫法。並從中瞭解自己錯在哪。

非常謝謝前輩指導

發表於: 2008/10/17 10:49
頂部


PIC18F_USART_RX問題(用C18)
#28
初級會員
初級會員


再次請教版上前輩問題,關於USART的RX問題。
傳送端會丟來3個BYTE(0xFF,0x55,0xAA)
我想判定第二個byte的資料,是否為0x55
可是我用下列寫法。我看我的PORTB會顯示出三種狀態。
想請教我在接收RX的資料做判別。是否有寫錯之處?
-----------------------------------------------------------------

#include <p18f2321.h>
#include <delays.h>
#include <adc.h>
#include <timers.h>
#include <usart.h>

#pragma config OSC=HS, BOR=OFF, BORV=2, PWRT=ON, WDT=OFF, LVP=OFF

struct Flag
{
unsigned TXD:1;
}FLAGbits;

void Rx_isr (void);

#pragma code low_vector=0x18
void low_interrupt (void)
{
_asm GOTO Rx_isr _endasm
}
#pragma code

#pragma interruptlow Rx_isr

void Rx_isr (void)
{
unsigned char RX_Temp[7];
unsigned char i;
PIR1bits.RCIF = 0;
for(i=0;i<3;i++)
{
RX_Temp[i]=ReadUSART();
}
PIR1bits.RCIF = 0;
PORTB = RX_Temp[1];
}

void main ()
{
PORTB = 0x00;
TRISB = 0;

OpenUSART( USART_TX_INT_OFF &
USART_RX_INT_ON &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX &
USART_BRGH_HIGH,
12 );

RCONbits.IPEN=1;
INTCONbits.GIEL = 1;
INTCONbits.GIEH = 1;


FLAGbits.TXD=0;
while(1)
{

}
}

發表於: 2008/10/16 16:27
頂部


Re: 請教TIMER使用方法(PIC18F C18)
#29
初級會員
初級會員


感謝 Ryang 前輩願意熱心指導。
我已經試出來了!!非常謝謝您~

發表於: 2008/10/16 16:13
頂部


Re: 關於晶片18F4620
#30
初級會員
初級會員


參照:

紳嵐瑟 寫道:
我想請教一下 關於18F4620此單晶片是否有C語言編輯的版本
如果有該怎麼得到 煩請知道的人提供一下 謝謝


PIC18系列,如果要用C寫,可以用C18軟體。
至於C18有學生版,官網可以下載。

發表於: 2008/10/14 17:48
頂部



« 1 2 (3) 4 »



:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------