PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CMPS03 PWM über Port INT0 auslesen (erledigt)



Ceos
02.01.2008, 12:31
mir schwirren sehr gegensätzlicher ansätze zum auswerten im kopf ... bitte hilf mir mal wer weiter, ich will auslesen ob der pegel an Port INT0 aka PD2 auf high steht ... wie muss ich die bedingung formulieren ... in PORTD schreiben iss ja recht einfach ... aber immer wenn ich einen vergleich mache, kommt da nur mist raus

damaltor
02.01.2008, 13:03
du stellst den pin auf eingang:
DDRD |= 0x02;
falls du die internen pullup-widerstände verwenden willst, schreibst du das ins ausgaberegister:
PORTD |= 0x02;
um nun den status einzulesen, machst du:
if(PIND & 0x02){anweisung();}

dabei ist PIND das register in dem die aktuellen pinzustände stehen, es wrd durhc das "&0x02" auf das zweite bit maskeirt. wenn jetzt der ert noch größer als null ist, ist die bedingung wahr.

Ceos
02.01.2008, 13:09
lol ... dann muss ich was beim aufbau falsch gemacht haben -.- genau das hab ich auch ARGH ... danke jedenfalls

damaltor
02.01.2008, 13:44
viel glück... :D

Ceos
02.01.2008, 18:51
unsigned char phigh;

void StartExtInt(void)
{
PORTD |= PD2;
// DDRD |= PD2; // CON2 (RED_LED) auf Input => ext. Int 0
MCUCR |= ((1 << ISC00) | (1 << ISC01)); // High level interrupt
GICR |= (1 << INT0); // interrupt aktiviren
}

void StopExtInt(void)
{
GICR &= ~(1 << INT0); // Interrupt löschen
MCUCR &= ~((1 << ISC00) | (1 << ISC01)); // low level set
}

SIGNAL (SIG_INTERRUPT0)
{
StopExtInt();
while(!(PIND & (1 << PD2)));
mybase = 0;
phigh = 1;
}



int main(void)
{
unsigned int mem;
phigh = 0;
Init(); // initialise the processor
SerWrite("Start", 5);
StartExtInt();
SerWrite("Run", 3);
StatusLED(GREEN);
//OFF,GREEN,YELLOW,RED
sei();
while(1) {
if((phigh == 1) && !(PIND & (1 << PD2))) {
mem = mybase;
SerWrite((unsigned char*)&mem, sizeof(mem));
SerWrite("\n", 1);
StartExtInt();
phigh = 0;
}
}
return 0;
}



also WENN ich den pin manuell auf high lege geht es und er misst mir auch ne zeit aus ... wenn cih das cmps03 anschliesse pasiert nix mehr ... aber ich hatte ihn schonmal so weit das er permanent den interrupt ausgelöst hat Q_Q was mach ich falsch ?!

also das signal liegt am con2 an also int0 und damit pd2 .... aber es passiert nix ....

damaltor
03.01.2008, 00:48
problem könnte sein dass du einen high level interrupt willst, aber gleichzeitig die pullups aktivierst. versuche, einen flankeninterrupt zu nutzen.

Ceos
03.01.2008, 07:45
ok batterien gewechselt und siehe da es geht ! hab nen bc548 dazwischen "gefreiverdrahet" und funktioniert super! ausrichten, kalibrieren, programm starten und er orientiert sich sehr gut ^^ er eiert ein wenig um die max. 1° bei mir aber das recht rhytmisch, sodass ich es mit ein wenig mitteln der werte ausgleichen kann.

damaltor
03.01.2008, 13:09
sehr gut!....was wird denn ausgelesen? was generiert den interrupt?

Ceos
03.01.2008, 21:50
also ich bekomme werte zwischen 70 und 2720, wenn ich den kompass kalibriere dann ist es recht genau, auch wenn die südrichtung manchmal nicht GANZ hinhaut .... ich werd ne doppelte kalibrierung machen müssen, einmal sensor, dann die himmelsrichtungen einspeichern.
zum fahren funktioniert es super, ich messe odometrie immer wenn ich einen impuls gemessen habe und sammel die werte am PC, ist ziemlich genau geworden, eiert ein wenig, aber bei den impulsabständen gleicht sich das gut aus

damaltor
03.01.2008, 23:12
sehr gut. wie wären die werte denn ideal?

Ceos
04.01.2008, 09:59
laut datenblatt liegt die auflösung bei 0.1° , die genauigkeit jedoch liegt unkalibriert bei 3-4° und kalibriert bei 1°
kalibrieren kann ich den sensor scheinbar in jede richtung, aber die stabilsten werte bekomme ich wenn cih ihn in echter nord-südrichtung kalibriere
ich schiess mal n foto vom asuro und hängs mitm "edit" an

EDIT: http://img255.imageshack.us/img255/4751/asurocmps03vu8.jpg
hab das modul nach ganz weit hinten oben verlegt wegen motoren und ihren feldern.
der taster auf der platine oben dient zum kalibrieren, die LED zeigt an das er noch am kalibrieren ist.
stromverbrauch 20mA das modul und 20mA über den freiverdrahteten transistor ... der brückt von vcc zu con2 ... da hängt die status-LED dran, deshalb wahrscheinlich 20mA ... wenn ich einen widerstand dazwischenhänge wirds allerdings kritisch mit dem pegel wie mir scheint, dann bekomme ich nämlich wieder keinen interrupt.

roboterheld
04.01.2008, 10:17
.....kalibrieren kann ich den sensor scheinbar in jede richtung,......


du kannst den cmps03 nur im freien kalibieren, wo keine leitungen und metallteile in der nähe liegen und natürlich mit einem kompass. du musst alle 4 richtungen abtasten.

in wohnungen ist der cmps03 schecht geeignet, weil überall elektrische störungen verbaut sind oder metallgegenstände verbaut sind oder herumliegen. dadurch wird der cmps03 in innenräumen zum schätzeisen.

Ceos
04.01.2008, 13:18
auch wenn du nicht mehr antworten kannst .... lesen kannst du sicher ... er funktioniert BESTENS ... weis ja nicht ob deiner kaputt war .. ich kann ihn zwar in jede richtung kalibrieren allerding hauen die werte dann echt nicht mehr hin ... die schwanken dann stark ... also wenn cih ihn um 10° drehe mess cih dann hier mal 15° und da mal 20° und dort mal nur 5° ... aber in der wohung funktioniert er tadellos! ... ich hab das pwn signal mit einem oszilloskop gemessen ... ich hab von deinem topic iwie mehr probleme erwartet, wurde aber glücklicherweise nicht bestätigt

damaltor
04.01.2008, 20:19
hrhr... keine flamewars bidde.... :D

Ceos
05.01.2008, 01:34
flamewars ... du bist gut .... roboterheld wurde kurz nach seiner antwort gesperrt >_< du hast da was missverstanden

falls da oben irgendwas provozierendes steht ... oder so verstanden wird... tut mir leid, war niemals so gemeint

EDIT: es war eher euphorisch (wie schreibt man das ..... ouh mann deutschunterricht im studium iss vll. keine schlechte idee man rostet immer wieder ein)

damaltor
05.01.2008, 11:12
hrhr nee passt schon. ich dachte roboterheld wäre bereits gesperrt. auch egal jetz :D