PIC18F Auto-Wake-Up funktioniert anders/besser als in Datenblatt beschrieben?!

Gast #4341881
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
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.