PIC 10F202 I/O Problem

Gast #940953
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
Angehängte Dateien:
Gast #940987
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*/
Angehängte Dateien:
#941004
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*/
Gast #941093
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
#941111
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*/
#941137
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*/
(Firma: Ucore Fotografie www.ucore.de) Persönliche Seite #941161
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).
(Firma: Ucore Fotografie www.ucore.de) Persönliche Seite #941173
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
#941197
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
(Firma: Ucore Fotografie www.ucore.de) Persönliche Seite #941259
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.
#2752864
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

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