wono
20.04.2009, 16:59
Hallo jungs,
wir haben ein problem bei der programmierung unseren Farbsensors und zwar, gibt er uns komische werte zurück und wir wissen nicht recht was falsch ist, da er zu 100% richtig angeschlossen ist.
Kann uns jemand weiterhelfen??
//#include "MAIN.H"
#include <xc886.h>
#include "lcd800.c"
/*
extern void lcd_init(void); // Init LCD
extern void lcd_clr(void); // LCD Löschen
extern void lcd_byte(char); // Ausgabe unsigned char => 3 stellig
extern void lcd_str(char *ptr);// Ausgabe String
extern void lcd_curs(char); // Cursor setzen
*/
void MAIN_vInit(void);
void INT_vInit(void);
void timer(void);
void init(void);
void ScanRot(void);
void ScanGruen(void);
void ScanBlau(void);
void ausgabe(void);
sbit OUT = P3_DATA^3; //impuls
sbit S0 = P0_DATA^2; //S0= welche frequenz
sbit S1 = P0_DATA^3; //s1 = welche frequenz
sbit S2 = P0_DATA^4; //s2 = welcher farbwert
sbit S3 = P0_DATA^5; //s3 = welcher farbwert
sbit LED = P3_DATA^0; //LED ein/aus
sbit Kontrollleuchte = P0_DATA^0;
unsigned long zaehlwert = 0;
unsigned long messwert_rot = 0;
unsigned long messwert_blau = 0;
unsigned long messwert_gruen = 0;
unsigned long farbe=1;
unsigned int i;
// S0 S1 MAx. Ausgangsfrequenz frequ. skalierung | S2 S3 Filter
// 1 1 600 kHz 100% | 0 0 red
// 1 0 120 kHz 20% | 0 1 blue
// 0 1 12 kHz 2% | 1 0 none
// 0 0 --- power down | 1 1 green
void main (void) {
MAIN_vInit();
while(1){
ausgabe();
for(i = 0; i <= 50000;i++); //Pausen für genaues ablesen der messwerte
for(i = 0; i <= 50000;i++);
// for(i = 0; i <= 50000;i++);
}
}
void ausgabe(void){
lcd_curs(0);
lcd_str("Rot: ");
lcd_byte(messwert_rot); //Ausgabe der Farbe(durch zählwert)
lcd_curs(20);
lcd_str("Blau: ");
lcd_byte(messwert_blau);
lcd_curs(40);
lcd_str("Gruen: ");
lcd_byte(messwert_gruen);
}
void timer(void){ //Timer
TR0 = 0;
TF0 = 0;
TH0 = 0;
TL0 = 0;
TR0 = 1;
//while(TF0 == 0);
}
void ScanRot(void){
LED = 1;
S2 = 0; //s2 = welcher farbwert P0_DATA^4;
S3 = 0; //s3 = welcher farbwert P0_DATA^5;
}
void ScanBlau(void){
S2 = 0; //s2 = welcher farbwert P0_DATA^4;
S3 = 1; //s3 = welcher farbwert P0_DATA^5;
}
void ScanGruen(void){
S2 = 1; //s2 = welcher farbwert P0_DATA^4;
S3 = 1; //s3 = welcher farbwert P0_DATA^5;
}
void MAIN_vInit(void){
INT_vInit();
EA = 1;
//P1_DIR = 0x04;
P0_DIR = 0xff; //Port0 ausgang
P2_DIR = 0x00; //Port3 eingang
P3_DIR = 0xf1;
TMOD = 0x01;
lcd_init(); //lcd wird init..
lcd_clr();
LED =0;
S0 = 1; //S0= welche frequenz P0_DATA^2;
S1 = 1; //s1 = welche frequenz P0_DATA^3;
S2 = 0; //s2 = welcher farbwert P0_DATA^4;
S3 = 0; //s3 = welcher farbwert P0_DATA^5;
}
void INT_vInit(void){
NMICON = 0x00; // NMI Control Register
IT1 = 0;
EX1 = 1;
EXICON0 = 0x08; // external interrupt trigger select
// register 0
EXICON1 = 0x00; // external interrupt trigger select
// register 1
MODPISEL = 0x00; // peripheral input select register
}
void INT_viExt1(void) interrupt EXT1INT // EXT1INT => ist 2
{
// ubyte => unsigned char
SFR_PAGE(_su0, SST0); // switch to page0
IRCON0 &= ~(ubyte)0x02; // clear EXINT1
// USER CODE BEGIN (IR_IsrExt1,3)
Kontrollleuchte = ~Kontrollleuchte; //Kontrollleuchte 1 für rest
if(OUT == 1){ //Wenn der ausgang(Farbsensor) log.1 zählt der timer die zeit wie lange log.1
timer();
}else if (OUT == 0){
TR0 = 0;
zaehlwert = (TH0 << 8 ) + TL0; //zählwert wird
if(farbe == 1){
messwert_rot = zaehlwert ;
}else if(farbe == 2 ){
messwert_blau = zaehlwert ;
}else if(farbe == 3 ){
messwert_gruen = zaehlwert ;
}
farbe++;
if (farbe == 1){
LED = 1; //rot
S2 = 0; //s2 = welcher farbwert P0_DATA^4;
S3 = 0; //s3 = welcher farbwert P0_DATA^5;
}else if(farbe == 2){
S2 = 0; //s2 = welcher farbwert P0_DATA^4;
S3 = 1; //s3 = welcher farbwert P0_DATA^5; blau
}else if(farbe == 3){
S2 = 1; //s2 = welcher farbwert P0_DATA^4; grün
S3 = 1; //s3 = welcher farbwert P0_DATA^5;
}else if(farbe == 4){
farbe = 0;
S2 = 1;
S3 = 0;
}
}
IE1=0;
// USER CODE END
SFR_PAGE(_su0, RST0); // restore the old SCU page
}
wir haben ein problem bei der programmierung unseren Farbsensors und zwar, gibt er uns komische werte zurück und wir wissen nicht recht was falsch ist, da er zu 100% richtig angeschlossen ist.
Kann uns jemand weiterhelfen??
//#include "MAIN.H"
#include <xc886.h>
#include "lcd800.c"
/*
extern void lcd_init(void); // Init LCD
extern void lcd_clr(void); // LCD Löschen
extern void lcd_byte(char); // Ausgabe unsigned char => 3 stellig
extern void lcd_str(char *ptr);// Ausgabe String
extern void lcd_curs(char); // Cursor setzen
*/
void MAIN_vInit(void);
void INT_vInit(void);
void timer(void);
void init(void);
void ScanRot(void);
void ScanGruen(void);
void ScanBlau(void);
void ausgabe(void);
sbit OUT = P3_DATA^3; //impuls
sbit S0 = P0_DATA^2; //S0= welche frequenz
sbit S1 = P0_DATA^3; //s1 = welche frequenz
sbit S2 = P0_DATA^4; //s2 = welcher farbwert
sbit S3 = P0_DATA^5; //s3 = welcher farbwert
sbit LED = P3_DATA^0; //LED ein/aus
sbit Kontrollleuchte = P0_DATA^0;
unsigned long zaehlwert = 0;
unsigned long messwert_rot = 0;
unsigned long messwert_blau = 0;
unsigned long messwert_gruen = 0;
unsigned long farbe=1;
unsigned int i;
// S0 S1 MAx. Ausgangsfrequenz frequ. skalierung | S2 S3 Filter
// 1 1 600 kHz 100% | 0 0 red
// 1 0 120 kHz 20% | 0 1 blue
// 0 1 12 kHz 2% | 1 0 none
// 0 0 --- power down | 1 1 green
void main (void) {
MAIN_vInit();
while(1){
ausgabe();
for(i = 0; i <= 50000;i++); //Pausen für genaues ablesen der messwerte
for(i = 0; i <= 50000;i++);
// for(i = 0; i <= 50000;i++);
}
}
void ausgabe(void){
lcd_curs(0);
lcd_str("Rot: ");
lcd_byte(messwert_rot); //Ausgabe der Farbe(durch zählwert)
lcd_curs(20);
lcd_str("Blau: ");
lcd_byte(messwert_blau);
lcd_curs(40);
lcd_str("Gruen: ");
lcd_byte(messwert_gruen);
}
void timer(void){ //Timer
TR0 = 0;
TF0 = 0;
TH0 = 0;
TL0 = 0;
TR0 = 1;
//while(TF0 == 0);
}
void ScanRot(void){
LED = 1;
S2 = 0; //s2 = welcher farbwert P0_DATA^4;
S3 = 0; //s3 = welcher farbwert P0_DATA^5;
}
void ScanBlau(void){
S2 = 0; //s2 = welcher farbwert P0_DATA^4;
S3 = 1; //s3 = welcher farbwert P0_DATA^5;
}
void ScanGruen(void){
S2 = 1; //s2 = welcher farbwert P0_DATA^4;
S3 = 1; //s3 = welcher farbwert P0_DATA^5;
}
void MAIN_vInit(void){
INT_vInit();
EA = 1;
//P1_DIR = 0x04;
P0_DIR = 0xff; //Port0 ausgang
P2_DIR = 0x00; //Port3 eingang
P3_DIR = 0xf1;
TMOD = 0x01;
lcd_init(); //lcd wird init..
lcd_clr();
LED =0;
S0 = 1; //S0= welche frequenz P0_DATA^2;
S1 = 1; //s1 = welche frequenz P0_DATA^3;
S2 = 0; //s2 = welcher farbwert P0_DATA^4;
S3 = 0; //s3 = welcher farbwert P0_DATA^5;
}
void INT_vInit(void){
NMICON = 0x00; // NMI Control Register
IT1 = 0;
EX1 = 1;
EXICON0 = 0x08; // external interrupt trigger select
// register 0
EXICON1 = 0x00; // external interrupt trigger select
// register 1
MODPISEL = 0x00; // peripheral input select register
}
void INT_viExt1(void) interrupt EXT1INT // EXT1INT => ist 2
{
// ubyte => unsigned char
SFR_PAGE(_su0, SST0); // switch to page0
IRCON0 &= ~(ubyte)0x02; // clear EXINT1
// USER CODE BEGIN (IR_IsrExt1,3)
Kontrollleuchte = ~Kontrollleuchte; //Kontrollleuchte 1 für rest
if(OUT == 1){ //Wenn der ausgang(Farbsensor) log.1 zählt der timer die zeit wie lange log.1
timer();
}else if (OUT == 0){
TR0 = 0;
zaehlwert = (TH0 << 8 ) + TL0; //zählwert wird
if(farbe == 1){
messwert_rot = zaehlwert ;
}else if(farbe == 2 ){
messwert_blau = zaehlwert ;
}else if(farbe == 3 ){
messwert_gruen = zaehlwert ;
}
farbe++;
if (farbe == 1){
LED = 1; //rot
S2 = 0; //s2 = welcher farbwert P0_DATA^4;
S3 = 0; //s3 = welcher farbwert P0_DATA^5;
}else if(farbe == 2){
S2 = 0; //s2 = welcher farbwert P0_DATA^4;
S3 = 1; //s3 = welcher farbwert P0_DATA^5; blau
}else if(farbe == 3){
S2 = 1; //s2 = welcher farbwert P0_DATA^4; grün
S3 = 1; //s3 = welcher farbwert P0_DATA^5;
}else if(farbe == 4){
farbe = 0;
S2 = 1;
S3 = 0;
}
}
IE1=0;
// USER CODE END
SFR_PAGE(_su0, RST0); // restore the old SCU page
}