уважаемые! делать ассемблерные вставки в сишном коде для того, чтобы дрыгнуть ножкой МК - а вы вообще зачем за Си взялись?! это изврат

и советую сразу стараться писать программы так, чтобы не делать лишнего. в частности, что ваша программа делает? она
через равные промежутки времени меняет уровень на пине - так? вот и надо писать буквально то же самое, но на языке Си. В буквальном переводе на человеческий ваша программа делает следующее:
бесконечно делает такое: сначала устанавливает 1 в пине, затем ждет определенный интервал, затем устанавливает 0 на том же самом пине, и снова ждет тот же самый интервал. согласитесь, что это немного избыточно по сравнению с тем, что на самом деле она делает (как я сформулировал). то есть даже в такой простенькой задачке вы
написали НЕ ТО, что ХОТЕЛИ. если будете и далее придерживаться такого принципа, вы можете наделать кучу таких ошибок, что и сами голову сломаете, и желающих помогать не найдете.
вот как на самом деле должна выглядеть ваша программа:
Код: Выделить всё
while(1){
PORTC ^= _BV(PC0); // меняем уровень пина
_delay_ms(20); // ждем требуемый интервал
}
Напоминаю, что операция
^ означает "побитное исключающее или". макрос
_BV(x) - это стандартный макрос для WinAVR (
пользуйтесь им!), он определен так:
#define _BV(x) (1 << (x))
по сути он устанавливает один-единственный бит в байте. указывая в качестве параметра этого макроса
ИМЯ соответствующего пина (в данном случае
PC0) вы автоматически получаете возмоджность работать именно с этим битом. использовать нормера битов вместо их имен - не советую.
о том, как отдельные биты устанавливать и сбрасывать, а так же о кое чем еще, я написал
небольшой FAQ.