Страница 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
ОКе, всем спасибо!! Вроде разобрался как зажечь :)
А вот как на Си задержку сделать?!
Вот у меня кусок кода:

Код: Выделить всё

while (1)
      {
PORTB=0x00;
      }
при подаче 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 писал(а): Кроме того, где у вас Эл-Си-Ди ГотоХУ?
Эт у меня было перед этим всем. Возможно есть более гуманный способ считать такие цифры и выводить их на ЖКИ.