Форум myROBOT.ru » Роботы и робототехника » Делимся опытом » АЦП на ATmega8

Страниц (2): [1] 2 »
 

1. KJIOYH - 19 Октября, 2008 - 16:26:54 - перейти к сообщению
Доброго времени суток. Нужно инициализировать ацп , установить его в режим непрерывной оцифровки , или как это называется , и вывести младший байт результата на PortD . Вот мой код:
CODE:

.include "m8def.inc"

.list
.def temp =r16
.def s1 =r17

.equ ADCSM = 0b11011111 ;то , что мы запишем в регистры управления АЦП
.equ ADMX = 0b01000000 ;

.cseg
.org 0

init:

ldi temp,low(RAMEND)
out SPL,temp
ldi temp,high(RAMEND)

out SPH,temp

ldi temp,0xff
out DDRD,temp

ldi temp,0x00
out PORTD,temp ; порт D на вывод, все значени - 0

ldi temp,ADCSM
OUT ADCSR, temp
ldi temp,ADMX
OUT ADMUX, temp

main:
m1:
ldi temp,ADCSR ; если бит
out sreg,temp ;ADIF =1
BRBS 4, m2 ; то переходим в m2
rjmp m1
;-----------------------------
m2:
ldi temp,ADCH
out PORTD,temp
rjmp m1


на макетной плате : на ADC0 подаётся напряжение от 0 до +5 в , adref и avcc соединены с плюсом питания, питание - +5 вольт......А теперь собственно вопрос: ybxutj не работает , на порту д - нули , где ошибка?
2. Белый Волк - 20 Октября, 2008 - 07:05:52 - перейти к сообщению
Попробуйте:
CODE:

.include "m8def.inc"

.list
.def temp =r16
.def s1 =r17

.equ ADCSM = 0b11101111 ;то , что мы запишем в регистры управления АЦП
.equ ADMX = 0b01000000 ;

.cseg
.org 0

init:

ldi temp,low(RAMEND)
out SPL,temp
ldi temp,high(RAMEND)

out SPH,temp

ldi temp,0xff
out DDRD,temp

ldi temp,0x00
out PORTD,temp ; порт D на вывод, все значени - 0

ldi temp,ADCSM
OUT ADCSR, temp
ldi temp,ADMX
OUT ADMUX, temp


main:

m1:
lds temp, 0x26 ;если ADIF установлен
SBRS temp, 4 ;то переходим в m2
rjmp m1
;-----------------------------
m2:
ldi temp,ADCH
out PORTD,temp
rjmp m1
3. KJIOYH - 21 Октября, 2008 - 15:56:06 - перейти к сообщению
Заработало вот с таким кодом :
CODE:

.include "m8def.inc"

.def Temp1=R16

.dseg
Digit: .byte 2

.cseg
.org 0

rjmp RESET ;External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset
rjmp INT_0 ;External Interrupt Request 0
rjmp INT_1 ;External Interrupt Request 1
rjmp TIMER2_COMP ;Timer/Counter2 Compare Match
rjmp TIMER2_OVF ;Timer/Counter2 Overflow
rjmp TIMER1_CAPT ;Timer/Counter1 Capture Event
rjmp TIMER1_COMPA ;Timer/Counter1 Compare Match A
rjmp TIMER1_COMPB ;Timer/Counter1 Compare Match B
rjmp TIMER1_OVF ;Timer/Counter1 Overflow
rjmp TIMER0_OVF ;Timer/Counter0 Overflow
rjmp SPI_STC ;Serial Transfer Complete
rjmp USART_RXC ;USART, Rx Complete
rjmp USART_UDRE ;USART Data Register Empty
rjmp USART_TXC ;USART, Tx Complete
rjmp ADC_CC ;ADC Conversion Complete
rjmp EE_RDY ;EEPROM Ready
rjmp ANA_COMP ;Analog Comparator
rjmp TWI ;Two-wire Serial Interface
rjmp SPM_RDY ;Store Program Memory Ready



INT_0 : ret
INT_1 : ret
TIMER2_COMP : ret
TIMER2_OVF : ret
TIMER1_CAPT : ret
TIMER1_COMPA : ret
TIMER1_COMPB : ret
TIMER1_OVF : ret
TIMER0_OVF : ret
SPI_STC : ret
USART_RXC : ret
USART_UDRE : ret
USART_TXC : ret
;ADC_CC : ret
EE_RDY : ret
ANA_COMP : ret
TWI : ret
SPM_RDY : ret


reset:
ldi Temp1, LOW(RamEnd)
out SPL, Temp1

