Ich bin mit meinem Latein langsam am Ende. Ich hoffe, hier kann mir jemand weiterhelfen! Unzwar habe ich Probleme mit der ADC. Kurze Vorgeschichte: Unser Projekt lief schon einwandfrei. Wir mussten jedoch von PIC18F2620 auf PIC18F26j11 umsteigen. Der zweite Unterschied zur ersten Version ist außerdem, dass wir einen externen Quarz anstatt intern benutzen. Bitte schaut mal über den Quellcode, was da falsch sein könnte. Zur Info: -Analog Inputs sollen RA0 und RA1 sein. -Vref+ liegt an 2,048V extern -Vref- liegt an Gnd // Initialisierung Analog-Digital-Wandler OpenADC( ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_20_TAD, ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_EXT & ADC_VREFMINUS_VSS, 13 ); Wäre super, wenn mir jemand erklären kann, was das genau bedeutet. -ADC_FOSC_32 (P.S.: Ich habe einen 8Mhz Quarz an RA6 und RA7 mit 22µF gegen Gnd angeschlossen) -ADC_RIGHT_JUST -ADC_20_TAD -ADC_CH0 (Warum Channel 0, ich will doch 2 analog inputs???) -13 (Die Zahl soll ja bedeuten, welche ich als analog inputs auswähle, aber welches Register ist das. ANCON0, ANCON1???) P.S.: Pdf-File mit den wichtigen Registern ist im Anhang. Mir zeigt es immer nur eine ganz hohe negative Zahl an. Also da scheint was nicht zu stimmen. Vielen Dank im Vorraus!
Wäre super, wenn sich jemand kurz erbarmen könnte, und mir weiterhelfen könnte!
>Der zweite Unterschied zur ersten Version ist >außerdem, dass wir einen externen Quarz anstatt intern benutzen. Es gibt keinen internen Quarz. >-ADC_FOSC_32 (P.S.: Ich habe einen 8Mhz Quarz an RA6 und RA7 mit 22µF >gegen Gnd angeschlossen) 22uF ist da wohl eher nicht angebracht. >Wäre super, wenn sich jemand kurz erbarmen könnte, und mir weiterhelfen >könnte! Nimm statt OpenADC() einfach das Datenblatt und initialisiere die entsprechenden Register zu Fuß. Da lernst du ne Menge und findest Fehler auch schneller.
Ok werde ich mal probieren. P.S.: Nicht 22µF sonder 22pF SORRY :-) Was gibt es hinsichtlich ADC sonst noch zu beachten?
Stimmt Dein TRISA Register? Die Pins müssen als Eingang geschaltet sein! Der PIC hat die neue Pinmapping Funktion. Wahrscheinlich hast Du nicht die PCFG Bits auf Analog umgestellt. Das ADCON0- Register gibt es zweimal auf verschiedenen Bänken (FC2h Access und F48h Banked)
Inputs sind alle auf Analog geschalten. Bin jetzt aus dem großem Projekt raus und habe lediglich die A/D-Wandlung getestet. Die funktioniert und zeigt keine komischen großen negativen Werte an. Glaube daran liegt es garnicht, sondern eher am Timer0, den ich verwende. Wenn das Register überläuft, wird ja ein Flag gesetzt und dann der Interrupt ausgelöst. Erst bei der Interruptroutine geht er in meine Messung rein (wo auch die A/D-Wandlung vorkommt). Ich habe es mit der Watch nochmal kontrolliert. Dieses Flag vom Timer wird nicht gesetzt --> Somit kein Interrupt --> Somit keine A/D-Wandlung. Vom Laboringenieur meiner Hochschule habe ich vor langer Zeit den Tipp bekommen, dass es Probleme gibt mit diesem ziemlich neuen PIC. Er meinte, dass Microchip irgendws im Code vergessen hat, sodass es den Timer nicht erkennt. Irgendwas mit Makro oder so. Ich habe davon einen Screenshot in den Anhang getan. Er meinte ich sollte dort __PIC18F26j11 eintragen. Warum weiß ich aber nicht. Kann mir jemand weiterhelfen, dass der Timer erkannt wird? P.S.: An meinem Quellcode liegt es denk ich nicht, weil es auf dem PIC18F2620 auch schon gelaufen ist. Timer0 ist enable, alles schon überprüft via Watch Vielen Dank im Voraus lg matthi
Hat noch keiner von euch von diesem Problem gehört? Bitte helft mir, ich weiß nicht mehr weiter!
Hmmm, Flag wird nicht gesetzt also läuft der TMR nicht obwohl das Bit TMR0ON gesetzt ist. Hast Du die Interruptbits gesetzt? INTCONbits.GIE=1; //global INTCONbits.PEIE/GIEL=1; //peripheral Wenn die nicht gesetzt sind nützt das TMR0ON nichts. Welchen Takteingang gewählt? Inter oder Extern? Einzustellen mit T0CS. Wenn extern eingestellt ist und keine Takt am Pin hängt wird der Timer nicht getaktet und kann keinen Interrupt erzeugen da das Register nicht überläuft. Prescaler richtig eingestellt? Vielleicht läuft der Timer ewig lange bis er überläuft und Du wartest nicht lange genug um den Interrupt zu sehen. Legst Du den PIC schlafen? TMR0 kann den PIC nicht aus dem sleep mode aufwecken! Wie steht es mit der Interrupt Priorität wenn Dein TMR0 auf "high priority" steht, Du aber das Interrupt im Programm unter "low priority" den ADC verarbeitest, wird das auch nicht klappen. Mehr fällt mir jetzt dazu nicht ein, sind aber ein paar Baustellen wo man abarbeiten kann.
-Global und peripheral intrrupt sind enable -Takt extern an RA6 und RA7 (OSC1 und OSC2), 8Mhz Quarz mit 2 x 22pF gegen Gnd (siehe Anhang). Jedoch ohne Rs(siehe Anhang). Ist dieser Widerstand wichtig? Wie kann ich generell festellen, ob mein Quarz schwingt (ohne Oszi)? -Prescaler auf 1:2 -16Bit Timer -Nein mit Timer0 will ich den µC nicht aufwecken (das weiß ich, dass das nicht geht). Ich wecke den µC mit Hilfe des Comparators1 auf (Funktionert perfekt, aber ganz anderes Thema) Bin jetzt aus dem großen Programm raus und wollte nur Timer0 testen, und über die Watch schauen, ob das Register überläuft und den Interrupt auslöst. Funktioniert aber nicht. Hier mein Quellcode. (Zum besseren Verständnis sind die Register im Anhang) /** I N C L U D E S ***********************************************************/ #include "p18f26j11.h" // Verwendete header-Dateien. #include "adc.h" #include "delays.h" #include "timers.h" /** Configurationen PIC18F26j11 ***********************************************************/ #pragma config WDTEN = OFF // Watchdog Timer #pragma config STVREN = OFF // Stack Overflow/Underflow Reset #pragma config XINST = OFF // Extended Instruction Set #pragma config CP0 = OFF // Code Protect #pragma config OSC = HS // High-Speed Mode, Quarz zwischen RA6 und RA7 #pragma config T1DIG = OFF // T1OSCEN Enforcement #pragma config LPT1OSC = OFF // Low-Power Timer1 Oscillator #pragma config FCMEN = OFF // Bei funktionslosem externen Takt schaltet PIC automatisch auf internen Takt um #pragma config IESO = OFF // Switch Mode External/Internal Takt #pragma config WDTPS = 1 // Watchdog Postscaler 1:1 #pragma config DSWDTOSC = T1OSCREF // DSWDT Clock Select #pragma config RTCOSC = T1OSCREF // RTCC Clock Select #pragma config DSBOREN = OFF // Deep Sleep Broun-Out-Reset #pragma config DSWDTEN = OFF // Deep Sleep Watchdog Timer #pragma config DSWDTPS = 2 // Deep Sleep Watchdog Postscaler 1:2 (2,1 ms) #pragma config IOL1WAY = OFF // IOLOCK One-Way Set Enable bit #pragma config MSSP7B_EN = MSK5 // MSSP address masking #pragma config WPFP = PAGE_0 // Write/Erase Protect Page Start/End Location #pragma config WPEND = PAGE_0 // Write/Erase Protect Region Select bit (valid when WPDIS = 0) #pragma config WPCFG = OFF // Write/Erase Protect Configuration Region #pragma config WPDIS = OFF // Write Protect Disable bit /** P R I V A T E P R O T O T Y P E S ****************************************/ void SysInit_(void); #pragma code //////////////////////////////////////////////////////////////////////// / // MAIN // //////////////////////////////////////////////////////////////////////// / void main(void) { SysInit_(); while(1) {;} } //###################################################################### ######## // Initialisierung //###################################################################### ######## void SysInit_(void) // Initialisierung des Systems { //Port Configuration TRISA = 0b11111111; TRISB = 0b11000000; TRISC = 0b00000000; //Oscillator Configuration OSCCON = 0b01110111; //Timer Configuration T0CON = 0b10000000; //Interrupt Configuration RCONbits.IPEN = 1; INTCON = 0b11100000; INTCON2 = 0b00000100; INTCON3 = 0b00000000; PIR1 = 0b00000000; PIR2 = 0b00000000; PIR3 = 0b00000000; PIE1 = 0b00000000; PIE2 = 0b00000000; PIE3 = 0b00000000; IPR1 = 0b00000000; IPR2 = 0b00000000; IPR3 = 0b00000000; return; } Ich glaube, es liegt echt daran, dass der Timer allgemein nicht erkannt wird. Problematik mit dem __PIC18F26j11 Macro. Ich weiß aber nicht, wie ich das machen könnte, dass der Timer erkannt wird! Ich hoffe jemand kann mir weiterhelfen! Vielen Dank im Voraus
Kann mir nicht vorstellen das der Timer nicht erkannt wird. Bastle gerade auch mit den neuen Typen rum (PIC18F46J50). Dort habe ich TMR0 und TMR1 gleichzeitig in Betrieb - ohne Probleme. Könnte tatsächlich an Deinem Quarz hängen. Nimm doch einfach mal zum Testen den internen Takt. Wenn dann das Flag kommt stimmt was mit dem Quarz nicht. Aber das hast Du ja in Deinem Code da oben schon so gemacht?! //Timer Configuration T0CON = 0b10000000; Das T0CS Bit ist ja auf 0 also der interne und nicht der externe Takt! Am code kann ich nichts finden, das muss aber nichts heisen. Bei mir sieht das so aus: //Setup TMR0 T0CON=0b00000010; TMR0H=0; TMR0L=0; INTCONbits.TMR0IF=0; //claer flag INTCONbits.TMR0IE=1; //enable interrupt T0CONbits.TMR0ON=1; //enable TMR0
Stimmt, das T0CS Bit hab ich falsch gesetzt. Aber mit externen noch mit internen Takt funzt der Timer. Am Chip kanns auch nicht liegen, dass der eventuell kaputt ist. Alle anderen Funktionen gehen. Hab gerade im Datenblatt gelesen, dass zwischen Quarz und µC-Pin noch ein Widerstand ist. Ist der wichtig? Was bewirkt der Widerstand? Schwingt deswegen der Quarz nicht? Hab die Frage mit dem Timer jettz auch direkt an Microchip geschickt. Vielleicht können die mir sagen, ob da ein Bug vorliegt! Sonst noch jemand Tipps, woran es liegen könnte???? P.S.: Ich kann mir auch nicht vorstellen, dass der Takt nicht funzt, weil die Datenübertragung ans Graphikdisplay funktioniert ja auch. Und da ist der Takt ja auch wichtig. Sonst würde ich ja garnichts sehen aufm Display? Lg Matthi
Na Mahlzeit, also von c hab ich kein Plan es geht doch um C oder? kann man da auch Macros selber proggen oder kann man den Timer nicht mit ner kleinen assemnlerroutine anmachen? Hab da mal noch ne andere Frage, ich brauche einen so nen neuen Pic ib PDIP28. Die ham doch bis 64 MHz. Habe keine Kreditkarte und Brauche einen! Bitte sagt mir woher (sollte schon 32 kb Speicher haben) mfg
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.