Перейти к содержанию
    

Шпак индикатор мигающий каждую секунду

/*Индикатор, мигающий каждую секунду AT90S8515

К выводу 0 порта В подключен светодиодный индикатор, который должен переключаться каждую секунду.

Это можно сделать с помощью прерывания при переполнении таймера.

Воспользуемся, например, таймером/счетчиком Т/С1.

С помощью разрядов CS10-CS12 регистра TCCR1B устанавливается коэффициент деления частоты системной

синхронизации для тактирования таймера. Выберем коэффициент 1024, что соответствует значению 0b101

или просто 5.

Таким образом, в случае рабочей частоты микроконтроллера в 4 МГц

значение счетного регистра TCNT1 будет увеличиваться через каждые 1024 / 4000000 = 0,000256 с.

Следовательно, необходимо установить такое стартовое значение счетчика, чтобы до его переполнения

отсчитывалось 1 / 0,000256 = 3906 импульсов. Поскольку с помощью 16 разрядов счетчика можно

получить максимальное значение 65535 (0xFFFF), то он должен инициализироваться значением 65536-3906.*/

 

#include <avr/io.h>

#include <avr/interrupt.h> //Для доступа к функции sei()

#include <avr/signal.h> //Для доступа к макросу INTERRUPT

 

#define Freq 4000000 //Частота системной синхронизации в Гц

ISR(TIMER1_OVF_vect) //Подпрограмма обработки прерывания по

{ //переполнению счетчика Т/С1

//Инициализируем счетный регистр значением 61630

TCNT1 = 0x10000 - (Freq / 1024);

PORTB ^= 0x01; //Меняем состояние вывода 0 порта В

}

 

int main (void)

{

DDRB = 0x01; //Вывод 0 порта В — выход

TCCR1A = 0; //Т/С1 отсоединен от вывода ОС1, режим ШИМ отключен

TCCR1B = 5; //Коэффициент деления частоты системной

//синхронизации = 1024

//Инициализируем счетный регистр значением 61630

TCNT1 = 0x10000 - (Freq / 1024);

TIFR = 0; //Сбрасываем все флаги прерываний от Т/С1

TIMSK = 0x80; //Разрешаем прерывание при переполнении Т/С1

GIMSK = 0; //Запрет внешних прерываний

sei(); //Общее разрешение прерываний

while(1) ; //Ожидаем прерывания от Т/С1 каждую секунду

}

 

в результате

 

> "make.exe" all

 

-------- begin --------

avr-gcc (WinAVR 20100110) 4.3.3

Copyright © 2008 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 

 

Compiling C: test1.c

avr-gcc -c -mmcu=atmega16a -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./test1.lst -std=gnu99 -MMD -MP -MF .dep/test1.o.d test1.c -o test1.o

In file included from test1.c:16:

c:/winavr/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."

test1.c: In function 'main':

test1.c:36: error: 'GIMSK' undeclared (first use in this function)

test1.c:36: error: (Each undeclared identifier is reported only once

test1.c:36: error: for each function it appears in.)

make.exe: *** [test1.o] Error 1

 

> Process Exit Code: 2

> Time Taken: 00:00

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В исходном коде написано, что использует аппаратные ресурсы AT90S8515, а компилируете как для процессора atmega16a. В Вашем случае просто выкиньте эту строчку.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#include <avr/io.h>
#include <avr/interrupt.h>  //Для доступа к функции sei() 
#include <avr/signal.h>   //Для доступа к макросу INTERRUPT 

#define Freq 4000000      //Частота системной синхронизации в Гц
ISR(TIMER1_OVF_vect)  //Подпрограмма обработки прерывания по
{    //переполнению счетчика Т/С1
    //Инициализируем счетный регистр значением 61630
    TCNT1 = 0x10000 - (Freq / 1024);
    PORTB ^= 0x01;  //Меняем состояние вывода 0 порта В
}

