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...
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*/ |
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 | 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*/ |
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 | 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*/ |
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*/ |
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).
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:
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.