ruNN0r
20.02.2012, 15:52
hi, ich habe einen PIC18F442 (http://www.reichelt.de/index.html?;ACTION=7;LA=3;OPEN=0;INDEX=0;FILENAME= A300%252FPIC18F242_PIC18F252_PIC18F442%2523MIC.pdf ;SID=12Tx1KXn8AAAIAAE9FsRgb2e4f869f686dc2de53f5202 d8eca285).
Mit dem ADC dort möchte ich nun eine Temperatur messen!
Dazu nutze ich einen KTY 81-220 mit 2000Ohm bei 25°C
Ich habe einiges gelesen aber komm leider nicht weiter...
Ich habe den KTY an AN0 gehängt. Der KTY hängt in reihe mit einem 4,7K Widerstand und das ganze fungiert als Spannungsteiler. Ich Greife nun die Spannung ab und leite diese an den PIC (AN0) zu messung weiter.
Nun ja. Da ich den PIC mit 5V betreibe und der ADC 10Bit hat ist eine Werterhöhung bei 5/1024 = 4,88mV.
Für den KTY habe ich mir eine Wertetabelle in Excel gemacht die ich hier mal anhängen werde!
Laut der Tabelle erhalte ich bei 20°C 1,451V und der ADC Wert müsste 297 Betragen.
Ich komme bei weitem nicht auf diese Werte! 1,434 V habe ich direkt am Spannungsteiler (mit Multimeter gemessen) und ich habe hier ca. 23°C
Das ganze Programm schicke ich nun mal nicht rüber... da die Multiplexingfunktion und die Uhr gut funktionieren. Also nur das nötigste ;)
/*
* I N C L U D E S
*/
#include <p18F442.h>
/*
* C O N F I G U R A T I O N S
*/
#pragma config OSC = XT
#pragma config PWRT = ON //keine ahnung... Memo: noch mal Nachlesen!
#pragma config WDT = OFF //Watchdog off
#pragma config LVP = OFF //Low Voltage ICSP
/*
* D E F I N A T I O N S
*/
/*
* F I X E D V A R I A B L E S
*/
//Global
int i = 0;
int mode = 3; //Anzeigemodus
//Dot Matrix Anzeige
int iCol = 0; //Zähler für die Spalten
int iRow = 0; //Zähler für die Zeilen
int CursorPos = 0; //Aktuelle Position im "Display"
int CursorValue[5] = {0,10,10,10,10}; //Werte an der Position
int SegPos = 0; //Aktuelle Position im Segment
int co = 0; //Anzahl Overflows
int coAnpassen = 0; //Counter um den fehlen viertelTakt nachzuholen.
//Temperatur
int temp1 = 0;
int temp2 = 0;
//Uhr
int Stunden = 0;
int Minuten = 0;
int Sekunden = 0;
//Taster
int TWT = 800; //Entprelltimer
int T1WT = 0;
int T2WT = 0;
int T3WT = 0;
/*
* I N T E R R U P T
*/
#pragma interruptlow InterruptHandler
//Ausgeblendet
/*
* P R O G R A M M
*/
#pragma code
unsigned char ADC_read(void){
ADCON0bits.GO_DONE = 1;
temp2 = 0;
while(ADCON0bits.GO_DONE != 0){}
temp2 = ADRESL;
temp2 += (ADRESH << 6);
}
void main(void) {
TRISD = 0x00;
PORTD = 0x00;
TRISB = 0x07;
TRISAbits.RA0 = 1;
T0CONbits.TMR0ON = 1; //Timer0 an/aus
T0CONbits.PSA = 1; //Den Vorteiler 0 = AN | 1 = OFF
T0CONbits.T0PS = 0b000; //Voteiler einstellen
T0CONbits.T0CS = 0; //Tacktquelle | 1 = vom TOCKI holen | 0 = vom OSC holen
T0CONbits.T08BIT = 1; //Timer Breite einstellen | 1 = 8bit | 0 = 16bit
RCONbits.IPEN = 0; // Priorität aktivieren/deaktivieren
INTCONbits.GIEL = 0; // Low priority
INTCONbits.GIEH = 1; // Interrupting enabled.
INTCONbits.TMR0IE= 1;
INTCONbits.TMR0IF= 1;
INTCON2bits.TMR0IP=0;
ADCON1 = 0b11001110;
ADCON0 = 0b01000000;
ADCON0bits.ADON = 1;
init_4094();
//test();
while(1){
if(mode==0){
test();
}
if(mode==1){
uhr_show();
}
if(mode==2){
uhr_binaer();
}
if(mode==3){
if(Sekunden % 2 == 0 ){
ADC_read();
}
therm();
}
}
}
if(Sekunden % 2 == 0 ){
ADC_read();
}
Soll nur dafür sorgen dass jede sekunde ein mal gemessen wird. Funktioniert gut... da der ADC ja Zeit benötigt zwischen den messungen dachte ich es wäre vorerst die besste Idee.
Ich nutze einen 4MHz Quarz an dem PIC18F442 (http://www.reichelt.de/index.html?;ACTION=7;LA=3;OPEN=0;INDEX=0;FILENAME= A300%252FPIC18F242_PIC18F252_PIC18F442%2523MIC.pdf ;SID=12Tx1KXn8AAAIAAE9FsRgb2e4f869f686dc2de53f5202 d8eca285).
So, ich glaube ich habe alles wichtige erzählt. Ich hoffe ihr könnt mir helfen... Danke!
Achja, weil es nicht funktioniert habe ich sehr viel rumprobiert mit den Registern um mich meinen Werten anzunähern... kann sein dass dies jetzt totaler Bullshit ist aber ich wusste nicht mehr weiter ;)
Mit dem ADC dort möchte ich nun eine Temperatur messen!
Dazu nutze ich einen KTY 81-220 mit 2000Ohm bei 25°C
Ich habe einiges gelesen aber komm leider nicht weiter...
Ich habe den KTY an AN0 gehängt. Der KTY hängt in reihe mit einem 4,7K Widerstand und das ganze fungiert als Spannungsteiler. Ich Greife nun die Spannung ab und leite diese an den PIC (AN0) zu messung weiter.
Nun ja. Da ich den PIC mit 5V betreibe und der ADC 10Bit hat ist eine Werterhöhung bei 5/1024 = 4,88mV.
Für den KTY habe ich mir eine Wertetabelle in Excel gemacht die ich hier mal anhängen werde!
Laut der Tabelle erhalte ich bei 20°C 1,451V und der ADC Wert müsste 297 Betragen.
Ich komme bei weitem nicht auf diese Werte! 1,434 V habe ich direkt am Spannungsteiler (mit Multimeter gemessen) und ich habe hier ca. 23°C
Das ganze Programm schicke ich nun mal nicht rüber... da die Multiplexingfunktion und die Uhr gut funktionieren. Also nur das nötigste ;)
/*
* I N C L U D E S
*/
#include <p18F442.h>
/*
* C O N F I G U R A T I O N S
*/
#pragma config OSC = XT
#pragma config PWRT = ON //keine ahnung... Memo: noch mal Nachlesen!
#pragma config WDT = OFF //Watchdog off
#pragma config LVP = OFF //Low Voltage ICSP
/*
* D E F I N A T I O N S
*/
/*
* F I X E D V A R I A B L E S
*/
//Global
int i = 0;
int mode = 3; //Anzeigemodus
//Dot Matrix Anzeige
int iCol = 0; //Zähler für die Spalten
int iRow = 0; //Zähler für die Zeilen
int CursorPos = 0; //Aktuelle Position im "Display"
int CursorValue[5] = {0,10,10,10,10}; //Werte an der Position
int SegPos = 0; //Aktuelle Position im Segment
int co = 0; //Anzahl Overflows
int coAnpassen = 0; //Counter um den fehlen viertelTakt nachzuholen.
//Temperatur
int temp1 = 0;
int temp2 = 0;
//Uhr
int Stunden = 0;
int Minuten = 0;
int Sekunden = 0;
//Taster
int TWT = 800; //Entprelltimer
int T1WT = 0;
int T2WT = 0;
int T3WT = 0;
/*
* I N T E R R U P T
*/
#pragma interruptlow InterruptHandler
//Ausgeblendet
/*
* P R O G R A M M
*/
#pragma code
unsigned char ADC_read(void){
ADCON0bits.GO_DONE = 1;
temp2 = 0;
while(ADCON0bits.GO_DONE != 0){}
temp2 = ADRESL;
temp2 += (ADRESH << 6);
}
void main(void) {
TRISD = 0x00;
PORTD = 0x00;
TRISB = 0x07;
TRISAbits.RA0 = 1;
T0CONbits.TMR0ON = 1; //Timer0 an/aus
T0CONbits.PSA = 1; //Den Vorteiler 0 = AN | 1 = OFF
T0CONbits.T0PS = 0b000; //Voteiler einstellen
T0CONbits.T0CS = 0; //Tacktquelle | 1 = vom TOCKI holen | 0 = vom OSC holen
T0CONbits.T08BIT = 1; //Timer Breite einstellen | 1 = 8bit | 0 = 16bit
RCONbits.IPEN = 0; // Priorität aktivieren/deaktivieren
INTCONbits.GIEL = 0; // Low priority
INTCONbits.GIEH = 1; // Interrupting enabled.
INTCONbits.TMR0IE= 1;
INTCONbits.TMR0IF= 1;
INTCON2bits.TMR0IP=0;
ADCON1 = 0b11001110;
ADCON0 = 0b01000000;
ADCON0bits.ADON = 1;
init_4094();
//test();
while(1){
if(mode==0){
test();
}
if(mode==1){
uhr_show();
}
if(mode==2){
uhr_binaer();
}
if(mode==3){
if(Sekunden % 2 == 0 ){
ADC_read();
}
therm();
}
}
}
if(Sekunden % 2 == 0 ){
ADC_read();
}
Soll nur dafür sorgen dass jede sekunde ein mal gemessen wird. Funktioniert gut... da der ADC ja Zeit benötigt zwischen den messungen dachte ich es wäre vorerst die besste Idee.
Ich nutze einen 4MHz Quarz an dem PIC18F442 (http://www.reichelt.de/index.html?;ACTION=7;LA=3;OPEN=0;INDEX=0;FILENAME= A300%252FPIC18F242_PIC18F252_PIC18F442%2523MIC.pdf ;SID=12Tx1KXn8AAAIAAE9FsRgb2e4f869f686dc2de53f5202 d8eca285).
So, ich glaube ich habe alles wichtige erzählt. Ich hoffe ihr könnt mir helfen... Danke!
Achja, weil es nicht funktioniert habe ich sehr viel rumprobiert mit den Registern um mich meinen Werten anzunähern... kann sein dass dies jetzt totaler Bullshit ist aber ich wusste nicht mehr weiter ;)