int main (void)
{
    DDRB = 0x01;     //Вывод 0 порта В — выход
    TCCR1A = 0;      //Т/С1 отсоединен от вывода ОС1, режим ШИМ отключен
    TCCR1B = 5;      //Коэффициент деления частоты системной
                    //синхронизации = 1024
    //Инициализируем счетный регистр значением 61630
    TCNT1 = 0x10000 - (Freq / 1024);
    TIFR = 0x00;       //Сбрасываем все флаги прерываний от Т/С1
    TIMSK = 0x80;      //Разрешаем прерывание при переполнении Т/С1
//    GICR = 0x00;         //Запрет внешних прерываний
    sei();             //Общее разрешение прерываний
    while(1);     //Ожидаем прерывания от Т/С1 каждую секунду
}

 

менял на GICR , потом просто его закомментировал.

хексник конечно появился, но после программирования в МК его, ничего не происходит. То есть по условию задачи должно быть на PB0 мигать (менятся напряжение), чего не происходит.

Там ноль стоит и все.

 

Что ещё можно посмотреть\изменить?

 

можете мне дать примеры кода(просто хочу потестировать) для atmega16a ? Просто шпак устарел вроде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что ещё можно посмотреть\изменить?

1. Проверить систему тактирования (генерит-ли кварц, если не от внутреннего RC-тактируетесь.)

2. Проверить питание и пороги BOD.

3. Отключить watсhdog.

4. Отключить во фьюзах JTAG.

5. Подёргать ножкой без прерываний:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/util/delay.h>

cli();
MCUCR = 0x00;
wdt_disable();
DDRB = 0x01;
for (;;)
{
    PORTB^=1;
    _delay_ms(200);
}

6. И только потом осваивать прерывения.

 

#define Freq 4000000 //Частота системной синхронизации в Гц
А это совершенно лишне, т.к. F_CPU уже должен быть вами определён и спущен из Makefile. Его и стоит использовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

чето у меня даже такое не катит

#include <avr/io.h>

#include <avr/delay.h>

 

int main (void)

{

DDRB = 0xFF;

while(1)

{

_delay_loop_2(300000);

PORTB=0xFF;

_delay_loop_2(3000000);

PORTB=0x00;

}

return 1;

}

 

 

 

компилит нормально

> "make.exe" all

 

-------- begin --------

avr-gcc (WinAVR 20100110) 4.3.3

Copyright © 2008 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 

 

Compiling C: test2.c

avr-gcc -c -mmcu=atmega16a -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./test2.lst -std=gnu99 -MMD -MP -MF .dep/test2.o.d test2.c -o test2.o

In file included from test2.c:2:

c:/winavr/lib/gcc/../../avr/include/avr/delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>."

test2.c: In function 'main':

test2.c:9: warning: large integer implicitly truncated to unsigned type

test2.c:11: warning: large integer implicitly truncated to unsigned type

 

Linking: test2.elf

avr-gcc -mmcu=atmega16a -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test2.o -std=gnu99 -MMD -MP -MF .dep/test2.elf.d test2.o --output test2.elf -Wl,-Map=test2.map,--cref -lm

 

Creating load file for Flash: test2.hex

avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock test2.elf test2.hex

 

Creating load file for EEPROM: test2.eep

avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \

--change-section-lma .eeprom=0 --no-change-warnings -O ihex test2.elf test2.eep || exit 0

 

Creating Extended Listing: test2.lss

avr-objdump -h -S -z test2.elf > test2.lss

 

Creating Symbol Table: test2.sym

avr-nm -n test2.elf > test2.sym

 

Size after:

AVR Memory Usage

----------------

Device: atmega16a

 

Program: 144 bytes (0.9% Full)

(.text + .data + .bootloader)

 

Data: 0 bytes (0.0% Full)

(.data + .bss + .noinit)

 

 

 

-------- end --------

 

 

> Process Exit Code: 0

> Time Taken: 00:00

а светодиод не мигает. Подключенный к 1 ножке МК(PB0)

ledPB0.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

чето у меня даже такое не катит

....
_delay_loop_2(300000);
....

 

Видимо, документацию сейчас читать не модно.

http://www.nongnu.org/avr-libc/user-manual...f31fd443d419a6a

 

Настоятельно рекомендую ознакомиться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

могу вообще без _delay_loop_2

#include <avr/io.h> 

int main (void)
{
    DDRB = 0xFF;

    while(1){    
    PORTB=0xFF;
    };
    return 1;
}

а тут? )))

