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...
Lesezeichen