Почему AT90USB162 тактируется медленней чем ожидалось...

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 98
Зарегистрирован: Пн дек 06, 2010 12:26:45

Сообщение ESWANT »

Фьюзы в прикреплении
Фрагмент кода ниже

вот когда доходит до этого кода то вместо секунды период работы светодиодов несколько минут
_delay_ms(1000);
SysRED_ON();

Ткните носом пожалуйста.






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

#include "avr\io.h"//описаны имена портов в том числе
#include "util\delay.h"
#include <avr/interrupt.h>


#include "GenericHID.h"


#define eeprom EEMEM   //подстройка под GCC  


typedef unsigned char byte;
typedef unsigned int word;


#define SET_BIT(x) |= (1<<x)    //использование  - PORTB SET_BIT(5);  // "установить"  бит5
#define CLR_BIT(x) &=~(1<<x) 
#define INV_BIT(x) ^=(1<<x) 




#include "eeprom.c"



#define SDAw_port  PORTC 
#define SDAw_line  2 

#define SCLw_port  PORTD    
#define SCLw_line  0    

#define SDAr_port  PIND    
#define SDAr_line  1    

#define SCLr_port  PIND 
#define SCLr_line  2 

#define NUM 1    

byte FLAGI=0;//основные системные флаги



#define SysRED_ON() PORTD |= (1 << 3)   //в порт 1
#define SysRED_OFF() PORTD &= ~(1 << 3)  //в порт 0

#define SysGREEN_ON() PORTD |= (1 << 4)   //в порт 1
#define SysGREEN_OFF() PORTD &= ~(1 << 4)  //в порт 0







//таймер   100кГц  
ISR( TIMER0_OVF_vect )//прерывание первого таймера  100кГц  
{

TCNT0=0xEC;//переустановка таймера 100кГц
FLAGI SET_BIT(0);//установим флаг таймера 
  
}//proc






// медленный таймер
ISR( TIMER1_OVF_vect )   //   1 кГц
{
TCNT1=0x06;//переустановка таймера
FLAGI SET_BIT(2);//скорость передачи 

if (TimerPrioritet<NUM*_DELAY_PRIORITET) TimerPrioritet++;  

//if (TimerRealTime01 < 100) TimerRealTime01++; //замедлитель ДО 10Гц   0,1секунды


} 











int main(void)
{
	SetupHardware();
	
    _delay_ms(1000);
	SysRED_ON();
    _delay_ms(1000);
    SysRED_OFF();
	_delay_ms(1000);
    SysGREEN_ON();
    _delay_ms(1000);
    SysGREEN_OFF();
	_delay_ms(1000);
    
	

	GlobalInterruptEnable();


	while (1)
	{
		HID_Task();
		USB_USBTask();
		
		Listen();
	
		
	}
}

/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void)
{
#if (ARCH == ARCH_AVR8)
	/* Disable watchdog if enabled by bootloader/fuses */
	MCUSR &= ~(1 << WDRF);
	wdt_disable();

	
	clock_prescale_set(clock_div_1);/* Disable clock division */

#elif (ARCH == ARCH_XMEGA)
	/* Start the PLL to multiply the 2MHz RC oscillator to 32MHz and switch the CPU core to run from it */
	XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU);
	XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL);

	/* Start the 32MHz internal RC oscillator and start the DFLL to increase it to 48MHz using the USB SOF as a reference */
	XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ);
	XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB);

	PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;
#endif

	
	//НАСТРОЙКА ПОРТОВ И ПЕРИФЕРИИ

        
    DDRB  =  0b00000001;   //выходы где 1
	PORTB =  0b11111110;   //1-подтяжка если вход

    DDRC  =  0b00000100;   //выходы где 1
	PORTC =  0b11111011;   //1-подтяжка если вход

    DDRD  =  0b11111001;   //выходы где 1
	PORTD =  0b00000110;   //1-подтяжка если вход



    TCNT0=0xEC;//переустановка таймера 100кГц
    

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;




// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;



	
	
	
	
	
	

	USB_Init();
}