На порте Б должны быть 5 вольт же. Гы... Тоже нифига не 5 вольт. нули ...

 

вот читаю с МК , чето читает. Значит в ней есть что-то.

 

чето я не понял как так... Вот хекс фаил

:100000000C942A000C9434000C9434000C943400AA

:100010000C9434000C9434000C9434000C94340090

:100020000C9434000C9434000C9434000C94340080

:100030000C9434000C9434000C9434000C94340070

:100040000C9434000C9434000C9434000C94340060

:100050000C94340011241FBECFE5D4E0DEBFCDBF29

:100060000E9436000C943A000C9400008FEF87BB7E

:0800700088BBFECFF894FFCF1E

:00000001FF

Программирую его через asisp(прога такая). Он программирует, сигнатуру считывает МК, стирает.

Но после того как я записал ХЕКС, я нажимаю на кнопку проверить flash и получаю такое:

post-66777-1313735987_thumb.png

post-66777-1313736684_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

чето я не понял как так... Вот хекс фаил

Судя по скриншоту никакая программа у вас не зашита. Первой командой jmp 0x54, а на этом адресе одни 0xff.

Разберитесь сначала как программа зашивается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вообщем не знаю от чего такой глюк был, но светодиод замигал. Возможно на программаторе не контакт где-то. Так как по факту только провода подергал.

 

И так вернемся к нашим баранам.

#include <avr/io.h>
#include <avr/interrupt.h>  
#include <avr/signal.h>   

#define Freq 4000000      
ISR(TIMER1_OVF_vect)  
{    
    TCNT1 = 0x10000 - (Freq / 1024);
    PORTB ^= 0x01;  
}

int main (void)
{
    DDRB = 0x01;
    TCCR1A = 0;
    TCCR1B = 5;
    TCNT1 = 0x10000 - (Freq / 1024);
    TIFR = 0x00;
    TIMSK = 0x80;
//    GICR = 0x00;
    sei();
    while(1){};
}

 

1. Проверить систему тактирования (генерит-ли кварц, если не от внутреннего RC-тактируетесь.)

из предыдущей проги удалось замаргать светодиод. Делаем вывод что кварц работает.

 

Petka

#include <avr/io.h> 
#include <avr/delay.h>

int main (void)
{
DDRB = 0xFF;
while(1)    
{
_delay_loop_2(300000);
PORTB=0xFF;    
_delay_loop_2(3000000);
PORTB=0x00;    
}
return 1;
}

замигал так.

 

2. Проверить питание и пороги BOD.

на входе 4.78 В С порогами не может быть ничего наверно, так как 1 источник питания только же.

 

3. Отключить watсhdog.

wdt_disable(); так ?

я хз я его не использовал в проге. Я так понял эта штука нужна для аварийных ситуаций, когда зависон какой-то происходит. Так?

4. Отключить во фьюзах JTAG.

во фьюзах посмотрел нету вообще JTAG

5. Подёргать ножкой без прерываний:

в предыдущем примере сделал, но по другому немного.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я хз я его не использовал в проге. Я так понял эта штука нужна для аварийных ситуаций, когда зависон какой-то происходит. Так?
Не так. Если вы его не сбрасываете он сбрасывает вас, т.к. контроллер. А по умолчанию период WDTO очень мал что-то порядка десятков миллисекунд. Таким образом если вы его "не используете" он всё равно будет ресетить контроллер до тех пор пока вы явно его не выключите или не будете его самого сбрасывать регулярно.

 

Linking: test2.elf

avr-gcc -mmcu=atmega16a -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test2.o -std=gnu99 -MMD -MP -MF .dep/test2.elf.d test2.o --output test2.elf -Wl,-Map=test2.map,--cref -lm

Вы это видите? Какая у вас частота кварца?

Зачем delay_loop вызываете, вместо нормальной _delay_ms(x)?

Вы видите тип аргумета у функции _delay_loop_2?

void _delay_loop_2 ( uint16_t      __count )

Какой диапазон у типа uint16_t? И что вы лепите?

 

Выкиньте Шпака на свалку. Читайте оригинальный datasheet, документацию на компилятор и его библиотеку, а также букварь по си. Прощайте...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем delay_loop вызываете, вместо нормальной _delay_ms(x)?

