Toon posts:

PIC16F690 UART

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik zit met het probleem dat ik mijn karakter dat ik uitstuur met de PIC niet uitgelezen krijg (received) op mijn computer ... .
Mijn pin-connecties zijn als volgt;

DE-9----------------MAX232N--------------PIC16f690

pin3 (Txd)---------pin14
pin2 (Rxd)--------pin13
pin5 (GND)-------pin15(GND)------------pin20(GND)
-
----------------------pin11 (Tx)---------------pin10 (RB7/TX)
-----------------------pin12 (Rx)--------------pin12 (RB5/RX)

In mijn c-code kan je zien dat ik met een knop, aangesloten op RC2, het karakter A wil versturen met daarna een \r. de initialisatie van de UART staat in de functie uart_init().
De code die ik gebruik in de pic om een char door te sturen is als volgt;
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & UNPROTECT & BORDIS & IESODIS & FCMDIS);

// Using Internal Clock of 8 MHz
#define FOSC 8000000L

//----------------------------------WRITE AND READ--------------------------------------------
void send_char(unsigned char data)
{
  // Send Data when TXIF bit is ready
  while(!TXIF) continue;
  TXREG = data; 
}

unsigned char get_char(void) { 
  // Get Data when RCIF bit is ready
  while(!RCIF) continue;
  return RCREG;
}
//--------------------------------------UART-------------------------------------------------
void uart_init()
{
  TRISB5 = 1;          // Set Port B5 and B7 for UART Tx and Rx
  TRISB7 = 0;
  #define BAUD_RATE 9600

  SPBRG = (int)(FOSC/(64UL * BAUD_RATE) - 1); //datasheet
  TXSTA = 0b00100000;  // Async, 8 bit and Enable Transmit (TXEN=1)
  RCSTA = 0b10010000;  // Serial Port Enable, Async,8-bit and Enable Receipt (CREN=1)
  BAUDCTL=0; //Baud Rate Control
}
//----------------------------------MAIN-----------------------------------------------------
void main(void)
{
  OSCCON=0x70;           // Select 8 MHz internal clock
  TRISC = 0b00000100;   // 2 LED's (reveiving and transmitting) and 1 input rc2
  PORTC = 0x00;           // Turn all Off PORTC
  ANSEL = 0x00;           // Set PORT AN0, AN3, AN4, AN5 and AN6 as digital input
  ANSELH = 0x00;        // Set PORT AN8 to AN11 as Digital I/O
  GIE = 1;                     // Global interrupt enable
  
  // Initialize UART
  uart_init();

  while(1 == 1) //loop forever
  {
    if ( RC2 == 1)
    {
        send_char('A'); // sending my char to pc
        send_char('\r'); // or '0x0D' (13 in decimal) -> This one is called "Carriage return" (CR).
    }
    //else if (here code for receiving ... ) first get some char on my screen!
  }
}


De code die ik gebruik om dan de karakter uit te lezen is in XAML (WPF) en zou eigenlijk eerst in een MessageBox moeten weergegeven worden.

