Forum: Mikrocontroller und Digitale Elektronik dspic33 IOs wollen nicht


von Josch (Gast)


Lesenswert?

Hallo,

da ich auch mal mit den PICs arbeiten wollte, habe ich mir einen 
dsPIC33FJ128GP802 und einen pickit3 gekauft.

Ich habe das ganze auf meinem Steckbrett aufgebaut und der Programmer 
kann mein device löschen, programmieren etc.

In MPLAB X habe ich nun ein ganz einfaches Testprogramm. Der Ausgang RA4 
sollte meiner Meinung nach dem Ausführen High sein. Ist er aber leider 
nicht.

Was ist an diesen wenigen Zeilen falsch? Oszilloskop und LED zeigen ein 
LOW an.
1
#include <xc.h>
2
3
void main(void) {
4
    TRISA = 0;
5
    ODCA = 0;
6
    LATA = 0xFF;
7
    PORTA = 0xFF;
8
    while(1);
9
}

von Peter C. (peter_c49)


Lesenswert?

Hallo Josch,

schau mal in das Datenblatt.
AD1PCFGL: ADC1 PORT CONFIGURATION REGISTER LOW

Die sind default dem AnalogModul zugeordnet.

btw:

>LATA = 0xFF;
Das wird zum SCHREIBEN auf eine PORT benutzt!

>PORTA = 0xFF;
Das sollte zum LESEN von einem PORT benuzt werden, somit hier unsinn.


denke das es bei deinem dsPIC33 das auch so wie unten configuriert wird.

AD1PCFGLbits.PCFG4 = 0 ;  // Analog PIN, default!

AD1PCFGLbits.PCFG4 = 1 ;  // Digital PIN <= Das solltest du nehmen.

mfG
Peter ;-)

von Josch (Gast)


Lesenswert?

Ich habe auch einen PIC18F14K22 hier. Laut MPLAB lässt sich dieser auch 
programmieren, erasen etc. Im Beispielcode zum LED blinken befindet sich 
folgender Code, der leider auch nichts tut. Hier wird auch mit PORTB und 
nicht mit LATB gearbeitet. Laut Datenblatt wird mit PORTB = x; auch das 
Latch geschrieben.
1
#include <xc.h>
2
3
void delay();
4
5
void delay() {
6
    int counter = 0;
7
    for (counter = 0; counter<10000; counter++) {
8
        ;
9
    }
10
}
11
12
void main(void) {
13
    TRISB = 0;
14
15
    while (1) {
16
        PORTB = 0xFF;
17
18
        delay();
19
20
        PORTB = 0x00;
21
22
        delay();
23
    }
24
}

von Reinhard (gotbread)


Lesenswert?

Laut Diagramm hat Schreibzugriff auf PORT den
selben Effekt wie auf LAT, man sollte aber
dennoch LAT verwenden.

Ich habe hier einen dsPIC33EP256MU806, folgender
code funktioniert für eine LED:
1
int main()
2
{
3
    TRISEbits.TRISE7 = 0;
4
    for (;;)
5
    {
6
        __delay_ms(50);
7
        LATEbits.LATE7 = ~LATEbits.LATE7;
8
    }
9
}

Datenblatt sagt, input ohne AD1PCFGL zu ändern geht nicht,
schreiben sollte aber gehen, auch wenn nicht empfohlen.

Stelle auch sicher dass an allen VDDs und AVDDs Spannung
anliegt, sowie Vcap ein Kondensator hat.

von Johannes R. (oa625)


Lesenswert?

Reinhard S. schrieb:
> Laut Diagramm hat Schreibzugriff auf PORT den
> selben Effekt wie auf LAT

Stimmt prinzipiell, ABER:
Das Schreiben auf einen PORT erfolgt immer als Read-Modify-Write. Es 
wird also immer zuerst der Zustand am Port gelesen und danach geändert.
In Deinem Fall ist es egal, ob da LATx oder PORTx steht.
Wenn aber ein/mehrere Portpin/s durch äußere Beschaltung bzw. 
Kurzschluss  "gewaltsam" auf den falschen Pegel gezogen werden, dann 
führt

   LATx = NOT LATx

 zum richtigen Ergebnis, während

  PORTx = NOT PORTx
 vom Zustand der Portpins abhängig ist.

Gruß
JRo

: Bearbeitet durch User
von Josch (Gast)


Lesenswert?

Leider tut sich immernoch nichts. Vom PIC18 (oben erwähnt) habe ich VDD 
mit 3,3V und VSS mit GND verbunden (3.3V kommt aus dem Netzteil). An VDD 
noch den obligatorischen 100nF gegen Masse und an MCLR einen Pullup 20k.

MPLAB kann den Chip erkennen, erasen und programmieren. Die LED ist mit 
Vorwiderstand an RB7 angeschlossen. Lege ich den Widerstand kurz an 
3.3V, dann leuchtet die LED. Auf dem Oszilloskop und LED ist an RB7 
nichts zu sehen, immer LOW.

Mit dem Beispielcode oben (20.01.2018 18:15) hätte ich erwartet, dass 
die LED blinken würde. Auch unterschiedliche Frequenzen vom delay führen 
keine Änderung herbei.

Irgendwas übersehe ich, aber was?

von Reinhard (gotbread)


Lesenswert?

Miss mal was an MCLR anliegt. Vllt ist der
Pullup zu groß. Ab und zu zieht mein Pickit3
auch den MCLR auf Masse, auch außerhalb des
programmierens.

von Josch (Gast)


Lesenswert?

Die Spannung an MCLR ist nach dem Programmieren auf HIGH.

von Frank K. (fchk)


Lesenswert?

Josch schrieb:
[...]

1. In der Initialisierung fehlt:
1
ANSEL=0xff;
2
ANSELH=0xff;
Dieser Schritt ist bei fast allen PICs notwendig.

2. Statt PORTB LATB verwenden.

Dann sollte es funktionieren.

fchk

: Bearbeitet durch User
von Axel H. (axhieb)


Lesenswert?

hast du die Configbits richtig gesetzt?

ich kann mich erinnern, dass ich mit dem Clock bei den dsPIC33xxxxxx 
Probleme hatte. Du kannst in den Config Bits das Clock-Signal auf einen 
externen Pin legen und dann mit dem Oszilloskop schauen ob sich da was 
tut.

: Bearbeitet durch User
von Klaus (Gast)


Lesenswert?

Läuft der der PIC (egal welcher) im Debugger? Kann man durchs Programm 
steppen?

MfG Klaus

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.