Trivialprogramm für PIC16F1936 - Was mache ich falsch?

Gast #2342015
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?
#2342035
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?
Gast #2342123
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.
#2342280
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.
Gast #2343224
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.
Gast #2343248
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
Gast #2343272
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.
Gast #2343279
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren