hallo,

ich habe jetzt einen code umgeschrieben:

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 timer funktioniert auch soweit, der ECHO anschluss funktioniert aber nur auf PD6, hier noch ein codeschnipsel:


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

gibt es dafür eine erklärung? btw. alle jumper auf dem jumperblock der freien I/Os auf der multiIO habe ich vorsichtshalber entfernt...