Forum: Mikrocontroller und Digitale Elektronik Trivialprogramm für PIC16F1936 - Was mache ich falsch?


von moyamu (Gast)


Lesenswert?

Hallo,
ich habe ein Problem mit einem PIC16F1936, der nicht tut was er soll. 
Inzwischen habe ich mein Programm auf folgendes gekürzt:
1
#include <p16f1936.inc>
2
    __config _CONFIG1, (_FOSC_INTOSC & _CLKOUTEN_OFF & _WDTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF ) & H'3fff'
3
    __config _CONFIG2, (_WRT_OFF & _VCAPEN_RA0 & _LVP_OFF) & H'3fff'
4
    org 0
5
    BANKSEL     TRISC
6
    clrf        TRISC
7
    BANKSEL     LATC
8
    clrf        LATC
9
Loop:
10
    comf        LATC,F
11
    goto        Loop
12
    end
Der PIC ist wie folgt beschaltet:
- Pin 8 und 19 (Vss) an Masse
- Pin 20 (Vdd) an +5V
- Pin 1 (MCLR): 10kΩ an +5V
- Pin 2 (RA0): 100nF an Masse
alle anderen Pins sind offen.

Das Programmieren mit dem PICKit2 funktioniert ohne Fehler. Nach dem 
Einschalten sehe ich den Takt auf Pin 10 (CLKOUT) und hätte erwartet, 
auch auf Port C ein Rechtecksignal zu sehen. Tatsächlich sind alle 
I/O-Pins aber low, es passiert gar nichts.

Was mache ich falsch?

von Carsten M. (ccp1con)


Lesenswert?

Ohne das ich jetzt genauer hingeschaut habe, aber bei vielen PICs sind 
die Ports als analog konfiguriert. Du musst sie vorher auf digital 
umschalten.
Such mal im Datenblatt nach einem Register das ANSEL oder so ähnlich 
heißt.

Ich sehe gerade PORTC ist nicht davon betroffen.

Versuch mal comf LATC, 1

Welchen Wert hat F in deinem Fall?

von Kevin (Gast)


Lesenswert?

Gib den offenen Pins einen definierten Zustand.

von portpin (Gast)


Lesenswert?

Könnte ein "read modify write" Problem sein, da die Loop nur eine 
einzige Zeile mit hohem Tempo ausführt. D.h. das entsprechende Register 
wird schon wieder ausgelesen, obwohl es noch gar nicht den definierten 
Zustand hat.
Die Loop testweise etwas verlangsamen liefert die Antwort, ob es daran 
liegt.

von Michael S. (rbs_phoenix)


Lesenswert?

Carsten H. schrieb:
> Ohne das ich jetzt genauer hingeschaut habe, aber bei vielen PICs sind
> die Ports als analog konfiguriert. Du musst sie vorher auf digital
> umschalten.
> Such mal im Datenblatt nach einem Register das ANSEL oder so ähnlich
> heißt.

Bei als Ausgang definierten Pins aber nicht. Da ist es eher das 
CCP-Modul bzw Komparator-Modul meine ich.

von Carsten M. (ccp1con)


Lesenswert?

> Bei als Ausgang definierten Pins aber nicht. Da ist es eher das
> CCP-Modul bzw Komparator-Modul meine ich.

doch glaube schon, aber:

> Ich sehe gerade PORTC ist nicht davon betroffen.

Bei diesem PIC hag Port C keine analogen Pins.

Ich denke es liegt am Wert von F.
F wird sicherlich 0 sein und damit heißt seine Anweisung
comf LATC, 0
Das Ergebnis wird dann im Arbeitsregister W gespeichert. Die 
Speicherzelle bleibt unverändert.

von Michael S. (rbs_phoenix)


Lesenswert?

Ansich sollte "f" immer als "1" definiert sein, war bei mir jedenfalls 
bisher immer so. Zur Sicherheit probier mal mit 1 direkt. Zudem auch wie 
schon erwähnt die Schleife verlängern bzw eine wartefunktion mit 
reinpacken.

Messen tust du aber an jedem Pin oder nur an dem gleichen?

von Carsten M. (ccp1con)


Lesenswert?

> Ansich sollte "f" immer als "1" definiert sein

Ja mein Fehler F=1

von moyamu (Gast)


