GP1 bei PIC12F683 als Ausgang

OP #6273442
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
OP #6273710
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
#6273788
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.

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.