Hallo mein Code:
Code:
#define edelay3(tacktschritte){ \
int a=tacktschritte; \
uint8_t b=tacktschritte%3; \
{\
a=a/3; \
uint8_t register hilf; \
asm volatile( \
"ldi %1,%0\n" \
"edelay3_%=:\n" \
"dec %1\n" \
"BRNE edelay3_%=\n" \
: : "M" (a),"r" (hilf) ); \
hilf=0; \
}\
if(b==0){ \
asm(";"); \
} \
if(b==1){ \
asm("NOP\n"); \
} \
if(b==2){ \
asm("NOP\nNOP\n"); \
} \
if(b==3){ \
asm("NOP\nNOP\nNOP\n"); \
} \
}
Funktioniert eigentlich bis auf die Warnmeldung prächtig.
Ich würde gerne schreiben hilf=a, das problem ist aber, es wird bei Schleifen manchmal verschoben, dass hilf nicht neu geladen wird.
Voltaile schreibt das doch aber die Variable nur immer ins Ram?
Ich hoffe Du kannst mir helfen.
Der Main C Code:
Code:
#include <avr/io.h>
#include <edelay.h>
#define us_port PORTC
#define us_ddr DDRC
#define us_pin 0
// #if F_CPU==1000000
// #error "aa";
// #endif
void ultraschall_sendc(uint8_t burst){
uint8_t i;
us_ddr|=(1<<us_pin);
i=burst;
//hier wird hilf geladen
do{
//hier müsste hilf geladen werden
us_port|=(1<<us_pin);
//hier hilf modifiziert
edelay(((F_CPU/1000000)*15)-5);
us_port&=~(1<<us_pin);
edelay(((F_CPU/1000000)*15)-8);
i--;
}while(i!=0);
uint8_t l=20;
while(l!=0){
edelay(690);
l=l--;
}
us_ddr&=~(1<<us_pin);
}
int main(void){
while(1){
ultraschall_sendc(20);
}
return 0;
}
Grüße
Lesezeichen