Lesenswert?

Erst 'mal danke für die vielen Hinweise, die mir aber leider nicht 
geholfen haben.

>Gib den offenen Pins einen definierten Zustand.
Mein ursprüngliches Programm hatte alle Ports als digital output 
konfiguriert, d.h. bis auf Spannungsversorgung und MCLR (Pin 1) ist da 
nichts undefiniert. Das hat aber nichts verändert.


>Könnte ein "read modify write" Problem sein, da die Loop nur eine
>einzige Zeile mit hohem Tempo ausführt. D.h. das entsprechende Register
>wird schon wieder ausgelesen, obwohl es noch gar nicht den definierten
>Zustand hat.
>Die Loop testweise etwas verlangsamen liefert die Antwort, ob es daran
>liegt.
Hat nichts geändert. Das hätte mich auch gewundert, denn laut Datenblatt 
ist der neue Wert ca. 1/2 Takt nach Ausführung des writes am Pin 
sichtbar. Und die Schleife ist immerhin 3 Takte lang.


>Bei als Ausgang definierten Pins aber nicht. Da ist es eher das
>CCP-Modul bzw Komparator-Modul meine ich.
Stimmt, die Pins sind alle mehrfach genutzt. Bei Port C zum Beispiel für 
LCD, CCP, T1OSC, MSSP u.a. Laut Datenblatt sind die ganzen 
Spezialfunktionen nach POR aber erstmal ausgeschaltet. D.h. man 
initialisert den Port und kann direkt damit arbeiten. So kenne ich es 
jedenfalls von diversen anderen PICs.


>Ansich sollte "f" immer als "1" definiert sein, war bei mir jedenfalls
>bisher immer so. Zur Sicherheit probier mal mit 1 direkt. Zudem auch wie
>schon erwähnt die Schleife verlängern bzw eine wartefunktion mit
>reinpacken.
>Messen tust du aber an jedem Pin oder nur an dem gleichen?
F ist 1, habe ich kontrolliert. Und gemessen habe ich alle Pins. Port A 
und B funktionieren übrigens auch nicht.

von wr7 (Gast)


Lesenswert?

Datenblatt S.129

    banksel   PORTA
    clrf      PORTA
    banksel   LATA
    clrf      LATA
    banksel   TRISA
    clrf      TRISA

Genau so würde ich es erst mal machen, nur mit PORTC, LATC und TRISC

Und dann, falls COMF weiter nicht geht, dann halt weiter mit

    banksel   LATC
    movlw     0x00
    movwf     LATC
    movlw     0xff
    movwf     LATC

von Carsten M. (ccp1con)


Lesenswert?

> sehe ich den Takt auf Pin 10 (CLKOUT)

wundert mich eigentlich, du hast _CLKOUTEN_OFF!
Vielleicht ist ja auch _WDTE_OFF nicht geschaltet und der chip hängt im 
Reset.

> ...) & H'3fff'
ist das normal bei diesem PIC? muß das so?

von moyamu (Gast)


Lesenswert?

Gerade schaue ich mir nochmal das .lst-File an und plötzlich wird alles 
klar. Der Assembler - ich benutze den gpasm 0.13.7 unter Linux - 
generiert falschen Code! Aus den BANKSEL-Anweisungen macht er 
bsf/bcf-Operationen für das STATUS-Register, so wie man das bei den 
Standard-8-Bit-PICs kennt. Der 16F1936 hat dafür aber eine eigene 
Anweisung (movlb).

Mit den richtigen Werten im BSR funktionieren nun auch die Ports.

Jetzt werde ich wohl doch 'mal versuchen, den Microchip-Assembler unter 
wine zu verwenden. Angeblich geht das ja.

von moyamu (Gast)


Lesenswert?

Carsten H. schrieb:
> wundert mich eigentlich, du hast _CLKOUTEN_OFF!
> Vielleicht ist ja auch _WDTE_OFF nicht geschaltet und der chip hängt im
> Reset.

Frag mich nicht warum, aber die Bits sind in der Includedatei von 
Microchip so definiert:
1
_CLKOUTEN_OFF  EQU  H'F7FF' ;CLKOUT function is enabled on RA6/CLKOUT pin
2
_CLKOUTEN_ON   EQU  H'FFFF' ;CLKOUT function is disabled.

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.