hallo,
ich habe jetzt einen code umgeschrieben:
der timer funktioniert auch soweit, der ECHO anschluss funktioniert aber nur auf PD6, hier noch ein codeschnipsel:Code:#include "RP6ControlLib.h" #include "RP6I2CmasterTWI.h" #include "RP6Control_MultiIOLib.h" #include "RP6Control_I2CMasterLib.h" #include "RP6Control_LFSBumperLib.h" #include "RP6ControlServoLib.h" #include "RP6Control_OrientationLib.h" #include "standard.h" /***************/ volatile uint16_t timestamp_last = 0; volatile uint16_t zeit = 0; uint16_t distanz = 0; void trig(void) { PORTC |= (1<<PC6);//Trig high _delay_us(12); PORTC &= ~(1<<PC6);//TRIG auf low } ISR(TIMER1_CAPT_vect) { //Wenn steigende Flanke if(TCCR1B & (1<<ICES1)) { //Flankenerkennung auf fallend TCCR1B ^= (1<<ICES1); //aktuelen timer-wert speichern timestamp_last = ICR1; } //fallende Flanke else { //Flankenerkennung auf steigend TCCR1B ^= (1<<ICES1); //Laufzeit = aktueller timerwert - vorheriger timerwert zeit = ICR1 - timestamp_last; } } int main(void) { /**************/ initRP6Control(); multiio_init(); initLCD(); /**************/ DDRC |= (1 << PC6);//Trig als Ausgang PORTC &= ~(1<<PC6);//TRIG auf low DDRD &= ~(1<<PD6);//Echo als Eingang PORTD &= ~(1<<PD6);//ECHO pullup AUS //PC7: // DDRC |= IO_PC7; //Pin PC7 als Ausgang // PORTC |= IO_PC7; //Auf HIGH setzen // PORTC |= (1<<PC7);//internen Pull-Up an PC7 aktivieren // PORTC &= ~IO_PC7; //Auf LOW setzen DDRC &= ~(1<<PC7); //Pin PC7 als Eingang (ECHO) PORTC &= ~(1<<PC7);//ECHO pullup aus /*************/ setCursorPosLCD(1, 0); writeStringLCD("ultraschall_test_4"); mSleep(1500); /*************/ //Timer konfigurieren TCCR1A = 0; // normal mode, keine PWM Ausgänge //Noise Canceler aktivieren, Flankenerkennung auf steigende, Prescaler auf 64 TCCR1B |= (1<<ICNC1) | (1<<ICES1) | (1<<CS11) |(1<<CS10); //ICP Interrupt aktivieren TIMSK |= (1<<TICIE1); //Globale Interrupts aktivieren sei(); while(1) { //Entfernung aus Laufzeit berechnen distanz = (zeit*4)/58; /******LCD ausgabe*******/ /* setCursorPosLCD(1, 0); writeStringLCD("zeit "); setCursorPosLCD(1, 8); writeIntegerLCD (zeit, DEC); setCursorPosLCD(1, 15); writeStringLCD("us "); mSleep(500); setCursorPosLCD(3, 0); writeStringLCD("distanz "); setCursorPosLCD(3, 8); writeIntegerLCD (distanz, DEC); setCursorPosLCD(3, 15); writeStringLCD("cm "); mSleep(500); clearLCD(); */ /************/ /*****terminal ausgabe*******/ writeString("zeit: "); writeIntegerLength(zeit, DEC, 4); writeString(" "); writeIntegerLength(distanz, DEC, 4); writeChar('\n'); mSleep(200); /************/ //Messung auslösen trig(); _delay_ms(50); } return 0; }
der versuch auf PC7 "umzuschalten" funktioniert aber nicht, obwohl mir die beiden definitionen fürs ECHO am PD6 und PC7 schon vergleichbar scheinen... - so wie es ist müssten eigentlich PD6 und PC7 als eingänge funktionieren, oder?Code:DDRC |= (1 << PC6);//Trig als Ausgang PORTC &= ~(1<<PC6);//TRIG auf low DDRD &= ~(1<<PD6);//Echo als Eingang PORTD &= ~(1<<PD6);//ECHO pullup AUS //PC7: // DDRC |= IO_PC7; //Pin PC7 als Ausgang // PORTC |= IO_PC7; //Auf HIGH setzen // PORTC |= (1<<PC7);//internen Pull-Up an PC7 aktivieren // PORTC &= ~IO_PC7; //Auf LOW setzen DDRC &= ~(1<<PC7); //Pin PC7 als Eingang (ECHO) PORTC &= ~(1<<PC7);//ECHO pullup aus
gibt es dafür eine erklärung? btw. alle jumper auf dem jumperblock der freien I/Os auf der multiIO habe ich vorsichtshalber entfernt...







Zitieren

Lesezeichen