Hi Dirk,
Zitat von
Dirk
Die Abfrage der Pins ist ja nicht abhängig von einer Programm-Variante.
D.h.: Die Pins werden immer gleich abgefragt (wie es in deiner 1. Version ja schon klappt).
offensichtlich haperts aber gerade daran , weil er nie in die abfragenschleife
Code:
blockierend:
loop_until_bit_is_set(PINC, PC5);
nicht blockierend:
if ( PINC & (1<<PINC5) )
{}
reingeht...
der sensor ist genauso angeschlossen wie bei der blockierenden version, sind es evtl. wieder irgendwelche zeitablauf-probleme?
Zitat von
Dirk
Eine quasi nicht blockierende (bzw. wenig blockierende) Programmversion könnte so aussehen:
Eine Task in der schnellen Hauptschleife:
- Wenn (Stopwatch2 > 60):
-- imp_flag löschen (LOW)
-- Stopwatch2 zurück setzen auf 0
- Sendet Triggerimpuls (nur wenn NOT imp_flag!!) und setzt dann ein Flag (nennen wir es "imp_flag"), dass der Impuls erfolgt ist.
- Testet bei jedem Durchlauf den Pegel an Echo (nur wenn imp_flag == HIGH!!) :
-- Wenn Echo == LOW:
--- echo_low Flag setzen (HIGH)
--- Wenn active Flag == HIGH:
---- Stopwatch1 lesen und Wert berechnen (evtl. Flag setzen, dass Wert vorliegt & angezeigt werden kann!)
---- active Flag löschen (LOW)
---- Stopwatch2 zurück setzen auf 0
-- Oder wenn Echo == HIGH:
--- Wenn echo_low Flag == HIGH:
---- Stopwatch1 zurück setzen auf 0
---- echo_low Flag löschen (LOW)
--- Oder wenn echo_low Flag == LOW:
---- active Flag setzen (HIGH)
Achtung:
Nicht getestet und nur so hingeschrieben (es können also auch noch logische Fehler drin sein!).
Also nicht rein schematisch umsetzen, sondern die Logik nachvollziehen und dann erst in ein Programm umsetzen!
ich habe versucht Dein vorschlag, so weit ich die "dutzende von flags " nachvollziehen konnte umzusetzen, bei mir sind es letztendlich zwei:
Code:
uint8_t trig_gesendet, echo_empfangen;
Code:
#include "RP6ControlLib.h"
#include "RP6Control_MultiIOLib.h"
//#include "standard.h"
#include "RP6Stopwatch0Lib.h"
volatile uint16_t zeit;
double distanz;
uint8_t trig_gesendet, echo_empfangen;
void writeDouble(double number, uint8_t width, uint8_t prec)
{
char buffer[width + 1];
dtostrf(number, width, prec, &buffer[0]);
writeString(&buffer[0]);
}
void trig_PC6(void)
{
PORTC |= (1<<PC6);//Trig high
_delay_us(12);
PORTC &= ~(1<<PC6);//TRIG auf low
}
int main(void)
{
initRP6Control();
multiio_init();
initLCD();
DDRC |= (1 << PC6);//Trig als Ausgang
PORTC &= ~(1<<PC6);//TRIG auf low
DDRC &= ~(1<<PC5);//Echo als Eingang
PORTC &= ~(1<<PC5);//ECHO pullup AUS (Echo auf LOW)
writeString_P("\n\n HC-SR-04 mit PC6 (trig,gruen) / PC5 (echo, gelb) zaehlschleife frei_1ms\n\n");
writeChar('\n');
startStopwatch02();
while(1)
{
if (getStopwatch02() > 60)
{
if (trig_gesendet == 0)
{
trig_gesendet = 0;
trig_PC6();
setStopwatch02(0);
trig_gesendet = 1;
while(1)
{
if (trig_gesendet == 1)
{
if ( PINC & (1<<PINC5) )
{
zeit = getStopwatch02();
echo_empfangen = 1;
distanz = ((zeit/2)*3.43);
setStopwatch02(0);
//Werte ausgeben
writeString(" zeit: ");
writeIntegerLength(zeit, DEC, 4);
writeString(" distanz: ");
writeDouble(distanz, DEC, 1);
writeString(" cm");
writeChar('\n');
}
else
{
echo_empfangen = 0;
trig_gesendet = 0;
setStopwatch02(0);
break;
}
}
}
echo_empfangen = 0;
trig_gesendet = 0;
setStopwatch02(0);
}
echo_empfangen = 0;
trig_gesendet = 0;
setStopwatch02(0);
}
echo_empfangen = 0;
trig_gesendet = 0;
setStopwatch02(0);
}
return 0;
}
dies hier am ende jeder schleife ist mehr oder weniger ein verzweifelter versuch:
Code:
echo_empfangen = 0;
trig_gesendet = 0;
setStopwatch02(0);
geholfen hats nicht...
danke für Deine zeit...
Lesezeichen