Forum: Mikrocontroller und Digitale Elektronik ADC-Problem bei PIC18F26j11


von Matthias W. (Firma: Atomica Music Production) (atomica)


Angehängte Dateien:

Lesenswert?

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!

von Matthias W. (Firma: Atomica Music Production) (atomica)


Lesenswert?

Wäre super, wenn sich jemand kurz erbarmen könnte, und mir weiterhelfen 
könnte!

von holger (Gast)


Lesenswert?

>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.

von Matthias W. (Firma: Atomica Music Production) (atomica)


Lesenswert?

Ok werde ich mal probieren.

P.S.: Nicht 22µF sonder 22pF SORRY :-)

Was gibt es hinsichtlich ADC sonst noch zu beachten?

von microchip (Gast)


Lesenswert?

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)

von Matthias W. (Firma: Atomica Music Production) (atomica)


Angehängte Dateien:

Lesenswert?

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

von Matthias W. (Firma: Atomica Music Production) (atomica)


Lesenswert?

Hat noch keiner von euch von diesem Problem gehört?

Bitte helft mir, ich weiß nicht mehr weiter!

von microchip (Gast)


Lesenswert?

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.

von Matthias W. (Firma: Atomica Music Production) (atomica)


Angehängte Dateien:

Lesenswert?

-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

von microchip (Gast)


Lesenswert?

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

von Matthias W. (Firma: Atomica Music Production) (atomica)


Lesenswert?

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

von Maik W. (werner01)


Lesenswert?

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
Noch kein Account? Hier anmelden.