Forum: Mikrocontroller und Digitale Elektronik PIC 10F202 I/O Problem


von Mirko (Gast)


Angehängte Dateien:

Lesenswert?

Guten Morgen,

ich habe das Problem, dass ich es bisher noch nicht geschafft habe ein 
HIGH auf den PINs GP1 und GP2 auszugeben. Das Oszi sagt mir immer nur 
600 mV und 180 mV bei einer Betriebsspannung von 4.7 V.

Im Anhang habe ich den Quellcode meines simplen Testprogramms eingefügt.

Muss ich den ADC explizit ausschalten? Wenn ja, wie geht das beim PIC 
10F202? Habe vorher mit dem PIC 16F680 gearbeitet und ANSEL o.ä. 
funktioniert beim kleinen Bruder leider nicht.


Gruß Mirko

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Lesenswert?

Zum Einen würde ich die Anweisung GPIO = 0b0110 nicht in die 
while()-Schleife schreiben, sondern davor. Zum Anderen setzt du mit 
TRISGPIO = 0b1001 die Pins 1 und 2 auf Out und nicht 1 und 3...

von Mirko (Gast)


Angehängte Dateien:

Lesenswert?

Danke für die schnelle Rückmeldung.

Im Quellcode soll es natürlich GP1 und GP 2 heißen.
Nun der aktuelle Code
1
#include <pic.h>
2
3
4
void init(void);  
5
6
void main(void)
7
{
8
  init();
9
  while(1)
10
  {
11
        GPIO = 0b0110;   
12
  }/*while*/
13
}/*main*/
14
15
void init(void)
16
{
17
18
  __CONFIG(WDTDIS  & MCLRDIS & UNPROTECT);
19
20
21
  GPIO  = 0;                                    //  Alle Bits der PINs auf LOW setzen
22
  TRISGPIO = 0b1001;                            //  GP1 und GP2 als Ausgaenge definieren
23
  // GP3 ist input only !!!
24
  //TRISGPIO = 1 -> Eingang 
25
  //TRISGPIO = 0 -> Ausgang
26
}/*init*/

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Lesenswert?

So, habe mir das Datenblatt angeschaut.

1. Musst du im Option-Register bit5 = 0 setzen (Timer Clock Source 
Select)
=> OPTION = 0b11011111;
2. Musst du im CMCON-Register (Comparator Control) bit3 = 0 setzen
=> CMCON = 0b11110111;

Dann sollte es klappen...

von Mick M. (mick-mac)


Lesenswert?

Hallo Alex,

ich habe deinen Ratschlag befolgt.
Den Comparator kann ich aber nicht setzen, da der PIC 10F202 gar keinen 
besitzt.
OPTION habe ich gesetzt, das gewünschte Ergebnis ist leider 
ausgeblieben.

Muss ich vorher noch etwas an CONFIG-Bits setzen?


Mein aktueller Quellcode:
1
void init(void);  
2
3
void main(void)
4
{
5
  init();
6
  GPIO = 0b0110;  
7
}/*main*/
8
9
void init(void)
10
{
11
  __CONFIG(WDTDIS  & MCLRDIS & UNPROTECT);
12
  //GPIO  = 0;                                    //  Alle Bits der PINs auf LOW setzen
13
  TRISGPIO = 0b000110;                            //  GP1 und GP3 als Ausgaenge definieren
14
  // GP3 ist input only !!!
15
  //TRISGPIO = 1 -> Eingang 
16
  //TRISGPIO = 0 -> Ausgang
17
  OPTION = 0b11011111;
18
  //CMCON = 0b11110111;
19
}/*init*/

von Alex22 (Gast)


Lesenswert?

In deiner main()

musst (!) du auf jeden Fall eine while(1)-Schleife einfügen! 
Entschuldige, ich dachte das sei klar...

>void main(void)
>{
>  init();
>  GPIO = 0b0110;
   while(1);
>}/*main*/

von Alex22 (Gast)


Lesenswert?

Und mit deinem
>TRISGPIO = 0b000110;

(warum eigentlich 6bit ?? Es ist ein 8bit Register)
definierst du die Pins 0 und 3 als Ausgänge, nicht aber 1 und 2.



Mit
>GPIO = 0b0110;

wiederum schaltest du die Pins 1 und 2 auf logisch 1, was aber nicht 
möglich ist, da es sich um Eingänge handelt...

Also welche Pins möchtest du jetzt als Ausgänge und welche als Eingänge 
haben?!

Schöne Grüße,
Alex

von Mick M. (mick-mac)


Lesenswert?

Hallo Alex,

also ich möchte GP0 und GP3 als Eingänge schalten und GP1 und GP2 als 
Ausgänge.
Ich werde jetzt schnell meinen Code überarbeiten und eine Rückmeldung 
geben.

Vielen dank für die bereits geleistete Hilfe!


NACHTRAG:

Ich habe jetzt meinen Code umgeschrieben. Bekomme leider immer noch 
nicht das gewünschte Ergebnis.
Zu dem TRISGPIO-Register, ich habe hier im Forum gelesen das 1 = Eingang 
und 0 = Ausgang bedeutet.

1
void init(void);  
2
3
void main(void)
4
{
5
  init();
6
  GPIO = 0b00000110;  
7
  while(1);
8
}/*main*/
9
10
void init(void)
11
{
12
  __CONFIG(WDTDIS & MCLRDIS & UNPROTECT);
13
  //GPIO  = 0;                                    //  Alle Bits der PINs auf LOW setzen
14
  TRISGPIO = 0b00000110;                            //  GP1 und GP3 als Ausgaenge definieren
15
  // GP3 ist input only !!!
16
  //TRISGPIO = 0 -> Eingang 
17
  //TRISGPIO = 1 -> Ausgang
18
  OPTION = 0b11011111;
19
  //CMCON0 = 0b11110111;
20
}/*init*/

