roboforum.ru

Технический форум по робототехнике.

 

АЦП Atmega8

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

АЦП Atmega8

Сообщение arm-17 » 04 янв 2015, 23:53

Код АЦП вывод на LCD
чета не фурычит,не судите строго только изучаю АЦП.
пишу только на ASM. В инете не одного примера АЦП на ASM и Atmega8.
знающие люди помогите плизз.


Код: Выделить всёРазвернуть
.include "m8def.inc"
#define F_CPU (4000000)

.def Temp1=R16
.def Temp2=R17

.equ AtBCD0 = 4 ;address of r4 äëÿ ïîäïðîãðàììû BIN2_BCD
.equ AtBCD2 = 6 ;address of r6

.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


   rcall lcd_init ; инициализация дисплея

sei
rjmp main2




main:
rjmp main

main2:
sbi ADCSR, 6

rjmp main
;********************************************************
ADC_CC:
in temp2, ADCL
in temp1, ADCH
;********************************************************
BIN_BCD:

; Input (r17:r16) output BCD number (r6:r5:r4:r3:r2).
; High registers used: 4(r16,r17,r18,r19)
; Pointers used: Z

   ldi r18,16 ;Init loop counter ;init ñ÷åò÷èê öèêëà
   clr r6 ;clear result (3 bytes); ÷åòêèé ðåçóëüòàò (3 áàéòà)
   clr r5
   clr r4
   clr ZH ;clear ZH (not needed for AT90Sxx0x); ÿñíî, ZH (íå òðåáóåòñÿ äëÿ AT90Sxx0x)
bBCDx_1:
   lsl r16 ;shift input value; ñäâèã âõîäíîãî çíà÷åíèÿ
   rol r17 ;through all bytes, ÷åðåç âñåõ áàéòîâ
   rol r4 ;
   rol r5
   rol r6
   dec r18 ;decrement loop counter; óìåíüøåíèå ñ÷åò÷èê öèêëà
   brne bBCDx_2 ;if counter not zero, åñëè ñ÷åò÷èê íå ðàâåí íóëþ
; ðàñïðåäåëèì ÷èñëà ïî ÿ÷åéêàì
ldi r18,0x0F
   mov r2,r4
   and r2,r18
   swap r4
   mov r3,r4
   and r3,r18
   mov r4,r5
   and r4,r18
   swap r5
   and r5,r18
   ret ;return

bBCDx_2:
   ldi r30,AtBCD2+1 ;Z points to result MSB + 1; Z óêàçûâàåò íà ðåçóëüòàò MSB + 1
bBCDx_3:
   ld r19,-Z ;get (Z) with pre-decrement, ïîëó÷èòü (Z) ñ ïðåäåêðåìåíòà
   subi r19,-$03 ;add 0x03
   sbrc r19,3 ;if bit 3 not clear; åñëè áèò 3 íå ÿñíî,
   st Z,r19 ;store back
   ld r19,Z ;get (Z)
   subi r19,-$30 ;add 0x30
   sbrc r19,7 ;if bit 7 not clear; åñëè áèò 7 íå ÿñíî,
   st Z,r19 ;store back
   cpi ZL,AtBCD0 ;done all three?; ñäåëàòü âñå òðè?
   brne bBCDx_3 ;loop again if not; öèêë ñíîâà, åñëè íå
;   rjmp bBCDx_1
;****************************************************************
;**********************************************************************
;ButtonRes:
;âûâîä íà lcd
ldi r16,0x45   ;;;;;;;;;;
rcall LCD_SetAddressDD   ;êîîðäèíàòû â LCD   ;;;;;;;;;;;

   mov   temp1,r6 ;;;;;;;;;;;
   rcall   LCD_WriteData ;;;;;;;;;;;
   mov   temp1,r5 ;;;;;;;;;;;;
   rcall   LCD_WriteData ;;;;;;;;;;
   mov   temp1,r4 ;;;;;;;;;;;;;;
   rcall   LCD_WriteData ;;;;;;;;;;
   mov   temp1,r3 ;;;;;;;;;;;;
   rcall   LCD_WriteData ;;;;;;;;
   mov   temp1,r2 ;;;;;;;;;;
   rcall   LCD_WriteData ;;;;;;;;;;;;;