De serial poort is gedeclareerd als sp1. De thread "myThread(Read)" is een eerste poging om de karakter uit te lezen.
De nieuwe instantie sp1_DataReceived is een betere vorm om iets in te lezen bij ontvangen van data over de geselecteerde COM poort. Ik heb er de 2manieren erbij geplaatst om aan te tonen dat ik deze 2 heb geprobeerd (zonder resultaat echter :-( )
Natuurlijk de functie Text_InLabel() doet nog niet wat zijn benaming weergeeft, eerst wil ik dit testen in een MessageBox.

Wanneer ik dit programma run, dan verkrijg ik geen error, maar ook geen MessageBox :'( !

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
public partial class Window1 : Window
    {
        static SerialPort sp1;
        //if serialport is open dan connection = true
        static bool connection = false;
        //thread for reading
        static Thread myThread = new Thread(Read);

        public Window1()
        {
            InitializeComponent();
            set_ComPort();
            Text_InLabel();
        }
        //connection with COM3
        static void set_ComPort()
        {
            try
            {
                
                sp1 = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
                connection = true;
            }
            catch (Exception e)
            {
                MessageBox.Show("COM3 niet geselecteerd of aangesloten!\n" + e);
                connection = false;
            }
        }

        static void Text_InLabel()
        {
            sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived);

            if (sp1.IsOpen == false)
            {
                //open port for communication
                try
                {
                    sp1.Open();
                    connection = true;
                }
                catch (InvalidOperationException i)
                {
                    MessageBox.Show("\n\nCOM3 aangesloten? \nError: Kijk bij apparaatbeheer of kijk kabel na.");
                    Console.WriteLine(i);
                }
            }
            else
            {
                MessageBox.Show("Serieële poort is bezet.");
                connection = false;
                return;
            }
        }
        
        //manier 1 om uit te lezen
        public static void Read()
        {
            while (connection == true)
            {
                try
                {
                    string message = sp1.ReadChar().ToString();
                    //this.label1.content = message;
                    MessageBox.Show("Bericht: " + message);
                }
                catch (TimeoutException t) 
                {
                    MessageBox.Show("Time out\n\n" + t);
                }
            }
        }
        
        //manier 2 om uit te lezen BETER deze manier
        static void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //MessageBox.Show(e.ToString());
            //MessageBox.Show(sender.ToString());
            MessageBox.Show("Bericht: " + sp1.ReadChar().ToString());
        }
    }


Alvast dank ik jullie voor het lezen van deze topic, en natuurlijk hoop ik op een reactie dat mij duidelijk kan maken wat hier juist mis loopt.
Mocht het nu wel plots werken, dan meld ik dit natuurlijk !

Groeten,

Wim

Acties:
  • 0 Henk 'm!

  • Cassettebandje
  • Registratie: Juli 2002
  • Laatst online: 09-10 19:47

Cassettebandje

SA-C90 TDK

Krijg je in Hyperterminal of Putty of iets dergelijks wel de karaktertjes van je PIC binnen? Zo niet: dat eerst oplossen.

Acties:
  • 0 Henk 'm!

  • Atlas
  • Registratie: Mei 2002
  • Niet online

Atlas

Ik flits niet meer terug!

Inderdaad, eerst even via de hyperterminal het eea bekijken. En heb je een schema van hoe je het eea hebt aangesloten? Ik vertrouw die TX <> TX verbinding niet.

Join the dark side, we have cookies :)
You need only two tools. WD-40 and duct tape. If it doesn't move and it should, use WD-40. If it moves and shouldn't, use the tape.


Acties:
  • 0 Henk 'm!

Verwijderd

Probeer eens een remote loopback (RX en TX aan de microcontroller kant van je 232 aan elkaar knopen) zodat je weet of je MAX232 het goed doet...

Acties:
  • 0 Henk 'm!

  • Killerbert
  • Registratie: September 2007
  • Laatst online: 06-10 21:08
hmm.. ik heb er niet zoveel verstand van, maar ik ga ervanuit dat je data vanaf de pic naar de pc wilt sturen.

dan moet je dus vanaf de pic(TX) naar de DE-9(RX).

je sluit normaal de transmit data aan op de Received data.

daarna zal ik met putty/Hyperterminal proberen om data uit te lezen.

Op een dag drink je geen bier meer maar drink je Grolsch... My specs


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Killerbert schreef op vrijdag 16 april 2010 @ 21:54:

dan moet je dus vanaf de pic(TX) naar de DE-9(RX).

