роботы робототехника микроконтроллеры


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

> Без описания
KJIOYH Post Id


Рядовой


Сообщений всего: 17
Дата рег-ции: Авг. 2008  



Доброго времени суток. Нужно инициализировать ацп , установить его в режим непрерывной оцифровки , или как это называется , и вывести младший байт результата на 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 не работает , на порту д - нули , где ошибка?

(Отредактировано автором: 19 Октября, 2008 - 19:15:18)

 
 Top
Белый Волк Супермодератор Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  



Попробуйте:
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
 
 Top
KJIOYH Post Id


Рядовой


Сообщений всего: 17
Дата рег-ции: Авг. 2008  



Заработало вот с таким кодом :
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

может кому пригодится
 
 Top
Alexur Post Id



Рядовой


Сообщений всего: 18
Дата рег-ции: Янв. 2010  



Скажите каким наминалом нужно подключить конденсатор на вывод AREF при использовании АЦП с внутреннем источником опорного напряжения 2.56В ( в даташите чето не нашёл Замешательство )

(Отредактировано автором: 24 Февраля, 2010 - 22:31:39)

 
 Top
Alexur Post Id



Рядовой


Сообщений всего: 18
Дата рег-ции: Янв. 2010  



Как написать функцию прерывания АЦП на СИ?
 
 Top
бот_м_16 Супермодератор Post Id



Супермодератор


Сообщений всего: 1033
Дата рег-ции: Окт. 2008  



1) 0.1мкФ
2)зависит от компилятора
 
 Top
Alexur Post Id



Рядовой


Сообщений всего: 18
Дата рег-ции: Янв. 2010  



бот_м_16 пишет:
0.1мкФ
спасибо

бот_м_16 пишет:
зависит от компилятора
winAVR
 
 Top
microsmaster Post Id


Капитан


Сообщений всего: 46
Дата рег-ции: Сент. 2009  



Например так.

CODE:
unsigned char adcValue = 0;

ISR(ADC_vect)
{
adcValue = ADCH; //считываем старший регистр АЦП
ADCSRA |= (1<<ADSC); //запускаем преобразование
}
 
 Top
бот_м_16 Супермодератор Post Id



Супермодератор


Сообщений всего: 1033
Дата рег-ции: Окт. 2008  



не обязательно можно сконфигурировать ацп на непрерывное преобразование , а в прерывании только читать результат
 
 Top
Alexur Post Id



Рядовой


Сообщений всего: 18
Дата рег-ции: Янв. 2010  



У меня протеус тормозит, не показывает адреса при отладке ( АЦП. Может он просто не знает про функцию внутреннего опорного напряжения? потому что вольтметр ничего не показывает на ножке. ареф
 
 Top
Alexur Post Id



Рядовой


Сообщений всего: 18
Дата рег-ции: Янв. 2010  



В общем такой код на кодевижеонавр
------------
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).
Я так понял значение выходит за пределы... как мне считать правельный результат???
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



Alexur пишет:
как мне считать правельный результат?
запустить проект в железе и никогда больше не пользоваться разными эмуляторами. Тем более когдра речь идёт об Аналоговых измерениях
 
 Top
Alexur Post Id



Рядовой


Сообщений всего: 18
Дата рег-ции: Янв. 2010  



nest пишет:
запустить проект в железе и никогда больше не пользоваться разными эмуляторами
Для этого мне нужно знать как преобразовать байтный регистр(типа ADCL) в десятичное число?
 
 Top
redcat Post Id



Главнокомандующий


Сообщений всего: 387
Дата рег-ции: Янв. 2009  



Alexur пишет:
Для этого мне нужно знать как преобразовать байтный регистр(типа ADCL) в десятичное число?
- Для запуска проекта на железе, этого знать не нужно.
 
 Top
Alexur Post Id



Рядовой


Сообщений всего: 18
Дата рег-ции: Янв. 2010  



redcat пишет:
Для запуска проекта на железе, этого знать не нужно.
Смысл запускать проект, если не знаешь как обрабатывать данные!!!

Просьба, если кто знает как преобразовать байтный регистр(типа ADCL) в десятичное число, скажите пожалуйста.
 
 Top
Страниц (2): [1] 2 »
« Делимся опытом »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru