Dit is waarschijnlijk een hele stomme vraag, maar ik heb de datasheets door zitten spitten, zitten googelen en hier de zoekmachine gebruikt, en ik kan niet vinden welke pinnen ik moet hebben voor een RS-232 interface. Het enige wat ik kon vinden is dat je de TXn kunt mappen op zo'n algemene pin, maar helemaal niets over de RXn.
Het is een dsPIC33FJ64GP802 in 28-pins DIP behuizing. Hij draait en de PICKit2 ziet hem.
Kan iemand mij vertellen waar ik die pinnen kan vinden/mappen? Een klein codevoorbeeldje waarbij alles goed wordt ingesteld zou ook heel welkom zijn.
Nog een andere vraag: hij draait nu op de interne oscillator (ik had ergens gelezen dat dat ook voor RS-232 zou moeten werken als de snelheid niet te hoog wordt), maar is dat ook betrouwbaar? Of kan ik toch beter een kristal aansluiten? En zo ja, met welke frequentie? Met een AVR was de interne oscillator en RS-232 geen succes, en moest je liefst een kristal hebben met de juiste frequentie (wat niet gewoon de maximale kloksnelheid was).
Sommige microcontrollers hebben de voorziening voor een apart kristal voor timing van I/O, maar dat is volgens mij bij deze dsPIC niet het geval.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Ikzelf gebruik altijd een kristal voor asynchrone communicatie, de interne RC oscillator is niet zo exact.
De remapping van de Rx pins staat toch duidelijk in de datasheet: Zie de RPINR18 en RPINR19 registers...
timmie
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide
Op 19 juni 2009 19:46:49 schreef Arco:
Ikzelf gebruik altijd een kristal voor asynchrone communicatie, de interne RC oscillator is niet zo exact.
De remapping van de Rx pins staat toch duidelijk in de datasheet: Zie de RPINR18 en RPINR19 registers...
Daar staat het inderdaad. Helemaal overheen gekeken.
Dus, ik moet:
1. Het IOLOCK bit clearen
2. In RPINR18 de RX1 pin mappen
3. In het juiste RPnR register 00011 schrijven om hem te mappen naar TX1
4. In IFS0 of IEC0 bit 12 aanzetten om RX interrupt daarop te zetten (?)
5. Op interrupt vector 19 en 20 het adres van de functies zetten die de communicatie afhandelen
6. De juiste waardes in het U1MODE en U1STA register zetten
7. Het IOLOCK bit setten
?
Op 19 juni 2009 19:53:23 schreef timmie:
hoofstuk 11 staat dat toch uitgelegd?
Ik moet inderdaad nog wat beter RTFM. Bij de 80196, HC11 en AVR was dat een stuk simpeler.
Ik heb een prachtige application note gevonden, over hoe je "auto baud" gebruikt.
En nu ik het allemaal zit te bekijken, is het toch wel heel prachtig als je on-the-fly alles simpel kunt remappen. Zonder dat was die "auto baud" feature ook niet mogelijk.
Ik moet er gewoon heel anders tegenaan kijken en over nadenken.
Maar bedankt voor het op weg helpen!
[Bericht gewijzigd door Henry S. op (15%)]
Alles werkt nu, behalve dat ik op geen enkele manier een extern kristal (10 MHz) als klok aan de praat krijg. Hij draait nu dus op de interne oscillator met PLL (~23 MHz). Dat werkt op zich wel, maar ik had toch liever de zaak strak op 80 MHz draaien, zodat ik wat meer tijd heb om alle interrupts af te handelen. En het is ook makkelijker voor de timing.
Ik heb van alles geprobeerd, (ook alle voorbeeldjes en application notes, ander kristal, andere condensators, maar ik zie alleen een blokgolf als ik de interne oscillator gebruik en de output op OSC2 zet. (Met de frequentie van die interne oscillator).
Het probleem zit hem er volgens mij in, dat ik de interne registers die nodig zijn (vooral OSCCON) om de controller over te laten schakelen op 80 MHz niet geprogrammeerd krijg nadat de controller is opgestart, en dat ik niet weet of en hoe ik die kan instellen tijdens het programmeren. En dat de controller dan niet het juiste signaal op de OSCx pennen zet.
Het werkt alleen als ik de config bits instel via MPLAB en dan de default waardes gebruik. Vandaar dat ik ook de interne oscillator niet via PLL op ~80 MHz krijg, wat ik ook prima zou vinden. Wat lastiger, maar met autobaud is die goed genoeg.
Ik heb ook de C macro gebruikt waarmee je OSCCON moet programmeren en zo, maar IOLOCK staat gewoon uit en ik kan alle andere registers (om de pootjes toe te kennen en zo) gewoon programmeren. Pas als ik iets met OSCCON wil doen gaat het fout.
Ik heb ook 2 andere dsPIC's geprobeerd, maar dat gaf hetzelfde resultaat.
Daan Timmer
Ik ben programmeur! geen electronicus! http://www.daantimmer.nl/ Er is een ontwerp! nu nog inhoud :-)
Voor mijn afstudeerstage heb ik met een PIC24HJ128GP502 gewerkt.
Clock gedeelte is (afaik) het zeldfe (+/-)
Ik werk als volgt:
//stdcfg.h:
/******************************
osccilator settings
******************************/
#define M_PLLDIV 42
#define N1_PLLPOST 0
#define N2_PLLPRE 0
#define Fin 7370000
#define Fosc ( Fin * ( ( M_PLLDIV+2 ) / ( ( N1_PLLPOST+2 ) * ( N2_PLLPRE+2 ) ) ) )
#define Fcy ( Fosc / 2 )
/*****************************/
/******************************
uart settings
******************************/
//#define BAUDRATE 9600
//#define BAUDRATE 38400
//#define BAUDRATE 57600
//#define BAUDRATE 115200
//#define BAUDRATE 230400
#define BAUDRATE 460800
//#define BAUDRATE 921600
#define BRGH 1
#if BRGH == 1
#define FASTMODE 4
#define UARTMODE 0x8
#else
#define FASTMODE 16
#define UARTMODE 0x0
#endif
#define BRGVAL ( ( ( Fcy / BAUDRATE ) / FASTMODE ) - 1 )
//PR IO ports
#define CAM_MCLK_PPS() RPOR6bits.RP13R = 0b10010 //OutputCompare1 on RP13
#define UART_TX_PPS() RPOR2bits.RP5R = 0b00011 //Uart1 TX on RP5
#define UART_RX_PPS() RPINR18bits.U1RXR = 6 //Uart1 RX on RP6
#define TMR3_CLK_PPS() RPINR3bits.T3CKR = 15 //TMR3 external clock on RP15
/*****************************/
/******************************
useful macros
******************************/
#define CLEAR_IOLOCK() __builtin_write_OSCCONL(OSCCON & ~ ( 1 << 6 ) )
#define SET_IOLOCK() __builtin_write_OSCCONL(OSCCON | ( 1 << 6 ) )
//uart.c:
void uart_init(void)
{
U1MODE = 0x0000;
U1BRG = BRGVAL;
U1STA = 0x0000;
U1MODE |= 0x8000 | UARTMODE;
U1STA |= 0x0400;
UART_RX_PPS();
UART_TX_PPS();
uart_buffer_in_dma_offset = (u16) dmaoffset(uart_buffer_in);
uart_buffer_out_dma_offset = (u16) dmaoffset(uart_buffer_out);
}
//main.c:
void main_Init_clock(void)
{
PLLFBD = M_PLLDIV; //M (44)
CLKDIVbits.PLLPOST = N1_PLLPOST; //N1 (2)
CLKDIVbits.PLLPRE = N2_PLLPRE; //N2 (2)
//initiate clock switch
__builtin_write_OSCCONH(0x01);
__builtin_write_OSCCONL(0x01);
while(OSCCONbits.COSC != 0b001); //wait for clock switch
while(OSCCONbits.LOCK != 1); //wait for PLL lock
}
int main(void)
{
main_Init_ports();
main_Init_clock();
colormap_init();
CAM_asm_init(Colormap.rgb_r,Colormap.rgb_g,Colormap.rgb_b);
CLEAR_IOLOCK();
uart_init();
camera_init();
UIMgr_init();
SET_IOLOCK();
ENABLE_INTS();
LED_INDICATE = 1;
Exec_run();
return 0;
}
Zowel voor de init op ~80mhz INTRC+PLL als BAUD rate instellingen <en> voor Peripheral Pin Select (PR settings)