Вход 220Вольт.

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

Re: Вход 220Вольт.

Сообщение Jman »

Спасибо за совет.... Я включил CKDIV, и настроил все на частоту 9,6. По дефалту выходит 1,2МГц... Но все равно происходит какая-то бяка.... Нужно меня ткнуть носом, пендель пока не помог. Вот инит:

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

// Crystal Oscillator division factor: 256. 4800000/256=18750;

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=In Bit3=Out Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit5=T Bit4=P Bit3=1 Bit2=T Bit1=P Bit0=T
PORTB=(0<<PORTB5) | (1<<PORTB4) | (1<<PORTB3) | (0<<PORTB2) | (1<<PORTB1) | (0<<PORTB0);


// ADC initialization
// ADC Clock frequency: 150,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: Timer0 Compare Match A
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
DIDR0|=(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
ADMUX=FIRST_ADC_INPUT | ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (1<<ADATE) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
ADCSRB=(0<<ADTS2) | (1<<ADTS1) | (1<<ADTS0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 150,000 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
// Timer Period: 1 ms
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
TCNT0=0x00;
OCR0A=0x95;
OCR0B=0x00;

TIMSK0=(0<<OCIE0B) | (1<<OCIE0A) | (0<<TOIE0);

#asm("sei")
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Реклама
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: Вход 220Вольт.

Сообщение Барсик »

Барсик писал(а):
Jman писал(а):Я взял 4.800000 / 258 (отключил CKDIV) Получил 18750
(вообще - то не 258, а 256)А Вы посмотрели код, котоый Вам нагенерил CodeVisionAVR ? Вы, для начала, выставили СИСТЕМНУЮ ЧАСТОТУ - которой тактируется микроконтроллер на 18 с небольшим килогерц. Нахуя? Электроэнергию решили экономить за счёт быстродествия?
Прежде, чем "галки" ставить, изучите внимательно даташит.
Пусть микроконтроллер молотит на частоте 1,2 МГц. Это частота по умолчанию, с заводскими установками Фьюзов.
Если хотите сделать нормальные системные часы, используйте таймер. Таймер запрограммируйте в режим CTC и выберите прескалер таймера и значение регистра OCR0A так, чтобы прерывание происходило каждую миллисекунду. Потом, временные интервалы будет легко отсчитывать. Тем более, в CodeVisionAVR это делается легко и наглядно.
От таймера запускаете АЦП. Тактовую частоту АЦП выбираете так, чтобы преобразование АЦП успело завершиться раньше, чем случится очередное прерывание от таймера. Запрограммируйте прерывание от АЦП. Сам АЦП запрограммируйте на запуск по совпадению таймера с регистром OCR0A.(запуск будет происходить АППАРАТНО, даже команду на запуск не надо писать в программе!!!) Таким образом, запуск АЦП будет происходить от таймера каждую миллисекунду.
И, самое смешное, не надо ждать в прерывании (а в прерывании ждать = дурной тон, спросите, где хотите) Пока закончатся переходные процессы переключения канала. А переключение канала закончилось ешё в предыдущем прерываниии!!! А результат преобразования будете считывать по прерыванию от самого АЦП. (Ясен пень, что прерывание от АЦП будет происходить тоже каждую миллисекунду)

Напоследок, совет. Читайте даташит на микроконтроллер до умопомрачения. Когда оно наступит, читайте тот же даташит до полной ясности сознания. И всё станет ясно, как майское утро :)
Реклама
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: Вход 220Вольт.

Сообщение Барсик »

Ну нахуя Вам Этот кусок кода:

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

// Crystal Oscillator division factor: 256. 4800000/256=18750;

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
Вы же этим кодом устанавливаете ТАКТОВУЮ ЧАСТОТОТУ МИКРОКОНТРОЛЛЕРА = 18 КИЛОГЕРЦ.
НАХУЯ!!!!НАХУЯ!!!!НАХУЯ!!!!НАХУЯ!!!!НАХУЯ!!!!НАХУЯ!!!!НАХУЯ!!!! ?????????????????????????????????
:facepalm: :facepalm: :facepalm: :facepalm: :facepalm: :facepalm: :facepalm: :facepalm:
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: Вход 220Вольт.

Сообщение Барсик »

Давайте начнём всё сначала. 1. Вам требуется что-то смотреть на входах АЦП. Это ясно - Вы хотите задавать порог срабатывания сигнала с датчика освещённности. Делается элементарно. 2. Вам требуется что-то включать, в зависимости от состояния датчика движения. Здесь алгоритм не ясен. И надо контролировать, подано ли напряжение питания куда то-там.
Поскольку ВАнга умерла, я не могу прочесть Ваши мысли, и понять, что же Вам надо.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

Re: Вход 220Вольт.

Сообщение Jman »

Барсик писал(а):Давайте начнём всё сначала. 1. Вам требуется что-то смотреть на входах АЦП. Это ясно - Вы хотите задавать порог срабатывания сигнала с датчика освещённности. Делается элементарно. 2. Вам требуется что-то включать, в зависимости от состояния датчика движения. Здесь алгоритм не ясен. И надо контролировать, подано ли напряжение питания куда то-там.
Поскольку ВАнга умерла, я не могу прочесть Ваши мысли, и понять, что же Вам надо.
Не ругайтесь пожалуйста... Я не понимаю, что эта часть кода делает. Это мне выдает Код Вижн... Я перенес тему, ибо по входу 220в все более менее понятно. Тут тема с описанием http://radiokot.ru/forum/viewtopic.php?f=57&t=130842, я просто не могу настроит периферию...

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


adc_data[input_index]=ADCW;

//потом делаю функцию

void adc_read (void)              // Функция считывания значения из АЦП. АЦП 8бит;
{
 sensivity=adc_data[0];           // Значение 1 канала, PORTB2 ;
 outdoor_sensor=adc_data[1];      // Значение 2 канала читаем из массива сканированных каналов АЦП, PORTB4;
}

в main вызываю 
adc_read ();

if (outdoor_sensor > sensivity) тогда включаю лампочку....

[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Реклама
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

Re: Вход 220Вольт.

Сообщение Jman »

Вы мне говорите смотри датащит... Так в датащите написанно: пределитель CLKPS3...CLKPS0 - они у меня все 0, что значит предделитель 1. Значит и клок 1.2МГц, не обращайте внимание на надпись 18750 кГц...
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Реклама
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: Вход 220Вольт.

Сообщение Барсик »

Jman писал(а):пределитель CLKPS3...CLKPS0 - они у меня все 0
Прошу прощения, не заметил.
Jman писал(а):что значит предделитель 1. Значит и клок 1.2МГц
Предделитель, да, именно 1, причём независимо от того, как запрограммирован фьюз CKDIV8. А вот клок у Вас при этом будет или 9,6 или 4,8 МГц, в зависимости от того, как запрограммированы фьюзы CKSEL0 и CKSEL1.
Этот кусок кода позволяет задать предделитель независимо от того, как установлен фьюз CKDIV8. Если этот кусок кода выкинуть совсем, то тактовая частота будет определяться только фьюзами CKSEL0, CKSEL1 и CKDIV8. Я обычно этот кусок выкидываю.
Jman писал(а):не обращайте внимание на надпись 18750 кГц.
Она меня и ввела в заблуждение...
У Вас осциллограф есть?
Аватара пользователя
CATяра
Встал на лапы
Сообщения: 110
Зарегистрирован: Чт янв 14, 2016 14:42:05
Откуда: City

Re: Вход 220Вольт.

Сообщение CATяра »

И мне подскажите пожалуйста про DIV8
Если фьюз установлен, то частота выполнения кода (программы) снижается в 8 раз.
Если в коде встречается "настройка фьюзов", то фьюз DIV8 не действует или действует, но таймер считает, как-будто не установлен фьюз (для генератора)
Этот момент я не понял.

Про АЦП... я делал так... Опрашивается АЦП в цикле (аппаратном) и по завершении преобразования происходит прерывание, в цикле которого заносит в регистр (ры) значение из АЦП и выходит из прерывания.
Далее этот регистр больше в коде не используется для других целей. Получить значение из этого регистра можно в любом месте программы, где это необходимо.
Спойлер

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

/*
 * PWM_13__STEP_UP__003.asm
 *
 *  Created: 10/18/2014 9:46:43 PM
 *   Author: SAMSUNG
 */ 


			.device		ATTINY13A
			;.equ		XTAL = 20000000							;20 MHz
			;.equ		BAUDRATE = 128000						; (140 000 ДЛЯ Terminal)
			;.equ		BAUDDIVIDER = XTAL/(16*BAUDRATE)-1

.def	Temp=R16
.def	Temp1=R17
.def	Temp2=R18
.def	Temp3=R19
.def	Temp4=R20
.def	A=R21
.def	A_EX=R22
.def	H=R23
.def	L=R24
.def	B=R25
;-----------------------------------------
;.def	XL=R26		;X-register Low Byte
;.def	XH=R27		;X-register High Byte
;.def	YL=R28		;Y-register Low Byte
;.def	YH=R29		;Y-register High Byte
;.def	ZL=R30		;Z-register Low Byte
;.def	ZH=R31		;Z-register High Byte
;-----------------------------------------

 .dseg						;DSEG – это сегмент данных. В нем выделяется оперативная память. 
DIGIT1:			.byte 1		;Сегмент данных прописывается в тексте раньше программного сегмента
...........
......

;---------------------------------------------------------

;-----------------------------------------------------------------------------------------------------
			.cseg
			.org 0

			rjmp RESET		; Reset Handler
			rjmp EXT_INT0	; IRQ0 Handler
			rjmp PC_INT0	; PCINT0 Handler
			rjmp TIM0_OVF	; Timer0 Overflow Handler
			rjmp EE_RDY		; EEPROM Ready Handler
			rjmp ANA_COMP	; Analog Comparator Handler
			rjmp TIM0_COMPA ; Timer0 CompareA Handler
			rjmp TIM0_COMPB ; Timer0 CompareB Handler
			rjmp WATCHDOG	; Watchdog Interrupt Handler
			rjmp ADCC		; ADC Conversion Handler			
			;--------------------------------------------------------------

			;RESET:			; СУЩЕСТВУЕТ НАСТОЯЩИЙ АДРЕС
			RETI
			;EXT_INT0:		; IRQ0 Handler	СУЩЕСТВУЕТ НАСТОЯЩИЙ АДРЕС
			RETI
			PC_INT0:		; PCINT0 Handler
			RETI						
			;TIM0_OVF:		; Timer0 Overflow Handler
			RETI
			EE_RDY:			; EEPROM Ready Handler			
			RETI
			ANA_COMP:		; Analog Comparator Handler
			RETI
			;TIM0_COMPA:		; Timer0 CompareA Handler
			RETI
			;TIM0_COMPB:		; Timer0 CompareB Handler
			RETI
			WATCHDOG:		; Watchdog Interrupt Handler
			RETI
			;ADCC:			; ADC Conversion Handler
			RETI
;==================


;==================


;************************************************************************
;				ИНИЦИАЛИЗАЦИЯ											
;************************************************************************
RESET:		
			CLI								;ЗАПРЕТИТЬ ПРЕРЫВАНИЯ

			ldi		r16, low(RAMEND)		; НАСТРОЙКА РЕГИСТРОВ СТЕКА
			out		SPL,r16					; Set Stack Pointer to top of RAM
			;-----------------------------------------------------------------------------------

		

			RCALL	TIMER0START				;ЗАПУСК ТАЙМЕРА (первое преобразование недействительно)

			LDI		A, 0
			OUT		OCR0A, A
			OUT		ADCH, A


			SEI

;==================
MAIN:

			NOP

			RJMP		MAIN

;==================
ADCSTART:
			LDI		A_EX, 0B00100010	;	PB4(ADC2) ВЫБОР ВХОДА ДЛЯ ПРЕОБРАЗОВАНИЯ
			OUT		ADMUX, A_EX			; – REFS0 ADLAR – – – MUX1 MUX0 = ADMUX
										;REFS0 Voltage Reference Selection	
										;0 VCC used as analog reference		1 Internal Voltage Reference
										;MUX1..0 Single Ended Input		00 ADC0 (PB5)	01 ADC1 (PB2)	10 ADC2 (PB4)	11 ADC3 (PB3)

						   ;76543210	
			LDI		A_EX, 0B11101111	;
			OUT		ADCSRA, A_EX		;ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0 = ADCSRA

						   ;76543210	
			LDI		A_EX, 0B10000000	;ACSR– Analog Comparator Control and Status Register
			OUT		ACSR, A_EX			;  7    6   5   4    3  2      1     0
										;ACD ACBG ACO ACI ACIE  –  ACIS1 ACIS0
										;Bit 7 – ACD: Analog Comparator Disable
										;ЗАПРЕТ ПИТАНИЯ КОМПАРАТОРА

			RET
;==================


код
код
код


;==================
ADCC:									;АНАЛОГОВЫЙ ПРЕОБРАЗОВАТЕЛЬ
			PUSH	A
			IN		A, SREG				;ЧТЕНИЯ ФЛАГОВОГО РЕГИСТРА
			PUSH	A					;СОХРАНЕНИЕ НА СТЕКЕ ЗНАЧЕНИЯ ФЛАГОВОГО РЕГИСТРА

			IN		A, ADCH				;ПРИНЯТИЕ БАЙТА ИЗ ПРЕОБРАЗОВАТЕЛЯ (АЦП)

			можно так    IN R0, ADCH		;И ДАЛЬШЕ ЭТОТ РЕГИСТР НЕ ИСПОЛЗОВАТЬ ДЛЯ ДРУГИХ ЦЕЛЕЙ, ТОЛЬКО ДЛЯ СЧИТЫВАНИЯ ЗНАЧЕНИЙ ИЗ АЦП

			POP		A
			OUT		SREG, A				;ВОССТАНОВЛЕНИЕ ФЛАГОВОГО РЕГИСТРА
			POP		A
			RETI
;==================
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: Вход 220Вольт.

Сообщение Барсик »

Если фьюз CKDIV8 запрограммирован, то при старте микроконтроллера, в регистр прескалера CLKPR аппаратно пропишется значение для предделителя = 8, ещё до начала выполнения программы.
Если в процессе выполнения программы Вы уже программно измените значения регистра CLKPR, то получите предделитель не зависящий от того, запрограммирован фьюз CKDIV8, или нет. Точнее, фьюз CKDIV8 "работает" ровно до того момента, пока Вы программно не измените значение регистра CLKPR.
Аватара пользователя
CATяра
Встал на лапы
Сообщения: 110
Зарегистрирован: Чт янв 14, 2016 14:42:05
Откуда: City

Re: Вход 220Вольт.

Сообщение CATяра »

Барсик писал(а):Точнее, фьюз CKDIV8 "работает" ровно до того момента, пока Вы программно не измените значение регистра CLKPR.
А сама программа с какой скоростью будет исполняться? после смены значения в CLKPR. (в 8 раз медленнее или нет)
Я вот этот момент не понял.
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

Re: Вход 220Вольт.

Сообщение Jman »

CATяра писал(а):
Барсик писал(а):Точнее, фьюз CKDIV8 "работает" ровно до того момента, пока Вы программно не измените значение регистра CLKPR.
А сама программа с какой скоростью будет исполняться? после смены значения в CLKPR. (в 8 раз медленнее или нет)
Я вот этот момент не понял.
Как мне тут объяснили. В Аттини13 по дефалту стоит аппаратный прескалер на 8 (CKDIV8), и частота 9600000Гц, соответственно 9,600000 / 8 = 1,200000Гц.
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Ответить

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