von Mick M. (mick-mac)


Lesenswert?

das komische ist, dass ich konstatnt auf GP2 ein HIGH Pegel habe, egal 
ob ich nun wie oben im Quellcode GP1 und GP2 auf HIGH setzen ODER alle 
Ports auf 0.

Hier der Code dazu:
1
void init(void);  
2
3
void main(void)
4
{
5
  init();
6
  GPIO = 0b00000000;  
7
  while(1);
8
}/*main*/
9
10
void init(void)
11
{
12
  __CONFIG(WDTDIS & MCLRDIS & UNPROTECT);
13
  //GPIO  = 0;                                    //  Alle Bits der PINs auf LOW setzen
14
  TRISGPIO = 0b00000000;                            //  GP1 und GP3 als Ausgaenge definieren
15
  // GP3 ist input only !!!
16
  //TRISGPIO = 0 -> Eingang 
17
  //TRISGPIO = 1 -> Ausgang
18
  OPTION = 0b11011111;
19
  //CMCON0 = 0b11110111;
20
}/*init*/

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Lesenswert?

Hallo Mirko,

das ist wirklich eigenartig. Ich sehe den Fehler dort jetzt auch nicht 
mehr, hätte gedacht das es so funktioniert...
Wird die while(1)-Schleife von deinem Compiler eventuell weg-optimiert? 
(Welchen Compiler verwendest du?)

Versuch vielleicht mal wirklich alles auf der Minimum zu beschränken:
1
__CONFIG(WDTDIS & MCLRDIS & UNPROTECT);
2
3
void main(void)
4
{
5
  OPTION = 0b11011111;
6
  TRISGPIO = 0b00000000;
7
  GPIO = 0b00000000;  
8
  while(1);
9
}/*main*/
Das sollte doch alle Pins zu Outputs machen und diese auf 0V setzen 
(außer GPIO3 natürlich).

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Lesenswert?

Also fassen wir nochmal zusammen:
-Der 10F202 hat keinen Komparator, also sind die Pins GP0 und GP1 
ausschließlich GPIOs
-Pin GP2 hat drei Belegungen:
1. Taktausgabe von F_osc / 4, diese wird im Register OSCCAL, bit0, 
eingeschaltet, ist nach einem Reset aber aus
2. Taktquelle für Timer0, diese wird im Register OPTION, bit5, 
eingeschaltet und ist nach einem Reset ein, muss also ausgeschaltet 
werden
-Der 10F202 besitzt interne Pull-Ups, diese werden im Register OPTION, 
bit6, eingeschaltet, sind nach einem Reset aber aus

von Mick M. (mick-mac)


Lesenswert?

Hallo Alex,

ich verwende den HI-TECH Compiler.
Dein Code verändert auch nichts auf dem Oszi.

Ich bin wirklich ratlos. Am besten teste ich das gleich alles nochmal 
auf einem anderen 10F202.
Ich vermute ja, dass der PIC nicht richtig geflasht wird. Ich benutze 
das PICkit2, bekomme jedoch keine Fehlermeldungen in MPLAB angezeigt.


Gruß Mirko

von Mick M. (mick-mac)


Lesenswert?

So ich bekomme bei einem anderen 10F202 mit deinem Code auf den 
Ausgängen GP1 und GP2 ein LOW.

Setze ich aber
  GPIO = 0b00000110;
müsste ich doch auf GP1 und GP2 ein HIGH erhalten, oder?

Das bekomme ich leider nicht...

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Lesenswert?

>Ich vermute ja, dass der PIC nicht richtig geflasht wird.
Gibt es dafür nicht eine Option "Verify Code after flashing" o.ä.?

>So ich bekomme bei einem anderen 10F202 mit deinem Code auf den
>Ausgängen GP1 und GP2 ein LOW.

Eigentlich solltest du auf beiden PICs selbstverständlich das gleiche 
Ergebnis erzielen, vielleicht kannst du erstmal herausfinden woran das 
liegt?

>Setze ich aber
>  GPIO = 0b00000110;
>müsste ich doch auf GP1 und GP2 ein HIGH erhalten, oder?

Ja.

von Mick M. (mick-mac)


Lesenswert?

Hallo,

ich habe das Problem mittlerweile gelöst bekommen.
Hauptfehlerquelle 2 Pull-Down Widerstände auf meinem Demoboard, die 
leider etwas unterdimensioniert waren.

Funktioniert jetzt alles einwandfrei.


Gruß Mirko

=> GELÖST

von Patrick E. (f4550tim)


Lesenswert?

Hallo,

ich habe nun ganz bewusst keinen neuen Beitrag aufgemacht, da es sicher 
sinnlos wäre. Es geht hier um den selben PIC, den Selben Compiler. Ich 
baue gerade auf den bestehenden Quellcode auf. Was ist denn an meiner IF 
Abfrage falsch ?
Er sagt mir das die Bezeichnung LATGPIObits.LATGPx falsch und 
PORTGPIObits.GPx falsch sei. Wie bezeichne ich diese denn bei dem PIC 
richtig ?

Hier mein Code:
1
#include <pic.h>
2
3
__CONFIG(WDTDIS & MCLRDIS & UNPROTECT);
4
5
void main(void)
6
{
7
  OPTION = 0b11011111;
8
  TRISGPIO = 0b00000001;
9
  GPIO = 0b0000;
10
  
11
  while(1)
12
  {
13
    if (PORTGPIObits.GP0 == 1)
14
      {
15
      LATGPIObits.LATGP2 = 1;
16
      }
17
    else
18
      {
19
      LATGPIObits.LATGP2 = 0;
20
      }
21
  }
22
}
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.