Gast
#918046
hallo, ich wollte mit dem avrstudio dieses programm testen.
wenn ich den breakpoint setzen möchte, geht nur bei der delay_ms , nicht
bei der delay_us.
wenn ich ihn bei delay_us setzen will , springt er automatisch zu
nächsten delay_ms?
die delay.c habe ich mit in der makefile eingebaut:
SRC = $(TARGET).c delay.c
warum das?
#include <avr/io.h>
#include "delay.h"
int main(void)
{
delay_us(1);
delay_us(7);
delay_us(8);
delay_ms(3);
delay_ms(14);
}
die delay.h :
#include <avr/io.h>
static inline void delayloop16(uint16_t count)
{
asm volatile ( "cp %A0,__zero_reg__ \n\t" \
"cpc %B0,__zero_reg__ \n\t" \
"breq L_Exit_%= \n\t" \
"L_LOOP_%=: \n\t" \
"sbiw %0,1 \n\t" \
"brne L_LOOP_%= \n\t" \
"L_Exit_%=: \n\t" \
: "=w" (count)
: "0" (count)
);
}
#define delay_us_conv(us)
((uint16_t)(((((us)*1000l)/(1000000000/F_CPU))-1)/4))
#define delay_us(us) delayloop16(delay_us_conv(us))
void delayloop32( uint32_t l); // not inline
#define delay_ms_conv(ms) ( (uint32_t) (ms*(F_CPU/6000l)) )
#define delay_ms(ms) delayloop32(delay_ms_conv(ms))
die delay.c :
#include "delay.h"
void delayloop32(uint32_t loops)
{
_asm_ volatile ( "cp %A0,__zero_reg__ \n\t" \
"cpc %B0,__zero_reg__ \n\t" \
"cpc %C0,__zero_reg__ \n\t" \
"cpc %D0,__zero_reg__ \n\t" \
"breq L_Exit_%= \n\t" \
"L_LOOP_%=: \n\t" \
"subi %A0,1 \n\t" \
"sbci %B0,0 \n\t" \
"sbci %C0,0 \n\t" \
"sbci %D0,0 \n\t" \
"brne L_LOOP_%= \n\t" \
"L_Exit_%=: \n\t" \
: "=w" (loops) \
: "0" (loops) \
); \
return;
}