Forum: Mikrocontroller und Digitale Elektronik PIC18F Auto-Wake-Up funktioniert anders/besser als in Datenblatt beschrieben?!


von Stefan (Gast)


Lesenswert?

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
}

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.