Hallo Leute, ich laborier schon seit langem an der Inbetriebnahme einer Schaltung mit einem PIC24HJ128GP206 rum. Den PIC konnte ich vor Einlöten nicht testen und dazu kommt das ich bisher Atmel programmiert hab (vom C166 mal abgesehen) und schon bisl eingerostet bin. Also ich hab nach hochtrabenden Zielen versucht einen einzigen Pin gezielt auf High zu setzen - ohne Erfolg. Könnte mir jemand mit einem Programm weiterhelfen das mir einfach nur einen Pin auf High zieht? Denn ich bin nicht mehr sicher ob der Fehler vor der Tastatur sitzt oder aber der Chip kaputt oder mein Layout falsch ist.
ADC-taugliche Pins sind ab Reset nur dafür verwendbar. Müssen als I/O erst umkonfiguriert werden. Das Richtungsregister (TRIx) funktioniert genau umgekehrt wie beim Rest der Welt.
Der Umstieg von AVR auf PIC (und umgekehrt) kann schon recht schmerzhaft sein. Bei den PIC24 weiß ich es grade nicht, aber bei PIC16/18 müssen die Register für die Datenrichtung genau umgekehrt initialisiert werden. Das heißt eine 0 bedeutet Ausgang. Die nächste Schweinerei könnten im Default aktive ADC- oder Komparatoreingänge sein. Die muß man erst auf Digital IO umschalten.
Kann mich meinen Vorrednern nur anschließen. Überprüf auch, ob dein Programmiergerät den PIC vielleicht im Reset festhält.
Ich nutze das PICkit 2 - allerdings schließe ich den nur zum programmieren an - danach zieh ich den ab - Reset ist es nicht. Ich hab schon X Konfigurationsmöglichkeiten ausprobiert, bin über diese miese prioritätsabhängige Mehrfachnutzung gestolpert und und und - aber ich habs nicht hinbekommen - daher hoffte ich hier auf ein Programm das funktioniert.
In welcher Sprache programmierst Du denn? Bei C sind immer leichte, anschauliche und funktionierende Beispielprogramme dabei. Da hast Du wenig Arbeit. Die Programme sind entweder beim Compiler dabei oder bei Microchip zu holen. Assembler würd ich mir nicht antun. Da mußt Du all das beachten, was die Vorredner schon erwähnt haben. Das ist überflüssig. Im Compiler ist das alles schon mal erfunden worden.
ich hab mal nur schnell einen PIC24 ausgepackt und via SPI 6 7segmente angesteuert. schau mal rein, vielleicht findest du ein paar ideen, warum dein code nicht funktioniert (wäre sowieso angebracht den hier zu posten - raten macht nämlich nicht so spass) ansosten: www.engscope.com/pic24-tutorial www.flyingpic24.com www.sprut.de
Also ich nutze mittlerweile C - ASM wird irgendwann einfach zuviel gefrickel ;) mein Code sieht wie folgt aus:
1 | #include "p24HJ128GP206.h" |
2 | |
3 | _FOSCSEL( FNOSC_FRCPLL & IESO_OFF ) |
4 | _FOSC ( FCKSM_CSDCMD & FCKSM_CSDCMD & POSCMD_NONE ) |
5 | |
6 | int main(void) { |
7 | |
8 | //ODCG |= 0xF3CF; // Only RG6..9 (CN8..11) pins have internal pull-up resistors which have to be enabled by setting the CNPU8..11 bits
|
9 | //ODCG &= 0x0000;
|
10 | |
11 | TRISG = 0x0000; |
12 | Nop(); // Required if a port/latch is accessed in a next command |
13 | LATG = 0xFFFF; |
14 | |
15 | while(1) { |
16 | |
17 | }
|
18 | // return 0; // Don't do that in a non-OS MCU environment
|
19 | }
|
Ich dachte eigentlich das ich nun an einem beliebigen Pin der Gruppe G - zum Beispiel Pin 1
A. K. schrieb:
> Such beim ADC mal nach AD1PCFG. Vielleicht fällt dann der Groschen.
ja - darauf bin ich auch schon reingefallen - allerdings beschreibt das
Datenblatt Pin 1 (RG15) als normalen digitalen Pin - der hat keinerlei
gemultiplexte Funktion - auch nicht Analogpin - von daher dachte ich ich
bräuchte das nicht ... :-/
Deine Ports/Pins hatte ich jetzt nicht eigens kontrolliert. Mag sein, dass Port G digital ist. Dann sollte das klappen. Oder es gibt noch so eine Schönheit, diesen Typ habe ich nicht verwendet. Beim STM32 ist beispielsweise jedes Peripheriemodul von Haus aus erst einmal zentral abgeschaltet um Strom zu sparen.
benützt du wirklich einen RC-oscillator? und bei _FOSC übergibst du von 3 nötigen argumenten nur 2 (2 von deinen 3 sind ja gleich). allgemein: entweder man definiert die register über das cklick-down im MPLAB oder man definiert sie im code (letzteres ist für eine portierbarkeit viel angenehmer). du definierst nur einen bruchteil im code: was ist mit den anderen?
die anderen bleiben unbetastet. was ich vorhabe is den internen Oszillator zu nutzen - welche einstellung wäre denn richtig? Ich kann das auch komplett über das clickdown-menü machen - mich stört halt das man davon nichts im code sieht.
> was ich vorhabe is den internen Oszillator zu nutzen - welche > einstellung wäre denn richtig? Am besten erst mal ohne PLL, ich bin nicht sicher ob da nicht noch was konfiguriert werden muss.
ich mache es auch lieber im code: aber wenn man's im code macht, dann vollständig (damit meine ich alle einstellungen definieren und nicht wie du nur den takt) schau dir mal die "p24HJ128GP206.h" an, da siehst du, wie du was definieren kannst (auch deinen takt) so, ich konnts nicht lassn, und hab ma schnell mei demoboard rauskramt und das hier funktioniert (halt mit nem leicht anderen PIC, dem ..306, und einem 10MHz-quarz). der pin RG6 sollt blinkn, waser bei mia auch tut :-)
1 | #include "p24HJ128GP306.h" |
2 | #include <libpic30.h> |
3 | |
4 | _FBS(RBS_NO_BOOT_RAM & BSS_NO_BOOT_CODE & BWRP_WRPROTECT_OFF); // Boot Segment |
5 | _FSS(RSS_NO_SEC_RAM & SSS_NO_SEC_CODE & SWRP_WRPROTECT_OFF); // Secure Segment |
6 | _FGS(GSS_OFF & GCP_OFF & GWRP_OFF); // Code/Write Protect |
7 | _FOSCSEL(FNOSC_PRIPLL & IESO_OFF); // Oscillator |
8 | _FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_XT); // Clock |
9 | _FWDT(FWDTEN_OFF & WINDIS_OFF); // Watchdog |
10 | _FPOR(FPWRT_PWR1); // Power-on Reset Value |
11 | //_FICD(BKBUG_OFF & COE_OFF & JTAGEN_OFF & ICS_PGD1); // Register FICD (with debugger)
|
12 | _FICD(BKBUG_OFF & COE_ON & JTAGEN_OFF & ICS_NONE); // Register FICD (without debugger) |
13 | |
14 | |
15 | int main(void) { |
16 | |
17 | //ODCG |= 0xF3CF; // Only RG6..9 (CN8..11) pins have internal pull-up resistors which have to be enabled by setting the CNPU8..11 bits
|
18 | //ODCG &= 0x0000;
|
19 | |
20 | TRISG = 0x0000; |
21 | Nop(); // Required if a port/latch is accessed in a next command |
22 | LATG = 0xFFFF; |
23 | |
24 | while(1) { |
25 | LATGbits.LATG6 = 1; |
26 | __delay32(10000000); |
27 | LATGbits.LATG6 = 0; |
28 | __delay32(10000000); |
29 | }
|
30 | } // return 0; // Don't do that in a non-OS MCU environment |
edit: wenn du im obigen bild das häckchen "Configuration Bits set in code" anklickst, werden die configs im code ignoriert und diese (im bild) genommen.
Mmhkay also ich hab erst RG6 gemessen mit deinem Prog und danach das Ganze auf RG15 umgeschrieben. Also ich krieg den Pin (6 oder 15) nur auf 0,6 V gezogen - Pullup defekt?
hmm.. 1. wie misst du: multimeter/oszi? und 2. was misst du: belasteter/unbelasteter pin? (falls belastet: wie belastet?) pullup? wie meinst du das resp. was hast du am pin wie ran gemacht? du weisst aber schon, dass der pin nur max. 4mA treiben/ziehen kann?! also du nur eine lowcurrent-LED verweden kannst; oder dann einen treiber dazwischen schalten. ps: nur den programmer abziehen genügt nicht, dass der PIC läuft; er muss auch auf nicht-debuggen programmiert sein (wähle im MPLAB dazu "release mode")
Und dass der Core ein Vmax von 2,8V hat, hier aber 3,3V abkriegt, das stört dich auch nicht?
206 - das Bild hat auch teilweise falsche Pinbeschriftungen - aber die wichtigen Pins für /MCLR und PGCx/PGDx sowie Versorgung sind gleich
A. K. schrieb: > Und dass der Core ein Vmax von 2,8V hat, hier aber 3,3V abkriegt, das > stört dich auch nicht? Arg - übersehen - morgen auf arbeit mal nen spannungsteiler ranbasteln.
Jonas Arndt schrieb:
> Arg - übersehen - morgen auf arbeit mal nen spannungsteiler ranbasteln.
Du brauchst keinen Spannungsteiler oder -Regler, sondern eine Brille.
Nämlich für's lesen vom Datasheet, in dem drinsteht, wie man das Teil
korrekt mit Strom versorgt. Der Regler ist ja da schon drin, nur muss
man den auch korrekt verwenden.
Und wenn du Pech hast brauchst du auch einen neuen Controller. Die
2,8V/3,0V (je nach Typ) sind nämlich das absolute Maximum und was in
dieser Beschaltung bei bei ENVREG=offen passiert wissen nur die Götter.
Einfach nach dem Motto vorgehen, das wird schon genauso sein wie bei
Atmel, brauch ich nicht erst nachzusehen, das funktioniert nicht.
A. K. schrieb: > Jonas Arndt schrieb: > >> Arg - übersehen - morgen auf arbeit mal nen spannungsteiler ranbasteln. > > Du brauchst keinen Spannungsteiler oder -Regler, sondern eine Brille. > Nämlich für's lesen vom Datasheet, in dem drinsteht, wie man das Teil > korrekt mit Strom versorgt. Der Regler ist ja da schon drin, nur muss > man den auch korrekt verwenden. > > Und wenn du Pech hast brauchst du auch einen neuen Controller. Die > 2,8V/3,0V (je nach Typ) sind nämlich das absolute Maximum und was in > dieser Beschaltung bei bei ENVREG=offen passiert wissen nur die Götter. > > Einfach nach dem Motto vorgehen, das wird schon genauso sein wie bei > Atmel, brauch ich nicht erst nachzusehen, das funktioniert nicht. Zugegeben da hab ich echt mist gebaut - danke für die erleuchtung ;) aber was zum henker ist envreg?
Enable Voltage Regulator. Der PIC hat eine internen LDO den du damit aktivieren kannst. Allerdings brauchst dann eine Kerko am PIN VDDCORE.
Thorsten schrieb: > Enable Voltage Regulator. Der PIC hat eine internen LDO den du damit > aktivieren kannst. Allerdings brauchst dann eine Kerko am PIN VDDCORE. Also ich kann kein Enablebit oder ähnliches finden.
Also Jungs - ich hab extra nochmal das neue Datenblatt geladen http://ww1.microchip.com/downloads/en/DeviceDoc/70175H.pdf das ist für diesen chip verlinkt auf microchip.com Die haben 2009 nen neues rausgebracht wie ich sehe. Allerdings finde ich in dem ganzen Datenblatt und auch in der Voltage Regulator Section nichts über diesen ominösen Pin. Außerdem verbitte halte ich solch einen Tonfall für unangebracht. Und auf den ENVREG-Pin in meinem Schaltplan zurückzukommen - warum ist da wohl keine Pinnummer dran?
Dein Schaltbild mit dem falschen Chip hat einen solchen Pin jedenfalls. Es ist Kap 21.2 gemeint. Wer im Schaltplan den falschen Chip der falschen Chipfamilie mit etwas anderen Pins postet, der sollte sich über die entsprechenden Kommentare nicht wundern.
A. K. schrieb: > Dein Schaltbild mit dem falschen Chip hat einen solchen Pin jedenfalls. > Es ist Kap 21.2 gemeint. > > Wer im Schaltplan den falschen Chip der falschen Chipfamilie mit etwas > anderen Pins postet, der sollte sich über die entsprechenden Kommentare > nicht wundern. Ich denke vl sollten sich hier einige eher überlegen ob der Ton angemessen ist. Vorallem wenn mir jemand erklärt das er den Pin nirgends finden kann würde ich zumindest mich rückversichern via Datenblatt und nicht denjenigen beleidigen - Danke an alle für die Hilfe
so, jetzt ist fertig mit schlammschlacht, schliess einfach die folgenden pins so an Pin 10, (19), 26, 38, 57 sind an VDD zu schliessen = +3.3V Pin 9, (20), 25, 41 sind an GND zu schliessen Pin 39, 40 einen quarz (vorteilhaft 10MHz) mit je 2 kondensatoren Pin 56 = VDDCORE einen tantal-kondensator mit 10uF die pins in klammern sind die referenzspannungen für den ADC, falls du den gleich mit GND/VCC betreiben willst VDDCORE ist der pin des internen spannungreglers, der zur spannungsstabilisierung einen kondensator braucht (darum der 10uF) ps: das nächste mal liesst du bitte selbst das datenblatt - danke
ach ja, zu deiner info: wenn du in deinem schaltbild den falschen IC nimmst, darfst du nicht meinen, dass die pin-benennung und -belegung die selbe bleibt wie bei einem anderen IC - logisch, oder? z.b. ist in deinem schaltbild der pin ENVREG der pin VDD bei deinem PIC24HJ.. alles klar?
Master Snowman schrieb: > so, jetzt ist fertig mit schlammschlacht, schliess einfach die folgenden > pins so an > Pin 10, (19), 26, 38, 57 sind an VDD zu schliessen = +3.3V > Pin 9, (20), 25, 41 sind an GND zu schliessen > Pin 39, 40 einen quarz (vorteilhaft 10MHz) mit je 2 kondensatoren > Pin 56 = VDDCORE einen tantal-kondensator mit 10uF > > die pins in klammern sind die referenzspannungen für den ADC, falls du > den gleich mit GND/VCC betreiben willst > > VDDCORE ist der pin des internen spannungreglers, der zur > spannungsstabilisierung einen kondensator braucht (darum der 10uF) > > ps: das nächste mal liesst du bitte selbst das datenblatt - danke Danke für die Mühe - aber jetzt reichts langsam. Ich hab den Teil mit VDDcore falsch gelesen - keine Frage. Aber genau weil ich nicht rausbekommen hab wo der Fehler war, weil ich annahm das mein Layout richtig ist, hab ich hier um Hilfe gebeten - großteils hab ich nur dumme Sprüche zu hören bekommen. Was soll das denn? Das irgendwo nen Fehler war war mir ja bewusst und ich bitte um hilfe - und die antworten - echt das letzte. Die Belegung hab ich mittlerweile geändert - im neuen Datenblatt von 09 ist praktischerweise auch ne Minimumbeschaltung angegeben - trotzdem danke. Hatte gehofft auf den Quarz verzichten zu können -_- Ich weiß im Übrigen nicht mit was der Rest hier SLPs zeichnet - aber ich nutze Eagle. Und da ich nicht jedes Bauteil neuzeichnen will weil das einfach nicht praktisch ist, nehm ich auch gern pinkompatibles und halte mich einfach an die Pinnummer und ignorier die Bezeichnung - klappt soweit ganz gut! Und falls das mal jemand nachließt - den besagten Enable Voltage Regulator Pin gibt es beim 206 nicht!
auch wichtig ist, dass du NICHT IM DEBUGMODE bist wenn du das PICKit abziehst muss der Chip im Programmiermodus des PICKit beschrieben werden. andernfalls tut sich nix ohne druck auf die Playtaste ;)
> nehm ich auch gern pinkompatibles und halte mich einfach an die Pinnummer
naja, aber deine beschaltung sieht nicht danach aus
z.b. programmierleitung oder der MCLR hängt nach abziehen des
programmierers in der luft, keine stützkondensatoren... man kann schon
einen gehäuse- und pin-kompatiblen IC nehmen, aber dann
1. pins auch richtig beschalten/belegen
2. vielleicht hier erwähnen, ansonsten musst du - wie bemerkt, -gewisse
sprüche hören - sorry das ist so!
Michael H. schrieb: > auch wichtig ist, dass du NICHT IM DEBUGMODE bist > > wenn du das PICKit abziehst muss der Chip im Programmiermodus des PICKit > beschrieben werden. > > andernfalls tut sich nix ohne druck auf die Playtaste ;) Das hatte ich anfangs - hab aber mittlerweile ;) im Pulldownmenü RELEASE gewählt - ich hab den Fehler halt an der falschen Stelle gesucht.
ok, programmierleitungen sind OK - sorry - ich dachte man müsse(!) RB6/7 brauchen ;-)
Master Snowman schrieb: > ok, programmierleitungen sind OK - sorry - ich dachte man müsse(!) RB6/7 > brauchen ;-) nee hattest schon recht - der master reset hängt danach in der luft - ich mein ist halt meine schuld - das ist nur teil meines projektes und nachdem ich den 160-poligen 3-port-switch verdrahtet hatte hab ich da wohl nen bischen geschlust. aber morgen bau ich meinen letzten verbliebenen PIC auf und verdrahte den neu - werd rückmeldung geben obs klappt ;)
>> Das hatte ich anfangs - hab aber mittlerweile ;) im Pulldownmenü RELEASE >>gewählt - ich hab den Fehler halt an der falschen Stelle gesucht. sorry, ich hab das PICKit nicht, aber ich weiß das kann teilweise Debuggen folgich kann man es im MPLAB als Programmer ODER Debugger anmelden. wichtig is das es im Dropdownmenu Programmer angemeldet ist. Diverse Warnmeldungen lesen und dann akzeptieren ;) und vorallem lass das PICKit dran und toggle den Masterclear mit den ensprechenden Buttons im MPLAB
> Hatte gehofft auf den Quarz verzichten zu können -_-
Was bringt dich zu dieser Auffassung?
Der interne FRC mit 7,3MHz geht doch prima.
Noch eine Anmerkung zu den verschiedenen PGC / PGD Leitungen:
zum Programmieren kann man jedes beliebige Paar nehmen - zum debuggen
nur das bei der Programmierung mit den configbits eingestellte.
Also, ich hab nun folgendes Programm:
1 | #include "p24HJ128GP206.h" |
2 | #include <libpic30.h> |
3 | |
4 | _FBS(RBS_NO_BOOT_RAM & BSS_NO_BOOT_CODE & BWRP_WRPROTECT_OFF); // Boot Segment |
5 | _FSS(RSS_NO_SEC_RAM & SSS_NO_SEC_CODE & SWRP_WRPROTECT_OFF); // Secure Segment |
6 | _FGS(GSS_OFF & GCP_OFF & GWRP_OFF); // Code/Write Protect |
7 | _FOSCSEL(FNOSC_FRC & IESO_OFF); // Oscillator |
8 | _FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_NONE); // Clock |
9 | _FWDT(FWDTEN_OFF & WINDIS_OFF); // Watchdog |
10 | _FPOR(FPWRT_PWR1); // Power-on Reset Value |
11 | _FICD(BKBUG_OFF & COE_OFF & JTAGEN_OFF & ICS_PGD3); // Register FICD (with debugger) |
12 | //_FICD(BKBUG_OFF & COE_ON & JTAGEN_OFF & ICS_NONE); // Register FICD (without debugger) |
13 | |
14 | |
15 | int main(void) { |
16 | |
17 | ODCG &= 0x0000; |
18 | |
19 | TRISG = 0x0000; |
20 | TRISB = 0x0000; |
21 | AD1PCFGH = 0xFFFF; |
22 | Nop(); // Required if a port/latch is accessed in a next command |
23 | //LATG = 0xFFFF; |
24 | |
25 | while(1) { |
26 | LATGbits.LATG15 = 1; |
27 | LATBbits.LATB10 = 1; |
28 | Nop(); |
29 | __delay32(10000000); |
30 | //LATGbits.LATG15 = 0; |
31 | //LATBbits.LATB10 = 0; |
32 | __delay32(10000000); |
33 | } |
34 | } |
Im Debugmode läuft es, wenn ich das normal programmiere klappts nicht. (Ich kann Highpegel messen im Debugmode - normal nicht - gemessen mit Multimeter) Ich würd irgendwie immer noch auf Clocking tippen aber ich find den Fehler nicht. MCLR ist High, Speisung durch PICKIT2 oder extern (LDO) - macht keinen Unterschied am Ergebnis. Debugmode mit Power through PICKIT2 Hat einer ne Idee?
nevermind - man sollte das Debug Enable Bit nur setzen wenn man debuggen will -_-
Kleiner Tip für alle die mit der HW- Beschaltung nicht klar kommen. Auf der Microchip HP kann man alle Schemas zu den Eval- Boards downloaden. Da ich davon ausgehe, dass der Hersteller der Chips weiss, wie man seine Controller beschalten muss ist dies immer eine gute Hilfe, die erste Hürde zu nehmen.
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.