www.mikrocontroller.net

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


Autor: Mirko (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Alex Bürgel (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Mirko (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Rückmeldung.

Im Quellcode soll es natürlich GP1 und GP 2 heißen.
Nun der aktuelle Code
#include <pic.h>


void init(void);  

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

void init(void)
{

  __CONFIG(WDTDIS  & MCLRDIS & UNPROTECT);


  GPIO  = 0;                                    //  Alle Bits der PINs auf LOW setzen
  TRISGPIO = 0b1001;                            //  GP1 und GP2 als Ausgaenge definieren
  // GP3 ist input only !!!
  //TRISGPIO = 1 -> Eingang 
  //TRISGPIO = 0 -> Ausgang
}/*init*/


Autor: Alex Bürgel (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Mick Mac (mick-mac)
Datum:

Bewertung
0 lesenswert
nicht 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:
void init(void);  

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

void init(void)
{
  __CONFIG(WDTDIS  & MCLRDIS & UNPROTECT);
  //GPIO  = 0;                                    //  Alle Bits der PINs auf LOW setzen
  TRISGPIO = 0b000110;                            //  GP1 und GP3 als Ausgaenge definieren
  // GP3 ist input only !!!
  //TRISGPIO = 1 -> Eingang 
  //TRISGPIO = 0 -> Ausgang
  OPTION = 0b11011111;
  //CMCON = 0b11110111;
}/*init*/

Autor: Alex22 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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*/

Autor: Alex22 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mick Mac (mick-mac)
Datum:

Bewertung
0 lesenswert
nicht 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.

void init(void);  

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

void init(void)
{
  __CONFIG(WDTDIS & MCLRDIS & UNPROTECT);
  //GPIO  = 0;                                    //  Alle Bits der PINs auf LOW setzen
  TRISGPIO = 0b00000110;                            //  GP1 und GP3 als Ausgaenge definieren
  // GP3 ist input only !!!
  //TRISGPIO = 0 -> Eingang 
  //TRISGPIO = 1 -> Ausgang
  OPTION = 0b11011111;
  //CMCON0 = 0b11110111;
}/*init*/

Autor: Mick Mac (mick-mac)
Datum:

Bewertung
0 lesenswert
nicht 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:
void init(void);  

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

void init(void)
{
  __CONFIG(WDTDIS & MCLRDIS & UNPROTECT);
  //GPIO  = 0;                                    //  Alle Bits der PINs auf LOW setzen
  TRISGPIO = 0b00000000;                            //  GP1 und GP3 als Ausgaenge definieren
  // GP3 ist input only !!!
  //TRISGPIO = 0 -> Eingang 
  //TRISGPIO = 1 -> Ausgang
  OPTION = 0b11011111;
  //CMCON0 = 0b11110111;
}/*init*/

Autor: Alex Bürgel (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
__CONFIG(WDTDIS & MCLRDIS & UNPROTECT);

void main(void)
{
  OPTION = 0b11011111;
  TRISGPIO = 0b00000000;
  GPIO = 0b00000000;  
  while(1);
}/*main*/

Das sollte doch alle Pins zu Outputs machen und diese auf 0V setzen 
(außer GPIO3 natürlich).

Autor: Alex Bürgel (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mick Mac (mick-mac)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mick Mac (mick-mac)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Alex Bürgel (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mick Mac (mick-mac)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick E. (f4550tim)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <pic.h>

__CONFIG(WDTDIS & MCLRDIS & UNPROTECT);

void main(void)
{
  OPTION = 0b11011111;
  TRISGPIO = 0b00000001;
  GPIO = 0b0000;
  
  while(1)
  {
    if (PORTGPIObits.GP0 == 1)
      {
      LATGPIObits.LATGP2 = 1;
      }
    else
      {
      LATGPIObits.LATGP2 = 0;
      }
  }
}
Danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.