ну проверил просто. Заработал и с delay_loop.

 

 

 

Сейчас хочу Шпаковскую прогу добить:

 

#include <avr/io.h>
#include <avr/interrupt.h>  
#include <avr/signal.h>   
#include <avr/wdt.h>

#define Freq 4000000      
ISR(TIMER1_OVF_vect)  
{    
    TCNT1 = 0x10000 - (Freq / 1024);
    PORTB ^= 0x01;  
}

int main (void)
{
    DDRB = 0x01;
    wdt_disable();
    TCCR1A = 0;
    TCCR1B = 5;
    TCNT1 = 0x10000 - (Freq / 1024);
    TIFR = 0x00;
    TIMSK = 0x80;
//    GICR = 0x00;
    sei();
    while(1){};
}

 

 

лог такой:

> "make.exe" all

 

-------- begin --------

avr-gcc (WinAVR 20100110) 4.3.3

Copyright © 2008 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 

 

Compiling C: test1.c

avr-gcc -c -mmcu=atmega16a -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./test1.lst -std=gnu99 -MMD -MP -MF .dep/test1.o.d test1.c -o test1.o

In file included from test1.c:3:

c:/winavr/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."

 

Linking: test1.elf

avr-gcc -mmcu=atmega16a -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test1.o -std=gnu99 -MMD -MP -MF .dep/test1.elf.d test1.o --output test1.elf -Wl,-Map=test1.map,--cref -lm

 

Creating load file for Flash: test1.hex

avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock test1.elf test1.hex

 

Creating load file for EEPROM: test1.eep

avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \

--change-section-lma .eeprom=0 --no-change-warnings -O ihex test1.elf test1.eep || exit 0

 

Creating Extended Listing: test1.lss

avr-objdump -h -S -z test1.elf > test1.lss

 

Creating Symbol Table: test1.sym

avr-nm -n test1.elf > test1.sym

 

Size after:

AVR Memory Usage

----------------

Device: atmega16a

 

Program: 196 bytes (1.2% Full)

(.text + .data + .bootloader)

 

Data: 0 bytes (0.0% Full)

(.data + .bss + .noinit)

 

 

 

-------- end --------

 

 

> Process Exit Code: 0

> Time Taken: 00:01

 

должен мигать(светодиод заведен ) PB0(1 ножка МК). Ноль реакции.

 

Какие ещё предложения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

во фьюзах посмотрел нету вообще JTAG
ну-ну... а JTAGEN???

 

http://frank.circleofcurrent.com/fusecalc/...?chip=atmega16a

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

demiurg_spb, а, каюсь. Короче убрал его. Перепрограммировал и Опять записал Flash. Но все равно ноль реакции.

 

капец , шпак подставил. Его код не рабочий. Вот рабочий:

#include <avr/io.h>
#include <avr/interrupt.h>

ISR(TIMER1_OVF_vect)
{
    TCNT1=34286;
    if(PORTD&_BV(1))PORTD&=~_BV(1);
    else PORTD|=_BV(1);
}

void InitTimer()
{
    TCNT1=34286;
    TCCR1B=0x03;
    TIMSK=_BV(TOIE1);
}

int main()
{
    DDRD=_BV(1);
    InitTimer();

    sei();

    while(1)
    {

    }

    return 0;
}

так норм пашет только на порте Д0, но это не важно...http://pastebin.com/SADQmGkY

 

Посоветуйте архив программ рабочих для атмеги16А(ну или совместимых). Хочу посмотреть разные темы как что работает.

post-66777-1313740741_thumb.png

Изменено пользователем zeonix0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посоветуйте архив программ рабочих для атмеги16А(ну или совместимых). Хочу посмотреть разные темы как что работает.
не посоветую... читайте datasheet.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не боитесь утонуть - посмотрите в проект в первом сообщении темы http://www.cqham.ru/forum/showthread.php?t=13856 - файл TC1-Aug-10-2011.zip‎

Там есть target для atmega32 - аналогичен atmega16. Инициализация всякой периферии, во многих местах русские комментарии.

И конечно, даташит от производителя. За точными значениями битиков, названий SFR - только туда.

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...