Hallo,
ich habe gerade einen Test gemacht, in dem ich einen PIC18F1320 per
UART-Wake-Up aus dem Sleepmodus aufwecke.
Dabei verhält sich er PIC anders als er laut Datenblatt nach meinem
Verständnis sollte.
Alle drei Sekunden wird von einem anderen µC ein Byte gesendet (eine
Zahl zwischen 1 und 5). Der Empfangene µC liest dieses Byte ein und
lässt eine LED entsprechend der empfangenen Zahl 1 bis 5 Mal blinken.
Anschließend schicke ich ihn in den Sleep-Modus.
Laut Datenblatt liest der Empfänger die nächsten zwei Flanken auf der
Datenleitung nicht ein, sondern wacht durch diese aus dem Sleep auf.
Das Startbit des nächsten Bytes dürfte also nicht als solches erkannt
werden, was den Empfang des Bytes unmöglich machen müsste.
Ich hatte erwartet, dass der PIC nur jedes zweite Byte empfängt, es wird
aber jedes Byte korrekt erkannt.
Was verstehe ich denn hier falsch?
Anbei der Code für den Sender (isMaster = 1) und Empfänger (isMaster =
0)
1 | /*
|
2 | 18-Pin-DIP 18F1320
|
3 | 1 - RA0/AN0 -->
|
4 | 2 - RA1/AN1/LVDIN -->
|
5 | 3 - RA4/T0CKI --> (RA4 OPEN DRAIN)
|
6 | 4 - MCLR/VPP/RA5 --> (RA5 input only)
|
7 | 5 - VSS/AVSS --> GND
|
8 | 6 - RA2/AN2/VREF -->
|
9 | 7 - RA3/AN3/VREF+ -->
|
10 | 8 - RB0/AN4/INT0 --> LED
|
11 | 9 - RB1/AN5/TX/CK/INT1 --> Master Send
|
12 | 10 - RB4/AN6/RX/DT/KBI0 --> Slave Send
|
13 | 11 - RB5/PGM/KBI1 --> LED2
|
14 | 12 - RB6/PGC/T1OSO/T13CKI/P1C/KBI2 -->
|
15 | 13 - RB7/PGD/T1OSI/P1D/KBI3 -->
|
16 | 14 - VDD/AVDD --> +5V
|
17 | 15 - OSC2/CLKO/RA6 -->
|
18 | 16 - OSC1/CLKI/RA7 -->
|
19 | 17 - RB2/P1B/INT2 -->
|
20 | 18 - RB3/CCP1/P1A -->
|
21 | */
|
22 |
|
23 |
|
24 | #include <xc.h>
|
25 |
|
26 | /** Configuration ********************************************************/
|
27 | #pragma config OSC = INTIO2 // Oscillator Selection bits (Internal RC oscillator, port function on RA6 and port function on RA7)
|
28 | #pragma config PWRT = ON
|
29 | #pragma config BOR = ON
|
30 | #pragma config WDT = OFF //Watchdog Timer
|
31 | #pragma config LVP = OFF //Low Voltage ICSP
|
32 | #pragma config MCLRE = OFF // MCLR Pin Enable bit (RE3 input pin enabled; MCLR pin disabled)
|
33 |
|
34 |
|
35 |
|
36 | #define wait001s(var) Delay10KTCYx((var));Delay10KTCYx((var)) // bei 8MHz Takt
|
37 | #define wait01s(var) wait001s((var));wait001s((var));wait001s((var));wait001s((var));wait001s((var));wait001s((var));wait001s((var));wait001s((var));wait001s((var));wait001s((var))
|
38 | #define wait1s(var) wait01s((var));wait01s((var));wait01s((var));wait01s((var));wait01s((var));wait01s((var));wait01s((var));wait01s((var));wait01s((var));wait01s((var))
|
39 |
|
40 | #define FREQ 8000000 // fuer usart.h
|
41 | #define isMaster 0 // erzeugt code für Master oder Slave
|
42 | #define led LATBbits.LATB0
|
43 | #define led2 LATBbits.LATB5
|
44 | #include "usart.h"
|
45 |
|
46 | char data = 0;
|
47 | char tmp = 0;
|
48 | int i;
|
49 |
|
50 | void main(void) {
|
51 | // Osillator settings:
|
52 | OSCCON = 0b01110000^OSCCON; // 8MHZ
|
53 | // Idle mode selection:
|
54 | OSCCONbits.IDLEN = 1;
|
55 | OSCCONbits.SCS1 = 0;
|
56 | OSCCONbits.SCS1 = 0;
|
57 | // Enable USART receive interrupt for wake up from sleep
|
58 | RCIE = 1;
|
59 | PEIE = 1;
|
60 | // Port initialisation:
|
61 | TRISBbits.RB0 = 0;
|
62 | TRISBbits.RB5 = 0;
|
63 | ADCON1bits.PCFG4 = 1;
|
64 | led = 0;
|
65 | led2 = 0;
|
66 |
|
67 | if(isMaster){
|
68 | USART_init(9600);
|
69 | data = 0;
|
70 | while(1){
|
71 | if (data>=5)
|
72 | data = 1;
|
73 | else
|
74 | data++;
|
75 | led = !led;
|
76 | while(!TRMT);
|
77 | TXREG = data;
|
78 | wait01s(30);
|
79 | }
|
80 | }else{
|
81 | USART_init(9600);
|
82 | while(1){
|
83 | if(RCIF){
|
84 | data = RCREG;
|
85 | if (data>5){
|
86 | continue; // Fehler einfach ignorieren
|
87 | }
|
88 | for (i=data;i>0;i--){
|
89 | led = 1;
|
90 | wait001s(20);
|
91 | led = 0;
|
92 | wait001s(20);
|
93 | }
|
94 | WUE = 1;
|
95 | led2=1;
|
96 | SLEEP();
|
97 | led2=0;
|
98 | while(WUE);
|
99 | tmp = RCREG;
|
100 | wait001s(10);
|
101 | }
|
102 | if (FERR) // Fehler einfach ignorieren
|
103 | tmp = RCREG; // Fehler einfach ignorieren
|
104 | if (OERR){ // Fehler einfach ignorieren
|
105 | CREN = 0; // Fehler einfach ignorieren
|
106 | CREN = 1; // Fehler einfach ignorieren
|
107 | }
|
108 | }
|
109 | }
|
110 | }
|