Forum: Mikrocontroller und Digitale Elektronik GP1 bei PIC12F683 als Ausgang


von Henner S. (chagbox)


Lesenswert?

Hallo zusammen

Ich beschäftige mich seit gestern mit dem PIC12F683, da mein Standard-uC 
für das aktuelle Projekt zu gross ist. Der PIC läuft jetzt mit einem 
20MHz Crystal, das funktioniert auch. LED an GP2 kann ich blinken 
lassen, an GP1 ist auch eine LED. Zu Versuchszwecken habe ich jetzt 
folgenden Code:
1
#include "main.h"
2
#include <xc.h>
3
#include <pic12f683.h>
4
#include <stdlib.h>
5
#include <stdio.h>
6
7
#pragma config FOSC = HS
8
#pragma config WDTE = ON
9
#pragma config PWRTE = OFF
10
#pragma config MCLRE = OFF
11
#pragma config CP = ON
12
#pragma config CPD = ON
13
#pragma config BOREN = ON
14
#pragma config IESO = OFF
15
#pragma config FCMEN = OFF
16
17
#define _XTAL_FREQ 20000000
18
#define LED1 GPIObits.GP1
19
#define LED2 GPIObits.GP2
20
21
void main(void) {
22
    
23
    CMCON0 = 0b00000111;
24
    GPIO = 0;
25
    ANSEL = 0;
26
    TRISIObits.TRISIO0 = 0;
27
    TRISIObits.TRISIO1 = 0;
28
    TRISIObits.TRISIO2 = 0;
29
    TRISIObits.TRISIO3 = 1;
30
    
31
    LED1 = 1;
32
    LED2 = 1;
33
    
34
    while(1){
35
        CLRWDT();
36
    }
37
}

Wenn ich das jetzt so programmiere, leuchtet nur die LED an GP2. 
Kommentiere ich den Befehl "CLRWDT()" aus, leuchtet am Anfang nur die 
LED an GP2 und 2 Sekunden später auch die LED an GP1.

Ich finde einfach nicht heraus warum das so ist. Kann man jemand helfen?


Besten Dank und Gruss, Henner

von Dieter W. (dds5)


Lesenswert?

Das Problem wird in diesem 
Beitrag "PIC 16F684 - Problem beim Setzen von Portpins" beschrieben.

von Henner S. (chagbox)


Lesenswert?

Hallo Dieter

Das CMCON0 Register hatte ich ja bereits im DB gelesen und auf 0x07 
gesetzt. Wenn ich jetzt eine zusätzliche 8-bit Variable anlege und diese 
nach der Manipulation jeweils ins GPIO Register schiebe funktioniert es 
tatsächlich. Da bin ich aber vom PIC18 offensichtlich verwöhnt. Bin ja 
mal gespannt was mich noch so erwartet...

Danke und Gruss, Henner

von Dieter W. (dds5)


Lesenswert?

Der Witz ist ganz einfach der interne Ablauf von Schreibbefehlen auf ein 
Port-Register. Es wird nämlich erst der aktuelle Zustand gelesen, dann 
das gewünschte Bit manipuliert und dann der Wert wieder auf den Port 
geschrieben.

Da das Lesen zu einem sehr frühen Zeitpunkt während der 4 Takte eines 
Befehls, das Schreiben aber sehr spät erfolgt, hat der Port den Wert des 
vorhergehenden Befehls noch nicht übernommen wenn der folgende Befehl 
den Port wieder liest.

Ein ähnliches Problem tritt auf, wenn ein auf Ausgang programmierter 
Portpin von außen auf GND oder VCC gezogen wird. Dann wird der "falsche" 
Pegel gelesen und anschließend geschrieben.

Bei PIC, die noch keine getrennten PORT und LAT Register haben wird 
deshalb empfohlen, die Portdaten in einem Register zu halten und zu 
manipulieren und den Inhalt dann in das Portregister zu schreiben.

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.