當Timer0和Rx寫在一起卻不動作(思想陷在死迴圈)
|
||||
---|---|---|---|---|
初級會員
|
我已經陷入不知道該怎麼改的地步了,嘗試過把高低中斷互換也沒用><~ 懇請高手幫忙協助,感激萬分。
程式主要的問題在於,當有資料經由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問題請教
|
||||
---|---|---|---|---|
初級會員
|
謝謝 Ryang 版主
當我把usart和timer0的問題解決後,我會努力研究第六章的範例。 非常謝謝您
發表於: 2008/10/18 16:03
|
|||
|
Re: 這次是軟體UART問題請教
|
||||
---|---|---|---|---|
初級會員
|
謝謝 leowang 指教。
不過組語我看不懂 =.=.. 而且現在也不太會用C18內崁組語。
發表於: 2008/10/18 0:27
|
|||
|
Re: 這次是軟體UART問題請教
|
||||
---|---|---|---|---|
初級會員
|
Ryang 前輩你好
W401的文件我有找過。 第五章是在教硬體方式的串列傳輸 第六章是教I2C 我都找不到軟體UART的範例。 另外指令USART是否是指硬體? UART指令是否就是指軟體? PS:沒學過C語言,也不太會寫單晶片。所以得有範例參考才會修改編寫 ><
發表於: 2008/10/17 13:46
|
|||
|
這次是軟體UART問題請教
|
||||
---|---|---|---|---|
初級會員
|
再一次請教關於軟體UART的問題。
我有購買曾百由 老師著作的書籍。 裡面有提到可以使用軟體UART的方式做傳輸 在硬體上,設定一些暫存器並設定0x18低優先中斷位子 可是軟體呢??是否要設定什麼呢??? 有否範例程式可供參考。 (目前猜測讀取用ReadUART,傳送用WriteUART。DelayTXbitUART、DelayRXHalfBitUART、DelayRXBitUART這應該是關係到鮑率吧?) ---------------------------------------------------------------------- 在網站上也有試的尋找,不過不知道是不是本人眼矬,實在找不到。 再一次請教高手指教。
發表於: 2008/10/17 11:22
|
|||
|
Re: PIC18F_USART_RX問題(用C18)
|
||||
---|---|---|---|---|
初級會員
|
感謝 master 前輩指導,剛試驗成功。
正在瞭解這種寫法。並從中瞭解自己錯在哪。 非常謝謝前輩指導
發表於: 2008/10/17 10:49
|
|||
|
PIC18F_USART_RX問題(用C18)
|
||||
---|---|---|---|---|
初級會員
|
再次請教版上前輩問題,關於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)
|
||||
---|---|---|---|---|
初級會員
|
感謝 Ryang 前輩願意熱心指導。
我已經試出來了!!非常謝謝您~
發表於: 2008/10/16 16:13
|
|||
|
Re: 關於晶片18F4620
|
||||
---|---|---|---|---|
初級會員
|
參照:
PIC18系列,如果要用C寫,可以用C18軟體。 至於C18有學生版,官網可以下載。
發表於: 2008/10/14 17:48
|
|||
|