Forum: Mikrocontroller und Digitale Elektronik PIC18F45k20 interrup & Serielle Übertragung


von Tim H. (pic_fan)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Vorab: ich bin neuling auf dem gebiet und wollte ein wenig Hobby mäßig 
mal mit einem µc rumspielen.

Ich möchte eine Wetterstation über einen PIC18F45K20 (PICKit3 
Starterset) programmieren.

1. Habe ich mir ein FTDI kabel besorgt das wiefolgt an den PIC 
angeschlossen ist.
    FTDI          PIC
Black = GND       GND
Red = VCC         VDD
Yellow = RX       RC6/TX
Orange = TX       RC7/RX

2. Über eine kleine software die ich in C mit MPLAB Programmiert habe.
Habe ich die Serielle kommunikation zwischen PIC und Computer getestet.
Zum Testen fürs empfangen habe ich Putty genommen.

der Sende Code:
1
/* 
2
 * File:   RxTxMain.c
3
 * Author: floryd
4
 *
5
 * Created on 18. August 2014, 12:34
6
 */
7
#include <xc.h>
8
#include <pic18f45k20.h>
9
#include <stdio.h>
10
#include <stdlib.h>
11
#include <string.h>
12
#include "C:\Program Files (x86)\Microchip\xc8\v1.32\include\plib\usart.h"
13
#include "C:\Program Files (x86)\Microchip\xc8\v1.32\include\plib\delays.h"
14
15
/*=========================================================
16
 * PIC CONFIGURATION
17
 *=========================================================*/
18
#pragma config FOSC = INTIO67, FCMEN = OFF, IESO = OFF // CONFIG1H
19
#pragma config PWRT = OFF, BOREN = SBORDIS, BORV = 30 // CONFIG2L
20
#pragma config WDTEN = OFF, WDTPS = 32768 // CONFIG2H
21
#pragma config MCLRE = OFF, LPT1OSC = OFF, PBADEN = ON, CCP2MX = PORTC // CONFIG3H
22
#pragma config STVREN = ON, LVP = OFF, XINST = OFF // CONFIG4L
23
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF // CONFIG5L
24
#pragma config CPB = OFF, CPD = OFF // CONFIG5H
25
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF // CONFIG6L
26
#pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF // CONFIG6H
27
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF // CONFIG7L
28
#pragma config EBTRB = OFF // CONFIG7H
29
30
//Globale Variable
31
unsigned char message[6] = {'H','a','l','l','o','\0'};
32
33
void sendSpace();
34
void SetupClock();
35
void BootLoad();
36
void uartOpen();
37
38
//MAIN
39
int main(int argc, char** argv) {
40
    TRISD = 0x00;
41
    int i = 0;
42
    SetupClock();
43
    BootLoad();
44
45
    uartOpen();
46
47
    while(i<7){
48
49
        if(TXIF == 1){
50
            LATD = message[i];
51
            WriteUSART(message[i]);
52
            Delay10KTCYx(2);
53
            i++;
54
            if(i==6){
55
               sendSpace();
56
            }
57
        }
58
        }
59
   Delay10KTCYx(200);
60
   return (EXIT_SUCCESS);
61
}
62
//Clock Speed
63
void SetupClock(){
64
    asm("BANKSEL OSCCON"); // IN Bank Wechseln für Osci einstellung
65
    asm("MOVLW 0x60"); // Takt auf 8Mhz einstellen
66
    asm("MOVWF OSCCON");// Work register in OSCIConfig schieben
67
}
68
// The PIC is Starting 
69
void BootLoad(){
70
    int i = 0;
71
    TRISD = 0x00;
72
73
    for(i;i<=255;i++){
74
        Delay10TCYx(200);
75
        LATD = i;
76
    }
77
    //LED Blinken lassen wenn test durchlauf Finished
78
    if(LATD == 0xFF){
79
        for(i=0;i<5;i++){
80
            LATD = 0xFF;
81
            Delay10KTCYx(50); // 0,25s (250ms)
82
            LATD = 0x00;
83
            Delay10KTCYx(50);
84
        }
85
    }
86
}
87
// UART Confuguration
88
void uartOpen(){
89
    OpenUSART(USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_TX_INT_OFF & USART_RX_INT_OFF  & USART_BRGH_HIGH,51); // Einstellung des USART MODUS und der Baudrate
90
}
91
92
void sendSpace(){
93
     WriteUSART(0x20); // Space für abstand in Putty Später zum auslesen für das ende der Übertragung
94
}
======================================================================== 
==
Es kommt Richtig an nur wieso in endlosschleife? Habe keine 
Programmiert.

Das ander ist.

Würde gerne einen Interrupt für RX Programmiern.
meine Anfänge sehen wie folgt aus:
======================================================================== 
==
1
/* 
2
 * File:   RxTxMain.c
3
 * Author: floryd
4
 *
5
 * Created on 20. August 2014, 15:38
6
 */