;************************************************************************


; ADC_CC:


; in temp1, ADCH

; out portd,temp1
; in temp1, ADCH
; out portb,temp1
reti




.include file "C:\AVR\WH3\hd44780.asm"
Аватара пользователя
arm-17
 
Сообщения: 46
Зарегистрирован: 15 июл 2013, 15:15
Откуда: г.Москва
прог. языки: ASM

Re: АЦП Atmega8

Сообщение Duhas » 05 янв 2015, 09:57

начнем с простого - в конце прерывания ставится reti, а не ret, reti - кроме возврата в место вызова обработчика прерывания дополнительно включает прерывания.

далее - отделите мух от котлет и вставьте сюда код инициализации и работы с АЦП.

далее - а вывод на дисплей отдельно от АЦП у вас работает?
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6341
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: АЦП Atmega8

Сообщение arm-17 » 05 янв 2015, 13:56

Вот последняя версия кода)
Как сделать так чтоб данные из АЦП (ADCL,ADCH) попадали в BIN_BCD

не пойму как сделать запись???
на LCD отоброжает 0000 и ничего не меняется.

Код: Выделить всёРазвернуть
.include "m8def.inc"
#define F_CPU (4000000)

.def temp1 = R16
.def temp2 = R17
.equ AtBCD0 = 4 ;address of r4 äëÿ ïîäïðîãðàììû BIN2_BCD
.equ AtBCD2 = 6 ;address of r6

.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   DDRB,temp1   ;Íàïðàâëåíèå äàííûõ ïîðòà B íà âûâîä,(LCD-äèñïëåé)
   out   PORTB,temp1   ;Âûäàòü äàííûå íà ïîðò Â


ldi Temp1, 0b10101011
out ADCSR, Temp1


ldi Temp1, 0b00000000
out ADMUX, Temp1

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


   rcall lcd_init;Èíèöèàëèçàöèÿ äèñïëåÿ.


sei
rjmp main2




main:
rjmp main

main2:
sbi ADCSR, 6

rjmp main
;********************************************************
ADC_CC:
;ldi r17,high(54321)
;ldi r16,low(54321)


in temp2, ADCL
in temp1, ADCH
;********************************************************************
BIN_BCD:

; Âõîä (r17: r16) Âûõîä BCD ÷èñëî (R6: R5: r4: R3: R2).
; Âûñîêèå ðåãèñòðû èñïîëüçóþòñÿ: 4 (R16, R17, R18, R19)
; Óêàçàòåëè èñïîëüçóþòñÿ: Z

   ldi r18,16 ;Init loop counter ;init ñ÷åò÷èê öèêëà
   clr r6 ;clear result (3 bytes); ÷åòêèé ðåçóëüòàò (3 áàéòà)
   clr r5
   clr r4
   clr ZH ;clear ZH (not needed for AT90Sxx0x); ÿñíî, ZH (íå òðåáóåòñÿ äëÿ AT90Sxx0x)
bBCDx_1:
   lsl r16 ;shift input value; ñäâèã âõîäíîãî çíà÷åíèÿ
   rol r17 ;through all bytes, ÷åðåç âñåõ áàéòîâ
   rol r4 ;
   rol r5
   rol r6
   dec r18 ;decrement loop counter; óìåíüøåíèå ñ÷åò÷èê öèêëà
   brne bBCDx_2 ;if counter not zero, åñëè ñ÷åò÷èê íå ðàâåí íóëþ
; ðàñïðåäåëèì ÷èñëà ïî ÿ÷åéêàì
    ldi r18,0x0F
   mov r2,r4
   and r2,r18
   swap r4
   mov r3,r4
   and r3,r18
   mov r4,r5
   and r4,r18
   swap r5
   and r5,r18
;   ret ;return
    rjmp LCD_Write

bBCDx_2:
   ldi r30,AtBCD2+1 ;Z points to result MSB + 1; Z óêàçûâàåò íà ðåçóëüòàò MSB + 1