Вложения
фьюзы.jpg
(30.68 КБ) 442 скачивания
Последний раз редактировалось ESWANT Вт июн 17, 2014 15:05:15, всего редактировалось 1 раз.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Библиотеку задержки используете, а частоту ЦПУ почему не задаете?

#define F_CPU 8000000UL Или сколько там у Вас? и код в спойлер сверните
Последний раз редактировалось Pink-Pank Вт июн 17, 2014 15:08:27, всего редактировалось 1 раз.
Fucking static initialization order fiasco
Контактная информация:
Реклама
Встал на лапы
Сообщения: 98
Зарегистрирован: Пн дек 06, 2010 12:26:45

Сообщение ESWANT »

а частота же задается в makefile, как я понимаю
вот
#
# LUFA Library
# Copyright (C) Dean Camera, 2014.
#
# dean [at] fourwalledcubicle [dot] com
# http://www.lufa-lib.org
#
# --------------------------------------
# LUFA Project Makefile.
# --------------------------------------

# Run "make help" for target help.

MCU = at90usb162
ARCH = AVR8
BOARD = USBKEY
F_CPU = 16000000
F_USB = $(F_CPU)
OPTIMIZATION = s
TARGET = GenericHID
SRC = $(TARGET).c Descriptors.c $(LUFA_SRC_USB)
LUFA_PATH = C:/LUFA
CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/
LD_FLAGS =

# Default target
all:

# Include LUFA build script makefiles
include $(LUFA_PATH)/Build/lufa_core.mk
include $(LUFA_PATH)/Build/lufa_sources.mk
include $(LUFA_PATH)/Build/lufa_build.mk
include $(LUFA_PATH)/Build/lufa_cppcheck.mk
include $(LUFA_PATH)/Build/lufa_doxygen.mk
include $(LUFA_PATH)/Build/lufa_dfu.mk
include $(LUFA_PATH)/Build/lufa_hid.mk
include $(LUFA_PATH)/Build/lufa_avrdude.mk
include $(LUFA_PATH)/Build/lufa_atprogram.mk
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

расчет библиотечной задержки идет через макроподстановки. И если вы частоту явно не указали в дефайне, то берется значение по умолчанию (1000000).
Fucking static initialization order fiasco
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 98
Зарегистрирован: Пн дек 06, 2010 12:26:45

Сообщение ESWANT »

я привел содержимое makefile
или ещё где-то надо задать
я же на основе луфовского примера, там вроде нигде небыло
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Я не совсем уверен, как мейкфайл влияет на расчет задержки в библиотеке, но я уверен точно, что если вы напишите перед включением инклуда строку #define F_CPU 16000000UL - то все у Вас правильно начнет считаться, если только еще где не накосячили.
Fucking static initialization order fiasco
Контактная информация:
Реклама
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Нифига не понимаю в этих кыржиках, но галку с CKDIV8 убрал бы.
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Стоп, у него ж не студия... CV AVR? Настройки частоты в свойствах проекта. а фьюз CKDIV нужно сбросить - это да.
Fucking static initialization order fiasco
Контактная информация:
Встал на лапы
Сообщения: 98
Зарегистрирован: Пн дек 06, 2010 12:26:45

Сообщение ESWANT »

Спасибо всем.
Вопрос перешел в другую сторону, библиотечная задержка считает нормально а вот таймеры нет
Правильно ли у меня настроены таймеры? на 100кГц и 1кГц ????


Это был проект для Atmegи32 и писанный в Codevision
а сейчас мне нужно аппратный USB-HID поэтому пришлось поменять среду на WinAVR и контроллер
там и таймеры другие...
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

ESWANT писал(а):...Правильно ли у меня настроены таймеры? на 100кГц и 1кГц
Думаю, что неправильно. Сделал бы так

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

	.equ	Fo=16000000

	LDI	R22,(-1-Fo/100000) ; установить значение Т0 на прерывание по переполнению каждые 10мкс
	OUT	TCNT0,R22

	LDI	R22,HIGH(-1-Fo/1000) ; установить значение Т1 на прерывание по переполнению каждые 1000мкс
	LDI	R23,LOW(-1-Fo/1000)
	OUT	TCNT1H,R22
	OUT	TCNT1L,R23