7
#include <xc.h>
8
#include <pic18f45k20.h>
9
#include <stdio.h>
10
#include <stdlib.h>
11
#include <string.h>
12
#include "C:\Program Files (x86)\Microchip\xc8\v1.32\include\plib\usart.h"
13
#include "C:\Program Files (x86)\Microchip\xc8\v1.32\include\plib\delays.h"
14
15
/*=========================================================
16
 * PIC CONFIGURATION
17
 *=========================================================*/
18
#pragma config FOSC = INTIO67, FCMEN = OFF, IESO = OFF // CONFIG1H
19
#pragma config PWRT = OFF, BOREN = SBORDIS, BORV = 30 // CONFIG2L
20
#pragma config WDTEN = OFF, WDTPS = 32768 // CONFIG2H
21
#pragma config MCLRE = OFF, LPT1OSC = OFF, PBADEN = ON, CCP2MX = PORTC // CONFIG3H
22
#pragma config STVREN = ON, LVP = OFF, XINST = OFF // CONFIG4L
23
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF // CONFIG5L
24
#pragma config CPB = OFF, CPD = OFF // CONFIG5H
25
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF // CONFIG6L
26
#pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF // CONFIG6H
27
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF // CONFIG7L
28
#pragma config EBTRB = OFF // CONFIG7H
29
30
//Globale Variable
31
unsigned char message[6] = {'H','a','l','l','o','\0'};
32
unsigned char empfang[10];
33
unsigned int counter = 0; // Counter für empfangene bits;
34
unsigned int j = 0; //Zähler
35
36
//#define _XTAL_FREQ 8000000 //Oscilator auf 8Mhz setzen
37
38
void sendSpace();
39
void SetupClock();
40
void uartOpen();
41
42
void interrupt IRS(void){
43
    if(RCIE && RCIF){
44
        Delay10KTCYx(2);
45
        message[j] = ReadUSART();
46
    }
47
    j=0; // Reseten des Empfangcounter
48
    return;
49
}
50
51
//MAIN
52
int main(int argc, char** argv) {
53
    TRISD = 0x00;
54
    int i = 0;
55
    SetupClock();
56
    //BootLoad();
57
58
    uartOpen();
59
60
    while(i<7){
61
62
        if(TXIF == 1){
63
            LATD = message[i];
64
            WriteUSART(message[i]);
65
            Delay10KTCYx(2);
66
            i++;
67
            if(i==6){
68
               sendSpace();
69
            }
70
        }
71
        }
72
   Delay10KTCYx(200);
73
   return (EXIT_SUCCESS);
74
}
75
//Clock Speed
76
void SetupClock(){
77
    asm("BANKSEL OSCCON");
78
    asm("MOVLW 0x60");
79
    asm("MOVWF OSCCON");
80
81
// Interrupt Bits setzten;
82
    GIE = 1; // Global Interrupt
83
    RCIE = 1; // usart recive interrupt
84
    PEIE = 1; // Pherephiral interrupt
85
}
86
// UART Confuguration
87
void uartOpen(){
88
    OpenUSART(USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_TX_INT_OFF & USART_RX_INT_ON  & USART_BRGH_HIGH,51);
89
}
90
91
void sendSpace(){
92
     WriteUSART(0x20); // Space
93
}

Hier habe ich das Problem das der PIC nicht darauf reagiert.


Die IDEE, die ich versuche umzusetzen ist das der µc Daten von einen C# 
Programm empfängt diese verarbeitet und Die angeforderten daten zurück 
über die serielle schnitstelle an den Computer sendet.

Danke im vorraus für eure Hilfe

von Chris B. (dekatz)


Lesenswert?

Tim Halbach schrieb:
> int main(int argc, char** argv) {
> .
> .
> .
>    return (EXIT_SUCCESS);
======================================================================== 
==
> Es kommt Richtig an nur wieso in endlosschleife? Habe keine
> Programmiert.
>

Doch hast du!
Wohin soll es den auch Springen ausser zum Programmanfang?
Schreib statt dem "return(...."  "while(1);" hin und die Ausgabe wird 
nur 1x erfolgen.

btw:
>   asm("BANKSEL OSCCON");
>   asm("MOVLW 0x60");
>   asm("MOVWF OSCCON");
Da reicht ein OSCCCON = 0x60; auch ;-)

von Marco S (Gast)


Lesenswert?

Schmeiss erst mal alle delay raus.
RCIE && RCIF
ReadUSART() geht nach message[], wofür dann empfang[] ?

Dann musst du noch das j managen. Hier lohnt es sich, gleich über 
Ringpuffer einzulesen.

Sendest du irgendwie 'H','a','l','l','o','\0', ' ', Zufallswert ?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.