Страница 1 из 1
Atmega8 Проблема с простейшим кодом
Добавлено: Сб май 09, 2009 04:05:39
Legolas
Доброе время суток всем!
Почитал обучалку, начал писать..
У меня светодиод стоит на PB5 (SCK). Нужно его зажечь (Во время прошивки горит).
Порассуждав, написал:
Код: Выделить всё
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc"
.def Temp=R16
.cseg
.org 0
ldi Temp, 0b11111111
out DDRB,Temp
ldi Temp,0b11111111
out PortB,Temp
По идее, должно работать, или я не прав?
Попробовал написать на С:
Код: Выделить всё
#include <stdio>
#include <MEGA8>
int main (void)
{
DDRB = 0xFF;
while(1)
{
PORTB = 0xFF;
}
}
Тоже ничего загораться не хочет
Что я тут перепутал?! Подскажите плиз!
Желательно, конечно, на Си..
Добавлено: Сб май 09, 2009 06:16:14
Max_Electro
Вот так, как то, если не ошибаюсь!
Написано в Avr Studio!
#include <avr>
#include <avr>
int main ()
{
DDRB = 0xFF; //Порт B - как выход;
PORTB = 0x00; //На всех ножках 0 В;
if (;;)
{
PORTB = 0xFF; -> PORTB |= 1<<x;
//где х - это номер ножки!
}
}
Добавлено: Сб май 09, 2009 09:16:49
ARV
Legolas, ваши программы
не могут не работать!

только вот вы не указали, как подключили светодиод: очень многие любят подключать их катодом на вывод МК и анодом на плюс питания. так вот, в этом случае для зажигания светодиода надо выводить НУЛИ в порт, а не единицы, как у вас. для вашей программы надо подключать светодиод анодом на вывод МК, катодом на общий провод.
Добавлено: Вс май 10, 2009 10:37:37
YurkaM
Legolas и ещё в варианте на АСМе надо бы зациклить программу, типа loop: rjmp loop
Добавлено: Вс май 10, 2009 17:04:16
sachok
Добавлено: Вс май 10, 2009 17:43:26
Foks
В Си тоже не мешало-бы зациклить while(1);, а то начнет процедуру main() бесконечно повторять. Насчет светодиода, лучше сразу делать мигалку на таймере, тогда можно обыкновенным тестером на ножке МК увидеть, что же там происходит. Как реализовать таймер на Си я не знаю, умею только на асме.
Добавлено: Пн май 11, 2009 13:11:36
sachok
Есть проблема когда вывожу показания на ЖКИ, вот таким методом:
Код: Выделить всё
if (way>99999 && way<999999)
{
lcd_putsf("S=");
lcd_putchar (way/100000+0x30);
lcd_putchar ((way/10000)%10+0x30);
lcd_putchar ((way/1000)%10+0x30);
lcd_putsf(".");
lcd_putchar ((way/100)%10+0x30);
lcd_putchar ((way/10)%10+0x30);
lcd_putchar ((way/1)%10+0x30);
lcd_putsf("km");
}
Proteus выдает ошибку:

Что делать?
Добавлено: Пн май 11, 2009 13:12:44
Legolas
ОКе, всем спасибо!! Вроде разобрался как зажечь

А вот как на Си задержку сделать?!
Вот у меня кусок кода:
при подаче 0x00 он загорается, мне нужно, чтобы мигал

Добавлено: Пн май 11, 2009 13:39:56
Legolas
сам разобрался

Добавлено: Вт май 12, 2009 23:00:25
Skrrmrchoh
sachok писал(а):
Proteus выдает ошибку...
...Что делать?
А это значит, что получившееся 0хFFFFF8C1 не помещается в память программ, которая всего- то имеет размер 0х2000
Видимо, из-за этих сумасшедших делений. Потому и вотчдог ругается.
Кроме того, где у вас Эл-Си-Ди ГотоХУ?
Добавлено: Вт май 12, 2009 23:27:53
sachok
Skrrmrchoh писал(а):
Кроме того, где у вас Эл-Си-Ди ГотоХУ?
Эт у меня было перед этим всем. Возможно есть более гуманный способ считать такие цифры и выводить их на ЖКИ.