je sluit normaal de transmit data aan op de Received data.
Mhh, met pic bedoel je waarschijnlijk de MAX232N (deze maakt het mogelijk om u hardware met u pc te communiceren.

en de Tx op de Rx aansluiten zal ik overlopen, want dan moet ik dit ook eens voor de zekerheid nagaan voor de pic naar de MAX en MAX naar de DE-9

Ik heb de MAX getest, maar zonder goed resultaat, zoals eerder voorgesteld werd. Dus eerst dit probleem verhelpen voor ik met de code probeer.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb de verbinding nu omgedraaid, maar nog altijd geen resultaat. |:(
Het probleem ligt hem alleszins niet aan mijn kabel, want als ik pin 2 en pin 3 verbind aan elkaar van de DE-9 krijg ik wel een teststring (console) tevoorschijn. :/

Even deze vraag voor verduidelijking;

pc <-> hardware
- TX van DE-9 (pin2) gaat naar de R1IN (pin 13 ) van de MAX232N
- RX van DE-9 (pin3) gaat naar de T1OUT(pin 14 ) van de MAX232N

pic <-> MAX232N
- Tx (pin 10) van de pic gaat naar de R2IN (pin 8 ) van de MAX232N
- Rx (pin 12) van de pic gaat naar de T2OUT (pin 7 ) van de MAX232N

pin 5 van de MAX232N natuurlijk aan de GND! :+

Dit zou het dan moeten zijn om het mogelijk te maken dat de hardware communiceert met de computer?

[ Voor 10% gewijzigd door Verwijderd op 18-04-2010 17:36 ]


Acties:
  • 0 Henk 'm!

  • Atlas
  • Registratie: Mei 2002
  • Niet online

Atlas

Ik flits niet meer terug!

Dit klopt voor geen meter :P


11 en 14
10 en 7
12 en 13
9 en 8

Dit zijn de paren van de inverters. Zie: http://pdf1.alldatasheet....iew/27230/TI/MAX232N.html

Je moet dus ook in paren werken. Want nu gaat je signaal nergens heen :)

Dus bv:
TTL kant: pin 11, CMOS kant pin 14.
Zo moet je het geheel aansluiten :)

Join the dark side, we have cookies :)
You need only two tools. WD-40 and duct tape. If it doesn't move and it should, use WD-40. If it moves and shouldn't, use the tape.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
:*) jajaa, Kan je het al raden ? 8)

Domme misstap gebeurt, zoals u zei PAREN =>

DE-9____MAX232N

pin2_____pin13
pin3_____pin14
___________________
MAX232N____cmos

pin11________pin10
pin12________pin12

Het werkt, nu heb ik verbinding met de hardware, ik ga nu mijn code eens testen met het versturen van een karakter en deze uitlezen.

Nogmaals bedankt !!!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zondag 18 april 2010 @ 19:02:

Het werkt, nu heb ik verbinding met de hardware, ik ga nu mijn code eens testen met het versturen van een karakter en deze uitlezen.

Nogmaals bedankt !!!
Ik had blijkbaar tevroeg gejuigd, eerst ging hij en na dat ik terug kwam van het eten wou hij weer niet werken. Niets gewijzigd ofzo, maar opeens niets meer.
Nog even indiepen... . 8)7

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mijn probleem ligt hem bij de MAX232N.
Ik krijg geen ontvang signaal wanneer ik een teststring laat versturen.

MAX232N________DE-9

pin15____________pin5______GND
pin14____________pin3
pin13____________pin2

pin12 is verbonden met een brugske naar pin11,
de pin12 en pin11 zijn van de MAX232N (dit om deze chip te testen).

allemaal condensators van 1µF zijn als volgt aangesloten aan MAX232N;
pin1 naar +c, -c naar pin3
pin2 naar +c, -c naar GND
pin4 naar +c, -c naar pin5
pin6 naar -c, +c naar GND

Dit zou het normaal moeten doen, maar wanneer ik volgende functies test krijg ik nog geen resultaat;

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static void ThreadProc()
            {
                sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_dataReceived);
                while (true)
                {
                    sp1.WriteLine("A");
                    Thread.Sleep(2000);
                }
            }
 static void sp1_dataReceived(Object o, SerialDataReceivedEventArgs e)
            {
                String s = sp1.ReadLine();
                s += sp1.ReadByte().ToString();
                Console.WriteLine("RECEIVED: {0}", s);
            }
}

Het antwoord dat in mijn console zou moeten komen is RECEIVED: A65.
Maar ik krijg niets binnen en de kabel werkt uitstekend wanneer ik (ik weet het, maar testen van de kabel) pin2 en pin3 aan elkaar leg van de DE-9.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
fout zat hem in het volgend:

DE-9___max232n
pin2____pin14
pin3____pin13

dank u allemaal voor de info, dit was een vruchtbare topic voor mij !
Pagina: 1