Forum: Mikrocontroller und Digitale Elektronik einfacher PIC Einstieg


von Gisti (Gast)


Lesenswert?

Hallo,

ich beschäftige mich kürzlich mit dem PIC 24E USB Starterkit und habe 
erstmal versucht LEDs zum leuchten zu bringen.

Dies hat auch funktioniert, nur das Abfragen der Taster funktioniert 
nicht wie gewünscht. Wie im Forum schon mal beschrieben kann es auch nix 
mit der "Analogpin-Falle" zu tun haben, da die PIN kein ANI sind, also 
digitale Ausgänge sein müssten. Bin Anfänger vermute mal, dass der 
Fehler einfach zu finden ist, aber ich komme nicht drauf :(

Hier mal der kurze Code:

#include <p24EP512GU810.h>


#define OUTPUT 0
#define INPUT 1
#define LED_AN 1
#define LED_AUS 0

int main(void) {





    TRISDbits.TRISD0 = OUTPUT;
    LATDbits.LATD0 = LED_AN;

    Nop();
    Nop();
    Nop();

    TRISDbits.TRISD6 = INPUT; // Taster auf INPUT setzen

    while (1) {
        if (PORTDbits.RD6 == 0)
            {LATDbits.LATD0 = LED_AUS;}
        else
            {LATDbits.LATD0 = LED_AN;}


    }
}

Laut Datenblatt sind die Taster wenn "idle: pulled high" und wenn 
"pressed: grounded". Ich hätte also erwartet, dass die LED blinkt und 
bei drücken des Tasters erlischt. Das Ergebnis ist, dass die LED GAR 
nicht leuchtet. Erst wenn ich die Anweisung in der Endlosschleife 
auskommentiere leuchtet SIe wieder.

Gruss

von Alex (Gast)


Lesenswert?

Musst du nicht den Pullup erst aktivieren?

von Alex (Gast)


Lesenswert?

Du musst es ja wissen...es sind also externe pull-ups? Ich kenne das 
board nicht.
Hab aber auch keine große Lust mehr zu helfen

von Gisti (Gast)


Lesenswert?

den oberen Eintrag habe ich definitiv nicht geschrieben!

von Gisti (Gast)


Lesenswert?

Sorry Alex,
den Eintrag hat wohl irgend nen Witzbold geschrieben! Ich jedenfall 
nicht!

von Alex (Gast)


Lesenswert?

Ok, dann schau dir mal die CNPUx und CNPDx register an. Vielleicht musst 
du sie auch noch global aktivieren.
Habe bisher nur einen einzigen PIC programmiert, dort war es nötig 
(pic12lf1501)
Im Datenblatt solltest du ja alles finden

von Xx (Gast)


Lesenswert?

Gisti schrieb:
> Erst wenn ich die Anweisung in der Endlosschleife
> auskommentiere leuchtet SIe wieder.


Welche Anweisung kommentierst du aus?

Da deine Led ja vorher ging kann es nur am Eingang liegen

Da sind beim Pic mehrere Funktionen multiplexed.

Angewöhnt habe ich mir da erst sämtliche Funktionen zu prüfen ob Sie das 
einlesen als normalen Input verhindern.

1. Beim Taster auf RD6 sind das PMPD14 und CN15.

2. An RD6 am uP steht noch C3INB und siehr da:

3. C3INB ist lt Pinout description der 2 Eingang des comparators nummer 
3

4. Comparatoren sind analoge Funktionen die nach power on und reset 
sinnvollerweise aktiv sind.

5. Also: prüfen ob comparator 3 disabled

von Gisti (Gast)


Lesenswert?

OK vielen Dank schon mal!

Am RD7 hängt in der Tat noch  C3IN2-, also Comparator 3. Dies erklärt 
auch warum das Programm mit Taster RD13 reibungslos funktioniert, da 
dort kein Comparator angeschlossen ist.

Den Comparator 3 disablen funktioniert mit dem COMPARATOR x CONTROL 
REGISTER CMxCON, wobei das CON Bit auf 0 gesetzt werden muss (also 
disabled).

Wenn genau sähe jetzt der Programmcode aus? Wie gesagt bin Anfänger.

Es muss ja in etwas dies hier implementiert werden:

CM3CONBITS.CON = 0;

Mit diesem Code leuchtet die LED wiederum gar nicht und erst wenn ich

//if (PORTDbits.RD6 == 0)
            //{LATDbits.LATD0 = LED_AUS;}
        //else
            //{LATDbits.LATD0 = LED_AN;}

in der Endlosschleife wieder auskommentiere leuchtet LED1 wieder.

Wie gesagt mit LED3, also Taster RD13 funktioniert es wunderbar.

Meine Frage also nach dem korrekten Code um den Komparator 3 (bzw. nur 
C2IN2-) zu disablen??? Muss ich wenn ich dieses Regsiter nutze noch 
Comparator.h includen?

Danke!

von Xx (Gast)


Lesenswert?

Gisti schrieb:
> OK vielen Dank schon mal!

Gern

> Am RD7 hängt in der Tat noch  C3IN2-, also Comparator 3. Dies erklärt
> auch warum das Programm mit Taster RD13 reibungslos funktioniert, da
> dort kein Comparator angeschlossen ist.

das ist bei PIC so
>
> Den Comparator 3 disablen funktioniert mit dem COMPARATOR x CONTROL
> REGISTER CMxCON, wobei das CON Bit auf 0 gesetzt werden muss (also
> disabled). ...

Eine Vermutung die

> Mit diesem Code leuchtet die LED wiederum gar nicht und erst wenn ich

offenkundig falsch ist



>
> //if (PORTDbits.RD6 == 0)
>             //{LATDbits.LATD0 = LED_AUS;}
>         //else
>             //{LATDbits.LATD0 = LED_AN;}
>
> in der Endlosschleife wieder auskommentiere leuchtet LED1 wieder.

da Sie ja vorher eingeschaltet wird.


>
> Wie gesagt mit LED3, also Taster RD13 funktioniert es wunderbar.

Was zeigt das der C-code korrekt ist. Damit kann es nur mit dem Port Pin 
zu tun haben.


>
> Meine Frage also nach dem korrekten Code um den Komparator 3 (bzw. nur
> C2IN2-) zu disablen??? Muss ich wenn ich dieses Regsiter nutze noch
> Comparator.h includen?

Nein, die Register werden imho in p24xyz.h vollständig beschrieben, 
alles andere ist unnötig. Der bessere Ansatz: Erstmal keine neue 
Baustelle aufzumachen.

Dein Code funzt bei anderen Ports, das "disablen" hat so erstmal nichts 
gebracht und es liegt auch keine andere Funktion auf diesem Port. Da 
muss noch etwas anderes falsch sein.


>
> Danke!

Gern, auch wenn das jetzt keine große Hilfe ist da ich den Pic24 nicht 
kenne.

von Michael .. (gismi)


Lesenswert?

Du musst den eingangs-Pin noch auf Digital schalten.
http://ww1.microchip.com/downloads/en/DeviceDoc/70616g.pdf
11.2
The ANSELx register has a default value of 0xFFFF;
therefore, all pins that share analog functions are
analog (not digital) by default.

von Sebastian H. (technik_freak)


Lesenswert?

Hallo,

Ich habe eben den Schaltplan vom Board angeschaut und habe eine 
Vermutung:

Die Taster werden über einen weiteren Regler Ein und Aus geschaltet. 
Dieser Pin wird via PullDown abgeschaltet (Enable). Welche Spannung 
liegt bei deinen Tastern an?

Meine Vermutung: Je nachdem, wie der Pin F1 initialisiert wird, kann es 
sein, dass dein Programm mal mit dem Eingang funktioniert und mal nicht.

Da die Pins der Taster digital sind (hattest Du ja schon geschrieben => 
Analog-Falle), kann es sonst nur sein, dass die Probleme durch interne 
PullUp kommen, die ausgeschaltet wurden.

Füge einmal in deinen Code ein, dass F1 eingeschaltet werden soll 
(digital-Output).

von Gisti (Gast)


Lesenswert?

Vielen Dank bei Allen nochmal fr die freundliche Hilfe.
Das manche PINs erst auf digital umgestellt werden müssen war mir 
durchaus beweusst. Da im Datenblatt bei RD6 und RD7 jedoch nichts von AN 
steht bin ich davon ausgegangen dass es sich um reine digital PINs 
handelt und erst bei der Durchfortsung der REGISTER MAP von PORTD bin 
ich auf ANSD7 bzw. ANSD6 gestossen. Funktioniert jetzt wie gewünscht.

Letzte Frage: ich will gerne mit Delays arbeiten.
z.B. Delay1KTCYx(1000)

Dachte ich müßte nur include "delay.h" mit einbeziehen und es würde 
funktionieren.

Leider meckert der COMPILER.

Wie binde ich die Library richtig ein?


Gruss

von Gisti (Gast)


Lesenswert?

Danke auch Dir Sebastian für deine Mühen!

von Chris B. (dekatz)


Lesenswert?

Gisti schrieb:
> Letzte Frage: ich will gerne mit Delays arbeiten.
> z.B. Delay1KTCYx(1000)

C30 und XC16 kennen keine <Delay1KTCYx(1000)> (uns selbst wenn, ist das 
ne Krücke!)

Die Takfrequenz muss definiert werden und die Lib eingebunden werden 
(unbedingt FCY vor der Lib definieren):

#define FCY  8000000UL
#include <libpic30.h>

Es gibt 3 Funktionen
__delay_32(unsigned long cycles)
__delay_ms(unsigned int time)
__delay_us(unsigned int time)

Genaueres im "16-Bit Language Tools Libraries Manuaol"...

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.