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
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...
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...
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
voidinit(void);
2
3
voidmain(void)
4
{
5
init();
6
GPIO=0b0110;
7
}/*main*/
8
9
voidinit(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
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*/
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
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
voidinit(void);
2
3
voidmain(void)
4
{
5
init();
6
GPIO=0b00000110;
7
while(1);
8
}/*main*/
9
10
voidinit(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
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
voidinit(void);
2
3
voidmain(void)
4
{
5
init();
6
GPIO=0b00000000;
7
while(1);
8
}/*main*/
9
10
voidinit(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
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
voidmain(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).
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
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
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...
>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.
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
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: