Jump to content

Ну очень странное поведение ATmega2560


Vit@lik
 Share

Recommended Posts

Здравствуйте, пишу программу на АТмега2560. И возникла очень странная проблема.
Код такой:

#define F_CPU 16000000

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

//#include "timer.h"
//#include "Output_devices/status_led.h"

int main(void){
	cli();
	//status_led_init();
	DDRB |= (1<<PB6);
	//timer0_init();
	//timer2_init();
	TIMSK0 |= (1<<TOIE0); // enable timer 0 overflow interrupt
	TCCR0B |= (1<<CS00) |(1<<CS01); // set timer 0 prescaler factor to 64
	sei();
	
	PORTB |= (1<<PB6);
	_delay_ms(200);
	PORTB &= ~(1<<PB6);
	_delay_ms(200);
	PORTB |= (1<<PB6);
	_delay_ms(200);
	PORTB &= ~(1<<PB6);
	_delay_ms(200);
	PORTB |= (1<<PB6);
	_delay_ms(200);
	PORTB &= ~(1<<PB6);
	
    while (1) {		
	}//while1
	
}

Внешний кварц 16мгц на XTAL1 и XTAL2.
На заводских фюзах работает.
Но на фюзах взятых из арудино мега не работает. Светодиод на PB6 просто светится непрерывно. Но если закомментировать инициализацию таймера-0 работает. Как это? В чем проблема?

Screenshot_7.png

Screenshot_8.png

Edited by Vit@lik
Link to comment
Share on other sites

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Прерывание таймера разрешили, а самого тела прерывания нет. Поэтому происходит постоянный перезагруз МК. Сам светодиод включается при инициализации порта, далее первая же задержка не успевает отработать, как наступает событие прерывания. МК выбрасывает в таблицу прерываний за инструкцией перехода на обработчик, а его нет(!!!). Происходит смещение по куче NOP и МК попадает опять на начало программы, т.е. опять инициализация и включение светодиода... И так по кругу.

Link to comment
Share on other sites

Как измерить внутреннее сопротивление литиевого аккумулятора. Измеряем правильно

Внутреннее сопротивление – один из наиболее значимых параметров, от которого напрямую зависят другие характеристики литиевого аккумулятора. От этого параметра зависят такие характеристики источника питания, как напряжение на выходе под нагрузкой, максимальный выходной ток и коэффициент полезного действия (КПД). Рассмотрим как измерить действительное значение внутреннего сопротивления АКБ, используя определенные методики. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

5 часов назад, Геннадий сказал:

а самого тела прерывания нет

ISR(TIMER0_OVF_vect){
	/*
	timer0_millis += 1;
	timer0_fract += 3;
	if (timer0_fract >= 125) {
		timer0_fract -= 125;
		timer0_millis += 1;
	}
	timer0_overflow_count++;
	*/
}

Есть. Но это ни на что не влияло и ничего не изменило. Пытался включить светодиод в прерывании но он не включался такое впечатление что оно не вызвалось вообще.
Я перепробовал все варианты, прежде чем писать сюда.

Link to comment
Share on other sites

19 минут назад, korsaj сказал:

TCCR0A и TIFR0

а что с ними нужно делать? TIFR кажется сам выставляется. А в TCCR0A ничего не нужно настраивать

Link to comment
Share on other sites

А вы уверены что TCCR0A  после сброса мк будет равен 0 или в регистре TIFR0 не будет взведет какой нибудь флаг?

Спойлер


 

.cseg
.org	0
	rjmp	Start	; Ïåðåõîä íà Start ïî ñáðîñó

.org	OVF0addr	; Timer/Counter0 Overflow
	rjmp	Timer0Ovf
;----------------------------------------------------
Timer0Ovf:
	inc		r16
	cpi		r16, 0x14
	brne	ExirTimer0Ovf
	clr		r16
		
	sbic	PORTB, PB0
	rjmp	ClrPortbit
	sbi		PORTB, PB0
	reti

ClrPortbit:
	cbi		PORTB, PB0
ExirTimer0Ovf:
	reti

;----------------------------------------------------
Start:
	ldi		r16, 0
	out		PORTB, r16

	ldi		r16, 0xFF
	out		DDRB, r16

	ldi		r16, 0
	out		TCCR0A, r16

	ldi		r16, (1<<CS00) |(1<<CS01)
	out		TCCR0B, r16

	ldi		r16, 1<<TOIE0
	sts		TIMSK0, r16

	ldi		r16, 0xFF	
	out		TIFR0, r16

	clr		r16

	sei
;----------------------------------------------------
Loop:
	rjmp Loop
;----------------------------------------------------


 

Edited by korsaj
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...