2012-04-26 5 views
1

J'ai un PIC 16F887A connecté au port série. Je veux qu'il allume une led verte quand il reçoit 0x01 et allume une led rouge quand il reçoit 0x00 de pc. J'envoie les caractères d'une application C# Windows Forms, le PIC lui-même est programmé avec CCS C. Pouvez-vous s'il vous plaît me dire ce que je fais mal comme les codes ci-dessous ne fonctionnent pas?Port série C# + Port série CCS C + PIC 16F877A

Editer: Par ne fonctionne pas, je veux dire qu'il lit la led rouge dans les deux cas.

code C#

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 
using System.IO.Ports; 

namespace deneme 
{ 
    public partial class Form1 : Form 
    { 
     SerialPort port = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One); 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void openportbtn_Click(object sender, EventArgs e) 
     { 
      if (port.IsOpen) 
      { 
       port.Close(); 
      } 

      if (!port.IsOpen) 
      { 
       port.Open(); 
      } 
     } 

     private void rightbtn_Click(object sender, EventArgs e) 
     { 
      byte[] right = new byte[1]; 
      right[0] = 0x01; 
      port.Write(right, 0, right.Length); 
     } 

     private void wrongbtn_Click(object sender, EventArgs e) 
     { 
      byte[] wrong = new byte[1]; 
      wrong[0] = 0x00; 
      port.Write(wrong, 0, wrong.Length); 
     } 
    } 
} 

CCS C Code de

#include <16f877A.h> 

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD 

#use delay (clock=4000000) 

#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, parity=N, stop=1, bits=8) 

char received; 
char right = 0x01; 

#int_rda 
void serial_interrupt() 
{ 
    disable_interrupts(int_rda); 
    received = getc(); 
    if(received == right) 
    { 
     output_high(pin_c5); //green led 
     delay_ms(200); 
     output_low(pin_c5); 
    } 
    else 
    { 
     output_high(pin_c4); //red led 
     delay_ms(200); 
     output_low(pin_c4); 
    } 
} 

void main() 
{ 
    setup_psp(PSP_DISABLED); 
    setup_timer_1(T1_DISABLED); 
    setup_timer_2(T2_DISABLED,0,1); 
    setup_adc_ports(NO_ANALOGS); 
    setup_adc(ADC_OFF); 
    setup_CCP1(CCP_OFF); 
    setup_CCP2(CCP_OFF); 

    output_low(pin_c4); 
    output_low(pin_c5); 

    enable_interrupts(GLOBAL); 
    while(1) 
    { 
     enable_interrupts(int_rda); 
    } 
} 
+1

Quelle valeur recevez-vous réellement dans le «bon» cas? Que se passe-t-il si vous changez le test à "if (received! = 0)" au lieu de "if (received == right)"? – MiMo

+0

J'utilise la simulation Proteus ISIS (avec des pilotes de port série virtuels). Dans le "bon" cas je vois 01 au terminal virtuel Proteus mais il coule toujours le rouge. Et cela fonctionne maintenant correctement quand j'utilise if (reçu! = 0) dans le code C, merci. Le code original semble également légitime mais pourquoi ne fonctionne-t-il pas correctement, aucune idée? – Omerta

+0

Peut-être que les bits sont lus dans l'ordre inverse - donc vous envoyez '0x01' et recevez' 0x80', ou il y a un problème avec la parité, donc vous envoyez '0x01' et recevez' 0x02' parce que le bit de parité a décalé tout .. Cela fait longtemps que j'ai travaillé avec des ports série, mais je me souviens qu'ils peuvent être difficiles – MiMo

Répondre

1

Si elle reçoit 0x00 dans les deux cas, il est probable que vous avez un décalage de vitesse de transmission, même faible. Après avoir détecté un bit de départ, le PIC peut voir les 7 premiers zéros et penser qu'il a vu 8, aller 0x00 dans les deux cas. Je voudrais essayer de transmettre à partir du PIC et du PC et regarder les lignes sur une portée pour s'assurer qu'ils fonctionnent à la même vitesse. Vous pouvez également essayer de transmettre en continu 0xAA pour obtenir un modèle d'œil (10101010) et comparer les deux signaux.

+0

Une autre option consiste à connecter les broches rx et tx du PIC et d'envoyer 0 et 1 à partir du PIC lui-même et de voir s'il peut allumer et éteindre les bons LED. Si ce n'est pas le cas, il y a un problème avec le programme PIC. –