evo ga kod (C18, 18F4520)
#include <p18cxxx.h>
#include <pwm.h>
#include <usart.h>
#include <delays.h>
#pragma config OSC = HSPLL
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config WDT = OFF
#pragma config MCLRE = ON
#pragma config PBADEN = OFF
#pragma config CCP2MX = PORTC
#pragma config LVP = OFF
#pragma config XINST = OFF
volatile unsigned char distance;
void rx_handler (void);
#pragma code rx_interrupt = 0x08
void rx_int(void){
_asm goto rx_handler _endasm
}
#pragma code
#pragma interrupt rx_handler
void rx_handler(void){
distance = ReadUSART();
LATDbits.LATD3 ^= 1; // CHANGE LED
PIR1bits.RCIF = 0;
}
void main(){
ADCON0 = 0;
ADCON1 = 0x0F;
TRISA = 0;
TRISB = 0;
TRISC = 0;
TRISD = 0;
TRISE = 0;
LATA = 0;
LATB = 0;
LATC = 0;
LATD = 0;
LATE = 0;
//PWM ON
T2CON = 0;
OpenPWM1(249);
OpenPWM2(249);
SetDCPWM1(1023);
SetDCPWM2(1023);
TRISCbits.TRISC7 = 1;
RCSTAbits.SPEN = 1;
// baud rate = FOSC/(64*(x+1)) // for brgh_low
// 9600 bps, 40MHz, x=64
OpenUSART(USART_TX_INT_OFF &
USART_RX_INT_ON &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX &
USART_BRGH_LOW,
64);
LATDbits.LATD3 = 1; // TURN LED ON
RCONbits.IPEN = 1;
IPR1bits.RCIP = 1;
INTCONbits.GIEH = 1;
while(1); // do nothing
}
mclr dignut sa 10K na 5V, na D3 vezana ledara, na RX pin dolazi pin sa drugog PIC-a (neki 16F690) koji salje 1 bajt svakih 300ms... ground im je vezan zajedno ...
na osciloskopu se vidi taj bajt kako treba, brzina je idealna (9600 sa minimalnom greskom) sve deluje ok osim
1. ako napajam oba uredjaja sa 5V (lab napajanje, baterije ... probao sa 4.0 do 5.5V ) na osciloskopu se lepo vide bajtovi ali PIC18 ne trigeruje interrupt (ledara ne menja stanje)
2. ako napajam uredjaje sa razlicitih napajanja - ista prica, stabilisanih 5V, sa lab-a, preko 7805, preko bt05 ..
3. ako napajam oba uredja sa pickit2 (usb programer) - rade interapti !??!?!?! sve sljaka ok ?!?!?!?!?
sve sto pickit2 uradi je da ~5V (4.8), i interno digne mclr high ..
el ima neko ideju posto sam ja prolupao