Forum: Mikrocontroller und Digitale Elektronik PIC33F.analog to digital konfiguration


von Chris (Gast)


Lesenswert?

Hallo,

als erstes, ich bin relativ neu beim PIC-programmieren, also seid bitte 
ein wenig nachsichtig, falls ich einen groben Schnitzer gemacht habe 
;-).

Ich habe folgendes Problem:
Ich verwende einen PIC33FJ16GS404
Ich möchte gerne den PIN2 von PORTB als digitalen Ausgang verwenden.
Nach einiger Zeit suche im Datenblatt wurde ich dann auch fündig.
Dort hieß es, man muss das Register ADPCFG auf 1 setzen um diesen Pin 
als digitalen verwenden zu können. Ebenso habe ich mein TRISB Register 
auf 0 gesetzt => Ausgang
Hier im Code: (andere Ports auch Initialisiert)
(ist in der Funktion INIT enthalten)
1
/*Initialisieren der Ports*/
2
ADPCFG = 0xFFFF;                                 //Alle Ports auf Digital
3
4
TRISA = 0x00;                                   /*Ein- und Ausgänge festlegen*/
5
LATA = 0x0000;                                 /*Alles auf 0 Setzen*/
6
7
TRISB = 0x7810;                                 /*Ein- und Ausgänge festlegen*/
8
LATB = 0x0000;                                 /*Alles auf 0 Setzen*/
9
10
TRISC = 0x2278;                                 /*Ein- und Ausgänge festlegen*/
11
LATC = 0x0000;                                 /*Alles auf 0 Setzen*/


In meiner Main lasse ich den Pin zum testen toggeln:
1
int main(void) 
2
{
3
 INIT();                                      //Funktion Initialisierung aufrufen
4
 while(1)
5
    {
6
            LATBbits.LATB2 = 0;
7
            __delay_ms(500);
8
            LATBbits.LATB2 = 1;
9
            __delay_ms(500);
10
            
11
    }
12
return (0);                                     //Programmende
13
}

Jetzt habe ich das Problem, dass mein RB2 dauerhaft 1,5V ausgibt, so 
bald ich im Register ADPCFG = 0xFFFF; eingebe.
Bei anderen Ports, die nicht standartmäßig analog sind, funktioniert das 
einwandfrei.

Muss ich noch irgendwo ein Register beachten?

von Rumburak (Gast)


Lesenswert?

Hallo Forist,

wenn Du den PortB-Pin2 toggeln läßt gibt der eine Rechteckspannung aus. 
Dein Spannungsmeßgerät (Analog) ist zu träge diesem Verlauf zu messen. 
Der DSPIC33 arbeitet so um die 3,3V bei 50:50 PWM kann man das 
arithmetische Mittel von 1,5V am Ausgang messen. Was ist also falsch.

Dann kommentier die Delayfunktion aus und lass nur LATBbits.LATB2 = 1; 
in der Whileschleife laufen. Dann sollte der PortBpin2 immer als Ausgang 
High gesetzt sein.

Mit freundlichen Grüßen

von Rumburak (Gast)


Lesenswert?

Hallo Forist,

der PORTBpin2 ist ein reiner digitaler Ein/Ausgang. Bei Ports mit 
zusätzlichen Analogeingang müssen im  "ADPCFG: ANALOG-TO-DI
GITAL PORT CONFIGURATION REGISTER" definiert werden ob man 
Analog-Eingang oder Digital I/O verwendet. Das trifft aber auf diesen 
PORTBpin2 nicht zu!

Mit freundlichen Grüßen

von Chris (Gast)


Angehängte Dateien:

Lesenswert?

Vielen Dank Rumburak,

"wenn Du den PortB-Pin2 toggeln läßt gibt der eine Rechteckspannung aus.
Dein Spannungsmeßgerät (Analog) ist zu träge diesem Verlauf zu messen.
Der DSPIC33 arbeitet so um die 3,3V bei 50:50 PWM kann man das
arithmetische Mittel von 1,5V am Ausgang messen. Was ist also falsch.