bBCDx_3:
   ld r19,-Z ;get (Z) with pre-decrement, ïîëó÷èòü (Z) ñ ïðåäåêðåìåíòà
   subi r19,-$03 ;add 0x03
   sbrc r19,3 ;if bit 3 not clear; åñëè áèò 3 íå ÿñíî,
   st Z,r19 ;store back
   ld r19,Z ;get (Z)
   subi r19,-$30 ;add 0x30
   sbrc r19,7 ;if bit 7 not clear; åñëè áèò 7 íå ÿñíî,
   st Z,r19 ;store back
   cpi ZL,AtBCD0 ;done all three?; ñäåëàòü âñå òðè?
   brne bBCDx_3 ;loop again if not; öèêë ñíîâà, åñëè íå
   rjmp bBCDx_1
;*************************************************************************
;**********************************************************************
LCD_Write:
;ïðåîáðàçîâàòü äåñÿòè÷íûé êîä â ASCII   
   ldi   temp1,0x30   ;Ñìåùåíèå äëÿ ASCII êîäà
   add   r2,temp1    ;r2
   add   r3,temp1    ;r3
   add   r4,temp1    ;r4
   add   r5,temp1    ;r5
   add   r6,temp1    ;r6

;*************************************************************************

;âûâîä íà lcd
ldi r16,0x45   ;;;;;;;;;;
rcall LCD_SetAddressDD   ;êîîðäèíàòû â LCD   ;;;;;;;;;;;

   mov   temp1,r2 ;;;;;;;;;;;
   rcall   LCD_WriteData ;;;;;;;;;;;
   mov   temp1,r3 ;;;;;;;;;;;;
   rcall   LCD_WriteData ;;;;;;;;;;
   mov   temp1,r4 ;;;;;;;;;;;;;;
   rcall   LCD_WriteData ;;;;;;;;;;
   mov   temp1,r5 ;;;;;;;;;;;;
   rcall   LCD_WriteData ;;;;;;;;
   mov   temp1,r6 ;;;;;;;;;;
   rcall   LCD_WriteData ;;;;;;;;;;;;;


;************************************************************************
;sbi ADCSR, 6

; ADC_CC:


; in temp1, ADCH

; out portd,temp1
; in temp1, ADCH
; out portb,temp1
reti




.include file "C:\AVR\WH3\hd44780.asm"
Вложения
код.png
Последний раз редактировалось arm-17 06 янв 2015, 01:10, всего редактировалось 1 раз.
Аватара пользователя
arm-17
 
Сообщения: 46
Зарегистрирован: 15 июл 2013, 15:15
Откуда: г.Москва
прог. языки: ASM

Re: АЦП Atmega8

Сообщение Duhas » 05 янв 2015, 14:20

если в прерывании по АЦП

;ldi r17,high(54321)
;ldi r16,low(54321)


in temp2, ADCL
in temp1, ADCH

поменять на

ldi r17,high(54321)
ldi r16,low(54321)


;in temp2, ADCL
;in temp1, ADCH

то 54321 на дисплее выводится ?
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6341
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: АЦП Atmega8

Сообщение arm-17 » 05 янв 2015, 16:04

12345 выводится)))
Аватара пользователя
arm-17
 
Сообщения: 46
Зарегистрирован: 15 июл 2013, 15:15
Откуда: г.Москва
прог. языки: ASM

Re: АЦП Atmega8

Сообщение Duhas » 05 янв 2015, 16:29

окей, ползем дальше, у вас опорное напряжение какое?
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6341
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: АЦП Atmega8

Сообщение arm-17 » 05 янв 2015, 20:26

симуляция в PROTEUS опорное напр.внешнее через дроссель 100uH между AREF и ACC
без дроселя фигачил ошибки.Сейчас все O.K
Аватара пользователя
arm-17
 
Сообщения: 46
Зарегистрирован: 15 июл 2013, 15:15
Откуда: г.Москва
прог. языки: ASM

Re: АЦП Atmega8

Сообщение Duhas » 06 янв 2015, 10:48

эхх, с реальностью как-то проще )
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6341
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: АЦП Atmega8

Сообщение arm-17 » 06 янв 2015, 22:09

Ну что есть(
Аватара пользователя
arm-17
 
Сообщения: 46
Зарегистрирован: 15 июл 2013, 15:15
Откуда: г.Москва
прог. языки: ASM


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Mail.ru counter