Встал на лапы
Сообщения: 98
Зарегистрирован: Пн дек 06, 2010 12:26:45

Сообщение ESWANT »

akl писал(а):
ESWANT писал(а):...Правильно ли у меня настроены таймеры? на 100кГц и 1кГц
Думаю, что неправильно. Сделал бы так

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

	.equ	Fo=16000000

	LDI	R22,(-1-Fo/100000) ; установить значение Т0 на прерывание по переполнению каждые 10мкс
	OUT	TCNT0,R22

	LDI	R22,HIGH(-1-Fo/1000) ; установить значение Т1 на прерывание по переполнению каждые 1000мкс
	LDI	R23,LOW(-1-Fo/1000)
	OUT	TCNT1H,R22
	OUT	TCNT1L,R23

а на Си TCNT0=65697 чтоли? (что там значит -1)
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Если Ваш компилятор знает, что Т0 у AT90USB162 8-разрядный, то он установит в TCNT0 число 95(0x5F). Особенность работы схемы сравнения по переполнению (сравнению) вынуждает число сравнения устанавливать на 1 меньше требуемого. На самом деле число должно быть больше, чтобы компенсировать задержки входа в прерывание и установки начального значения TCNT0.
Встал на лапы
Сообщения: 98
Зарегистрирован: Пн дек 06, 2010 12:26:45

Сообщение ESWANT »

akl писал(а):Если Ваш компилятор знает, что Т0 у AT90USB162 8-разрядный, то он установит в TCNT0 число 95(0x5F). Особенность работы схемы сравнения по переполнению (сравнению) вынуждает число сравнения устанавливать на 1 меньше требуемого. На самом деле число должно быть больше, чтобы компенсировать задержки входа в прерывание и установки начального значения TCNT0.
это понятно всё
255-95=160
16 000 000 / 160 = 100 КГц

Видимо настройка таймера №0 отличаются у Atmegi32 b At90USB162, а я то думал...
У Atmegi32 еще какой то предделитель был видимо
мастер в Codevision всё скрыл, однако...

я еще оказывается не тот пример привел
настройка то у меня такая была:

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

TCCR0A=0x00;
TCCR0B=0x02;
TCNT0=0xEC;//переустановка таймера 100кГц
OCR0A=0x00;
OCR0B=0x00;




// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 250,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0x00;
TCNT1L=0x06;//переустановка
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
Эх, неохота даташит читать, для чего это содевизион вставил TCCR0B=0x02;
поди как раз предделитель был
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

ESWANT писал(а):Эх, неохота даташит читать
:shock: :kill:
Ставим плюсы: )
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

ESWANT Конечно был предделитель на 8 0xFF-0xEC=0x13=19. 19*8=152. Похоже на 160, но не очень. Рекомендую почитать в DS про режим CTC.

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

TCCR0B=0x02; счёт Fo/8 должна быть последней командой инициализации таймера
TCNT0=0xEC
Встал на лапы
Сообщения: 98
Зарегистрирован: Пн дек 06, 2010 12:26:45

Сообщение ESWANT »

akl писал(а):ESWANT Конечно был предделитель на 8 0xFF-0xEC=0x13=19. 19*8=152. Похоже на 160, но не очень. Рекомендую почитать в DS про режим CTC.

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

TCCR0B=0x02; счёт Fo/8 должна быть последней командой инициализации таймера
TCNT0=0xEC
Так что же получается таймер должен был правильно работать, он и работал правильно для Atmega32
16 делилось на 8 = 2Мгц потом досчитывало и делилось на 20 и получалось 100КГц
почему же для At90Usb162 так?

Может там из за ошибок в работе USB ?
Кстати пишет при подключении что устройство работает неправильно.
Как то мне надо по-другому вопрос сформулировать :tea:
Ответить

Вернуться в «AVR»