Dann kommentier die Delayfunktion aus und lass nur LATBbits.LATB2 = 1;
in der Whileschleife laufen. Dann sollte der PortBpin2 immer als Ausgang
High gesetzt sein."

Ich habe das Toggeln auch mit anderen Pins versucht. Hier konnte ich an 
meinem Spannungsmessgerät die Sprünge von 0 auf 3,3V und umgekehrt gut 
beobachten. Bei meinem Pin 2 war eine konstante Spannung von ca1,5V 
vorhanden.

"der PORTBpin2 ist ein reiner digitaler Ein/Ausgang. Bei Ports mit
zusätzlichen Analogeingang müssen im  "ADPCFG: ANALOG-TO-DI
GITAL PORT CONFIGURATION REGISTER" definiert werden ob man
Analog-Eingang oder Digital I/O verwendet. Das trifft aber auf diesen
PORTBpin2 nicht zu!"

Mein PORTpin2 (RB2) ist KEIN reiner digitaler Ausgang, sondern ist der 
Analoge Pin AN7. (siehe Bild im Anhang) Wie du in meinem Beitrag oben 
sehen kannst, habe ich im Register ADPCFG alle Pins als Digital 
eingestellt.(unter anderem auch meinen PIN2 vom PortB)
Hat keiner eine Idee/Lösung für mich?

von Torsten S. (torstensc)


Lesenswert?

Schau mal nach, ob der PIN wirklich die 3,3V treiben kann. Nicht das das 
ein OC ist wo nur ein Pullup aktiv ist. Manchmal gab es sowas. Oder es 
kollidiert irgendwas mit dem OSC. Zum Bsp. Clockout aktiviert?

von Klaus (Gast)


Lesenswert?

Rumburak schrieb:
> der PORTBpin2 ist ein reiner digitaler Ein/Ausgang.

Ich kenne diesen speziellen µC nicht, weiß also nicht, ob das stimmt. Da 
ich häufig zu faul bin, das nachzuschlagen, lass ich mir vom Compiler 
helfen.

Chris schrieb:
> /*Initialisieren der Ports*/
> ADPCFG = 0xFFFF;                                 //Alle Ports auf
> Digital
>
> TRISA = 0x00;                                   /*Ein- und Ausgänge
> festlegen*/
> LATA = 0x0000;                                 /*Alles auf 0 Setzen*/
>

Statt immer ganze Register zu setzen, setze ich die entsprechenden Bits 
für jeden Portpin einzeln. Die entsprechenden Macros sind in den 
Headerfiles ja vorhanden.

Chris schrieb:
> Ich möchte gerne den PIN2 von PORTB als digitalen Ausgang verwenden.
1
_TRISB2 = 0;
2
_LATB2 = 0;
3
_ANSB2 = 1;
Wenn es dann den Port nicht als analogen Eingang gibt, meldet sich der 
Compiler, weil es _ANSB2 dann auch nicht gibt. Das mache ich auch für 
die anderen Optionen wie Pullups etc. Das hilft einem dann auch, wenn 
man mal den µC wechselt.

MfG Klaus

von Chris B. (dekatz)


Lesenswert?

RB2 ist auch der OSC2 Ausgang an dem der Controllerclock ausgegeben wird 
und ist defaultmäßig aktiv.
Füge mal im Source
1
#pragma config OSCIOFNC = ON
(oder wie es beim verwendeten Compiler eben gehandhabt wird) ein, damit 
wird die "OSC2 clock out" Funktion abgeschaltet.

von Chris (Gast)


Lesenswert?

>"RB2 ist auch der OSC2 Ausgang an dem der Controllerclock ausgegeben wird
>und ist defaultmäßig aktiv.
>Füge mal im Source

>#pragma config OSCIOFNC = ON

>(oder wie es beim verwendeten Compiler eben gehandhabt wird) ein, damit
>wird die "OSC2 clock out" Funktion abgeschaltet."

Danke! Hat geklappt....
Ich finde es etwas verwirrend, dass die clock bei OFF aktiv ist und bei 
ON abgeschalten ist :-) Wie auch immer... so funktioniert es! Danke!

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.