Witajcie,
Ostatnie moje problemy (tu na grupie poruszane) z obsługą uarta na atmelkach stały się moim gwoździem do trumny bascoma i w końcu się zawziąłem na C, choć zabierałem się do tego już od roku jak pies do jeża. No to na początek, standardowo pomrugamy diodą. Ot taki programik:
#define F_CPU 16000000UL #include <avr/io.h>
#include <util/delay.h>
int main(void) { DDRD = 0xFF; PORTD = 0x00; while(1) { PORTD ^= _BV(0); _delay_ms(500); } }
I zonk, na porcie ciągle stan wysoki. Podejrzałem plik .lss i niby wszystko ok, jak patrzę na instrukcję asemblera to powinno działać:
00000038 <main>: 38: 8f ef ldi r24, 0xFF 3a: 81 bb out 0x11, r24 3c: 12 ba out 0x12, r1 3e: 91 e0 ldi r25, 0x01 40: 82 b3 in r24, 0x12 42: 89 27 eor r24, r25 44: 82 bb out 0x12, r24 46: ef ef ldi r30, 0xFF 48: ff e3 ldi r31, 0x3F 4a: 31 97 sbiw r30, 0x01 4c: f1 f7 brne .-4 4e: 00 c0 rjmp .+0 50: f7 cf rjmp .-18Ale niestety nie działa, stan na porcie zmienia się bez opóźnienia. A teraz ciekawostka, zamiast wykorzystywać funkcję _delay_ms wstawiłem swoją:
void delay(void) { uint16_t i; for (i=0;i<15000;i++); }
Patrzę na plik .lss, a tu:
00000038 <delay>: 38: 88 e9 ldi r24, 0x98 3a: 9a e3 ldi r25, 0x3A 3c: 01 97 sbiw r24, 0x01 3e: f1 f7 brne .-4 40: 08 95 ret 00000042 <main>: 42: 8f ef ldi r24, 0xFF 44: 81 bb out 0x11, r24 46: 12 ba out 0x12, r1 48: 91 e0 ldi r25, 0x01 4a: 82 b3 in r24, 0x12 4c: 89 27 eor r24, r25 4e: 82 bb out 0x12, r24 50: fc cf rjmp .-8Wychodzi na to, że po przełączeniu bitu PD0 w ogóle nie wywołuje funkcji delay() - no i port tak właśnie się zachowuje, w kółko się przełącza.
Obstawiam opcję, że ja czegoś nie rozumie, ale może ktoś mnie oświeci.