ldi Temp1, HIGH(RamEnd)
out SPH, Temp1

cli

ldi Temp1, 0b11111111
out ddrd, temp1


ldi Temp1, 0b10101011
out ADCSR, Temp1


ldi Temp1, 0b00000000
out ADMUX, Temp1

ldi r16,(1<<SE) ; Enable sleep mode
out MCUCR, r16

sei
rjmp main2




main:
rjmp main

main2:
sbi ADCSR, 6

rjmp main

ADC_CC:
in temp1, ADCH
out portd,temp1
in temp1, ADCH
out portb,temp1
reti

может кому пригодится
4. Alexur - 24 Февраля, 2010 - 20:28:42 - перейти к сообщению
Скажите каким наминалом нужно подключить конденсатор на вывод AREF при использовании АЦП с внутреннем источником опорного напряжения 2.56В ( в даташите чето не нашёл Замешательство )
5. Alexur - 24 Февраля, 2010 - 22:57:06 - перейти к сообщению
Как написать функцию прерывания АЦП на СИ?
6. бот_м_16 - 25 Февраля, 2010 - 17:19:17 - перейти к сообщению
1) 0.1мкФ
2)зависит от компилятора
7. Alexur - 25 Февраля, 2010 - 17:35:51 - перейти к сообщению
бот_м_16 пишет:
0.1мкФ
спасибо

бот_м_16 пишет:
зависит от компилятора
winAVR
8. microsmaster - 02 Марта, 2010 - 19:04:09 - перейти к сообщению
Например так.

CODE:
unsigned char adcValue = 0;

ISR(ADC_vect)
{
adcValue = ADCH; //считываем старший регистр АЦП
ADCSRA |= (1<<ADSC); //запускаем преобразование
}
9. бот_м_16 - 06 Марта, 2010 - 10:22:10 - перейти к сообщению
не обязательно можно сконфигурировать ацп на непрерывное преобразование , а в прерывании только читать результат
10. Alexur - 07 Марта, 2010 - 10:17:12 - перейти к сообщению
У меня протеус тормозит, не показывает адреса при отладке ( АЦП. Может он просто не знает про функцию внутреннего опорного напряжения? потому что вольтметр ничего не показывает на ножке. ареф
11. Alexur - 08 Марта, 2010 - 19:37:19 - перейти к сообщению
В общем такой код на кодевижеонавр
------------
This program was produced by the
CodeWizardAVR V1.25.9 Professional
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 08.03.2010
Author : F4CG
Company : F4CG
Comments:


Chip type : ATmega8L
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x83;
// Place your code here
ADCSRA.6 = 1; // ñäåëàòü áèò_6 = 1 çíà÷èò íà÷àòü ÀÖÏ
}

#include <delay.h>

#define ADC_VREF_TYPE 0xC0

// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
// Read the AD conversion result
adc_data=ADCW;
// Place your code here

}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
TCCR0=0x03;
TCNT0=0x83;

// 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;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

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

// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: Int., cap. on AREF
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x8E;

// Global enable interrupts
#asm("sei"Подмигивающий

while (1)
{
// Place your code here

};
}
--------------------------
на ADC0 подаю 1 вольт, питание 4.8
содержимое переменной при выполнении (adc_data) показывает (впротеусе)-> adc_dataL R-61168:R-61167 Item (2 bytes at 0xFFFF1110) not within memory block (0x00010000 bytes).
Я так понял значение выходит за пределы... как мне считать правельный результат???
12. nest - 08 Марта, 2010 - 19:50:22 - перейти к сообщению
Alexur пишет:
как мне считать правельный результат?
запустить проект в железе и никогда больше не пользоваться разными эмуляторами. Тем более когдра речь идёт об Аналоговых измерениях
13. Alexur - 11 Марта, 2010 - 18:35:22 - перейти к сообщению
nest пишет:
запустить проект в железе и никогда больше не пользоваться разными эмуляторами
Для этого мне нужно знать как преобразовать байтный регистр(типа ADCL) в десятичное число?
14. redcat - 11 Марта, 2010 - 18:47:18 - перейти к сообщению
Alexur пишет:
Для этого мне нужно знать как преобразовать байтный регистр(типа ADCL) в десятичное число?
- Для запуска проекта на железе, этого знать не нужно.
15. Alexur - 11 Марта, 2010 - 19:09:59 - перейти к сообщению
redcat пишет:
Для запуска проекта на железе, этого знать не нужно.
Смысл запускать проект, если не знаешь как обрабатывать данные!!!

Просьба, если кто знает как преобразовать байтный регистр(типа ADCL) в десятичное число, скажите пожалуйста.