Ik heb een PIC 16F877 praten met een Hyperterminal en er komt ook nog tekst uit. Alleen nu zet ik er een MAX232 tussen en nu heb ik allemaal weer rare tekens. Weet iemand waar dit in zou kunnen zitten?

baudrate: 57600
Clockfrequentie PIC: 20 MHz

PIC functioneert goed, gaat om MAX232. Heb ook condensatoren op de juiste pinnen gezet.

Hoe had je hem daarvoor aangesloten?

De max232 inverteerd het signaal, houd je daar rekening mee?

Haal de PIC uit het circuit en test de Max232 los door tx en rx die normaal naar de PIC gaan door te verbinden. Wat je in de terminal intyped moet nu leesbaar worden. (Typ maar 's "test" oid met tx/rx verbonden en dan met tx/rx los.)

Wat ik denk ik dat je inverted/true verkeerd hebt (Als de MAX232 gewoon werkt). De max232 inverteert het signaal.

@pientertje/Lucky Luke
Dat was het!! Ik kan het even niet zo snel uit de datasheet van de MAX232 halen, maar inderdaad heb de hyperterminal op RX/TX/Polarity op inverted gezet en voila!

Probleem opgelost.

Hmm, Ik zou toch liever de polariteit aan de andere kant, dus bij de micro instellen. Anders ga je toch weer problemen krijgen zodra je een ander kommunicatie programma gebruikt.

Inverteren aan de kant van hyperterminal kan niet in de versie die ik hier heb draaien.

Ga ik doen! Bedankt voor de tip. Kan ook in de micro met één commando.

Om geen nieuw topic te starten (en hopelijk zit ik hier goed) stel ik hier een wedervraag over een MAX232.

Nu heb ik een PIC18F258 in een schakeling en ik heb deze aangesloten met een MAX232..echter de BAUDCON parameter is hier niet aan boord. En ik heb de datasheet gelezen, maar misschien lees ik eroverheen hoe het signaal te inverteren. Nu lijkt mijn output wel de juiste te zijn maar deze is onzeker...kom ik zo op

De aansluitingen zitten op de 13 en 14 (RS232) van de MAX232. En met pootje 11 en 12 doorverbinden kan ik echo verkrijgen.

Met onderstaande code verwacht ik om de zoveel tijd dat er een * in beeld komt. Alleen de karakter C ontstaat (hierdoor is mijn vermoeden dat het inverteren juist staat)....vervolgens is het erg stil. De LED's knipperen keurig, maar krijg geen tekens meer in beeld. Haal ik de voeding los en zet hem weer aan dan krijg ik rare tekens (lijkt net of de buffer leeg stroomt [optelling van karakter en klopt ASCII niet meer])..na een paar keer voeding vast/los dan voila de karakter C is er weer. Echter de while(1) lus lijkt alleen te werken voor LED's. Dien ik een interrupt te triggeren??

TRISC = 0x00;          // set direction to be output
  PORTC.RC0 = 0x01;

  UART1_Init(9600);
  UART1_Write_Text("C");
  Delay_ms(1000);      // 1 second delay
  UART1_Write_Text("*");


  while(1) {
    PORTC = 0xFF;        // Turn ON LEDs on PORTC
    Delay_ms(1000);      // 1 second delay

    PORTC = 0x00;        // Turn OFF LEDs on PORTC
    Delay_ms(1000);      // 1 second delay
    UART1_Write_Text("*");
    Delay_ms(1000);      // 1 second delay
    UART1_Write_Text("B");
   };            // Endless loop]

Het is niet zozeer de MAX232 die inverteert, het is het RS-232 protocol dat die logische niveau's voorschrijft. De ontvanger hoort de niveau's terug te vertalen naar 0 en 5 volt. Alleen als de ontvanger het RS-232 protocol niet correct hanteert, dan moet je inverteren. Bij de ontvanger!

Een schema zou overigens geweldig helpen om je probleem op te lossen. Weet je zeker dat je de overige parameters van je communicatie goed hebt staan (8 databits, No parity, 1 stopbit), oftewel 9600,8,N,1?

Als je alleen Rx/Tx gebruikt, kun je het beste in de db-9 connector 1-4-6 en 7-8 doorverbinden.
Het kan zijn dat de uart library op een hardware handshake staat te wachten...

Schema:
http://i995.photobucket.com/albums/af76/BMWTouring/Elektronica/NEW_BOA…

Heb net de 1,4 en 6 en 7+8 doorverbonden. geen gevolg.

const unsigned char VersionString1[]="V1.00";
const unsigned char VersionString2[]="02/10/2012";

void interrupt(){


}

void main() {

  //#pragma config OSC = HS

  unsigned short init_flag, send_flag,read_flag;
  char SJW,BRP,Phase_Seg1, Phase_Seg2, Prop_Seg, txt[4];
  char tx;
  long id,mask;
  //rechts in 0b00000001 = bit 0
  //OSCCON      = 0b00000001; // set system clock from Timer1 OSC.
  //T1OSCEN   = 0b00000001; // set T1CON moet nog!
  INTCON      = 0b10010000; //GIE = ON, PIE = OFF, INT0IE = ON
  PIR1        = 0b00010000; //TXIF = ON (USART Transmit buffer cleared)
  PIE1        = 0b00010000; //TXIE = ON (USART Transmit interrupt enabled)
  IPR1        = 0b00001000; //TXIP = High priority ON
  TXSTA       = 0b10100111; //CSRC = OFF, TX9 = OFF, TXEN = ON, SYNC = 0 [asynch], BRGH = High speed, TRMT = TSR emprty, Polarity switch?
  RCSTA       = 0b10110000; //SPEN = ON, RX9 = OFF, SREN = 1, CREN = 1, ADDEN = 0, FERR = 0, OERR = 0
  TXREG       = 0b00000000; //
  SPBRG       = 23;   //berekening op basis van 14.7456 MHz clock extern + tabel 18-5
  // {SYNC        = 0;    //18.2 --> zie boven
  //  SPEN        = 1;    //18.2}
  
  TRISC = 0x00;          // set direction to be output
  PORTC.RC0 = 0x01;

  UART1_Init(9600);
  UART1_Write_Text("C");
  UART1_Write_Text("*");


  while(1) {
    PORTC = 0xFF;        // Turn ON LEDs on PORTC
    Delay_ms(1000);      // 1 second delay

    PORTC = 0x00;        // Turn OFF LEDs on PORTC
    Delay_ms(1000);      // 1 second delay
      UART1_Write_Text("*");
          Delay_ms(1000);      // 1 second delay
      UART1_Write_Text("B");
     };            // Endless loop

}

Je schrijft 0xFF naar PORTC, waar ook je TX en RX op zitten. Ik denk dat de compiler daardoor je UART uitschakelt.

De Rx en Tx pin moeten ook altijd als INPUT gezet worden bij een PIC om de UART goed te laten werken, staat in de datasheet.

krijg niet aangesloten en op de analyzer
http://i995.photobucket.com/albums/af76/BMWTouring/Elektronica/data1_z…

Als ik de DB9 aan de PC hang is er niks meer. Ook niet meer op de analyzer.

Ik zal de pins nog even op input zetten. En codeprobleem zoals Fuzzbass aangaf is opgelost. Dit was inderdaad verkeerd.

[Bericht gewijzigd door BMWTouring op (13%)]

Nu deze code. Echter geen verbetering. .... Het lijkt erop dat het Tx signaal wel reageert vanaf de computer kant...echter vanaf het board naar de PC lijkt niets over te komen. De LED's knipperen wel leuk..



const unsigned char VersionString1[]="V1.00";
const unsigned char VersionString2[]="02/10/2012";

void interrupt(){


}

void main() {

  //#pragma config OSC = HS

  unsigned short init_flag, send_flag,read_flag;
  char SJW,BRP,Phase_Seg1, Phase_Seg2, Prop_Seg, txt[4];
  char tx;
  long id,mask;
  //rechts in 0b00000001 = bit 0
  //OSCCON      = 0b00000001; // set system clock from Timer1 OSC.
  //T1OSCEN   = 0b00000001; // set T1CON moet nog!
  INTCON      = 0b10010000; //GIE = ON, PIE = OFF, INT0IE = ON
  PIR1        = 0b00010000; //TXIF = ON (USART Transmit buffer cleared)
  PIE1        = 0b00010000; //TXIE = ON (USART Transmit interrupt enabled)
  IPR1        = 0b00001000; //TXIP = High priority ON
  TXSTA       = 0b10100111; //CSRC = OFF, TX9 = OFF, TXEN = ON, SYNC = 0 [asynch], BRGH = High speed, TRMT = TSR emprty, Polarity switch?
  RCSTA       = 0b10110000; //SPEN = ON, RX9 = OFF, SREN = 1, CREN = 1, ADDEN = 0, FERR = 0, OERR = 0
  TXREG       = 0b00000000; //
  SPBRG       = 23;   //berekening op basis van 14.7456 MHz clock extern + tabel 18-5
  // {SYNC        = 0;    //18.2 --> zie boven
  //  SPEN        = 1;    //18.2}
  
  TRISA = 0b11111110;
  
//  ADCON1 = 7;
  
  TRISC = 0b11110000;          // set RC0 t/m RC 4 op output en de rest op input
  PORTC = 0b00001111;

  UART1_Init(9600);
  UART1_Write_Text("C");
  UART1_Write_Text("*");


  while(1) {
    PORTC.RC0 = 1;        // Turn ON LEDs on PORTC
    PORTC.RC1 = 1;        // Turn ON LEDs on PORTC
    PORTC.RC2 = 1;        // Turn ON LEDs on PORTC
    PORTC.RC3 = 1;        // Turn ON LEDs on PORTC

    Delay_ms(1000);      // 1 second delay

    PORTC.RC0 = 0;        // Turn OFF LEDs on PORTC
    PORTC.RC1 = 0;        // Turn ON LEDs on PORTC
    PORTC.RC2 = 0;        // Turn ON LEDs on PORTC
    PORTC.RC3 = 0;        // Turn ON LEDs on PORTC
    
    Delay_ms(1000);      // 1 second delay
      UART1_Write_Text("*");
          Delay_ms(1000);      // 1 second delay
      UART1_Write_Text("B");
     };            // Endless loop

}

Je zet de TX interrupt van de UART aan, en je hebt niet eens een interrupt routine??? :o
Als je interrupts aan zet, moet je die ook wel afhandelen in de interruptroutine en de flags resetten.

[Bericht gewijzigd door Arco op (37%)]

De simulatie (laat met geïnverteerde polariteit in ieder geval iets zien. De interrupts worden niet aangesproken.

http://i995.photobucket.com/albums/af76/BMWTouring/Elektronica/Simulat…




const unsigned char VersionString1[]="V1.00";
const unsigned char VersionString2[]="02/10/2012";

void interrupt(){
        PORTC.RC1 = 1;
        Delay_ms(1000);      // 1 second delay
        PORTC.RC3 = 0;
        return;
}

// Interupt Routine RX
void Rx_interrupt() {
    PORTC.RC2 = 1;
    // Loop just in case more than one character is in UART's receive FIFO buffer
    // Stop if buffer full
    while ((UART_Data_Ready))  {

    }
    PORTC.RC2 = 0;
    return;
}


// Interupt Routine TX
void Tx_interrupt() {
    PORTC.RC3 = 1;
    // Loop to fill more than one character in UART's transmit FIFO buffer
    // Stop if buffer empty
    while ((UART1_Tx_Idle)) {

    }
    PORTC.RC3 = 0;
    return;
}

void main() {

  //#pragma config OSC = HS

  unsigned short init_flag, send_flag,read_flag;
  char SJW,BRP,Phase_Seg1, Phase_Seg2, Prop_Seg, txt[4];
  char tx;
  long id,mask;
  //rechts in 0b00000001 = bit 0
  //OSCCON      = 0b00000001; // set system clock from Timer1 OSC.
  //T1OSCEN   = 0b00000001; // set T1CON moet nog!
  INTCON      = 0b10010000; //GIE = ON, PIE = OFF, INT0IE = ON
  PIR1        = 0b00010000; //TXIF = ON (USART Transmit buffer cleared)
  PIE1        = 0b00010000; //TXIE = ON (USART Transmit interrupt enabled)
  IPR1        = 0b00001000; //TXIP = High priority ON
  TXSTA       = 0b10100111; //CSRC = OFF, TX9 = OFF, TXEN = ON, SYNC = 0 [asynch], BRGH = High speed, TRMT = TSR emprty, Polarity switch?
  RCSTA       = 0b10110000; //SPEN = ON, RX9 = OFF, SREN = 1, CREN = 1, ADDEN = 0, FERR = 0, OERR = 0
  TXREG       = 0b00000000; //
  SPBRG       = 23;   //berekening op basis van 14.7456 MHz clock extern + tabel 18-5
  // {SYNC        = 0;    //18.2 --> zie boven
  //  SPEN        = 1;    //18.2}
  
  TRISA = 0b11111110;
  
//  ADCON1 = 7;
  
  TRISC = 0b11110000;          // set RC0 t/m RC 4 op output en de rest op input
  PORTC = 0b00001111;

  UART1_Init(9600);
  UART1_Write_Text("C");
  UART1_Write_Text("*");


  while(1) {
    PORTC.RC0 = 1;        // Turn ON LEDs on PORTC

    Delay_ms(1000);      // 1 second delay

    PORTC.RC0 = 0;        // Turn OFF LEDs on PORTC

    Delay_ms(1000);      // 1 second delay
      UART1_Write_Text("*");
          Delay_ms(1000);      // 1 second delay
      UART1_Write_Text("B");
     };            // Endless loop

}

Waarom zet je de TX interrupt niet gewoon uit als je er toch niks zinnigs mee doet?
Probeer het eens in een echte schakeling. Simulatie van MCU peripherals is vaak een drama, en klopt van geen kant...

PIE1 = 0b00000000; //TXIE = ON (USART Transmit interrupt diabled)

Heb het net geprobeerd in de schakeling...maar helaas geen respons in putty.

Er staat ook IPR1 = 0b00001000, de processor heeft helemaal geen IPR1 register. Hoe krijg je dat door de compiler?
Ik zie ook 2 interrupt routines, dat kan ook niet met een 16F PIC.
Was de code soms voor een 18F of 24F pic bedoeld?

Daar zeg je iets... Ik gebruik MicroC met HiTech compiler en deze geeft geen problemen. Ook werkt de Proteus Simulatie er gewoon om..wanneer je in de datasheet kijkt in tabel 3-3 en tabel 4-2 en hoofdstuk 8.0 en 8.4 dan is er wel een IPR1 register.

8.4 IPR Registers
The Interrupt Priority (IPR) registers contain the individual
priority bits for the peripheral interrupts. Due to the
number of peripheral interrupt sources, there are three
Peripheral Interrupt Priority registers (IPR1, IPR2 and
IPR3). The operation of the priority bits requires that
the Interrupt Priority Enable bit (IPEN) be set.

De microcontroller is een 18F258

Ah,

Nu zie ik het. Het topic is halverwege plotseling van een 16F877 in een ander 18F258 topic veranderd... ;)

Misschien is dat het probleem ;-) Maar met een 18F258 moet het toch ook lukken? De 16F877 heb ik inderdaad aan de praat.

Probleem is opgelost. Ik moest mijn elco 1uF doorverbinden. Dit tussen pin 2 en 16. Vreemd maar goed. Weet ook niet of dit echt de oplossing is, maar hij werkt. In de datasheet van de MAX232 staat dat pin 2 aan GND of aan +5V kan.