;Autor: Marino Jurinović
;16MHz Arduino ATmega328P
;1/16MHz=6,26E-8 sekundi
;
;
;r16 ULAZ5, LO DELAY
;r18 ULAZ4, HI DELAY
;r20 ULAZ3, speed, init_ADC, start_ADC
;r22 ULAZ2, donji pt, ADC.LO
;r24 ULAZ1, gornji pt , ADC.HI
;r17 BROJ SEMPLINGA 127,do 256
;r19 ADCSRA =0xC7 , 4. BIT
;r21 ADCSRA
;r23 ADCH! UHI
;r25 MOJ DELAY_HI IZ R16
;r26 MOJ DELAY_LO IZ R18
;r27 SAMPLE(-1)
;r28 <-R20 , TRIG
;r29
;r30 ->Z-MLO DOBIVA ULAZ ZA POLJE SA R22
;r31 ->Z-MHI DOBIVA ULAZ ZA POLJE SA R24
;---------------
; Assembly Code
;---------------
#define __SFR_OFFSET 0x00
#include "avr/io.h"
;------------------------
.global init_ADC
.global init_and_read_ADC1
.global start_ADC
.global rread0_ADC
.global rread_ADC
.global read_ADC
;------------------------
init_ADC:
PUSH R16
PUSH R17
PUSH R18
PUSH R19
PUSH R20
PUSH R21
PUSH R22
PUSH R23
PUSH R24
PUSH R25
PUSH R26
PUSH R27
PUSH R28
PUSH R29
PUSH R30
PUSH R31
LDI R20, 0xFF
//OUT DDRD, R20 ;set port D as o/p for low byte result
//OUT DDRB, R20 ;set port B as o/p for high byte result
//SBI DDRC, 0 ;set pin PC0 as i/p for ADC0
;--------------------------------------------------------------
LDI R20, 0x60 ;0xC0 ;internal 2.56V, right-justified data, ADC0
;LDI R20, 0xE0 ;internal 2.56V, left-justified data, ADC0
STS ADMUX, R20
LDI R20,0xC0
ADD R20,R24
;LDI R20, 0x82 ;enable ADC, ADC prescaler CLK/128
STS ADCSRA, R20
POP R31
POP R30
POP R29
POP R28
POP R27
POP R26
POP R25
POP R24
POP R23
POP R22
POP R21
POP R20
POP R19
POP R18
POP R17
POP R16
RET
;==========================
init_and_read_ADC1:
PUSH R16
PUSH R17
PUSH R18
PUSH R19
PUSH R20
PUSH R21
PUSH R22
PUSH R23
PUSH R24
PUSH R25
PUSH R26
PUSH R27
PUSH R28
PUSH R29
PUSH R30
PUSH R31
LDI R21, 0xFF
//OUT DDRD, R20 ;set port D as o/p for low byte result
//OUT DDRB, R20 ;set port B as o/p for high byte result
//SBI DDRC, 0 ;set pin PC0 as i/p for ADC0
;--------------------------------------------------------------
LDI R21, 0x61 ;0xC0 ;internal 2.56V, right-justified data, ADC1
;LDI R21, 0xE0 ;internal 2.56V, left-justified data, ADC1
STS ADMUX, R21
LDI R21,0xC0
ADD R21,R20
;LDI R21, 0x82 ;enable ADC, ADC prescaler CLK/128
STS ADCSRA, R21
CALL read1_ADC ; jedno mjerenje ;cca12;4cyc
; LDS R22 , ADCL ;ULO ;2cyc
LDS R23 , ADCH ;UHI
MOV R31, R24 ; R24 SADA SLOBODAN?
MOV R30, R22 ;r22 SADA SLOBODAN?
;PRELAZAK NA 3D
; ST Z+, R24 ;T3/3 ;2cyc
; ST Z+, R22 ;T3/3 ;2cyc
ST Z+, R23 ;2cyc
POP R31
POP R30
POP R29
POP R28
POP R27
POP R26
POP R25
POP R24
POP R23
POP R22
POP R21
POP R20
POP R19
POP R18
POP R17
POP R16
RET
;==========================
rread0_ADC:
PUSH R16
PUSH R17
PUSH R18
PUSH R19
PUSH R20
PUSH R21
PUSH R22
PUSH R23
PUSH R24
PUSH R25
PUSH R26
PUSH R27
PUSH R28
PUSH R29
PUSH R30
PUSH R31
;OVAJ RED ZA SPEED
MOV R28 , R20 ; LDI R28 , 128 ; MOV R28 , R20
LDI R17 , 127 ;do 255, =N_MAX ;1cyc
MOV R31, R24 ; R24 SADA SLOBODAN?
MOV R30, R22 ;r22 SADA SLOBODAN?
opetlja1b:
; CALL read1_ADC
LDI R19,0xC3;LDI R19,0xC7 ;1cyc
;ADD R19,R20 ;1cyc
STS ADCSRA, R19 ;1cyc
;LDS R22 , ADCL ;ULO
LDS R23 , ADCH ;UHI
CP R23 , R28
BRSH opetlja1b
opetlja1a:
MOV R27 , R23
; CALL read1_ADC
LDI R19,0xC3;LDI R19,0xC7 ;1cyc
;ADD R19,R20 ;1cyc
STS ADCSRA, R19 ;1cyc
;LDS R22 , ADCL ;ULO
LDS R23 , ADCH ;UHI
;CALL cekaj
CP R27 , R28
BRSH opetlja1a
CP R23 , R28
BRLO opetlja1a
;::::::::::::::::::::::::::::::
opetlja2:
;MOV R27, R23 ;1cyc
; CALL read1_ADC ; jedno mjerenje ;7+4cyc
LDI R19,0xC3;LDI R19,0xC7 ;1cyc
;ADD R19,R20 ;1cyc
STS ADCSRA, R19 ;1cyc
;LDS R22 , ADCL ;ULO ;2cyc
LDS R23 , ADCH ;UHI ;2cyc
; CALL u_memoriju ;zapisivanje podataka u memoriju ;6+4cyc
ST Z+, R23 ;2cyc
;CALL cekaj ;cekanje u duljini od d_int*4/16e6 ;cca 9+4cyc
DEC R17 ;R17 ;1cyc
CPI R17 , 0 ; R17,4 ;počinje usporedba ;1cyc
BREQ okraj ; ako je napravljano127 uzoraka ;1-2cyc
;CP R27 , R28 ; počinje usporedba ;1cyc
;BRSH opetlja2 ; ako je predzadnji podataka isti ili veći od trigera nastavi uzorkovati
;12cyc
;CP R23 , R28 ; počinje usporedba ;1cyc
;BRLO opetlja2 ; ako je zadnji podatak manji od trigera nastavi uzorkovati
;12cyc
RJMP opetlja2 ;2cyc
okraj:
MOV R27, R23
; CALL read1_ADC
LDI R19,0xC3;LDI R19,0xC7 ;1cyc
;ADD R19,R20 ;1cyc
STS ADCSRA, R19 ;1cyc
;LDS R22 , ADCL ;UHI
LDS R23 , ADCH ;UHI
; CALL u_memoriju
ST Z+, R23 ;2cyc
;LDI R22 , 0
LDI R23 , 0
;CALL u_memoriju
ST Z+, R23 ;2cyc
;LDI R22 , 255
LDI R23 , 255
;CALL u_memoriju
ST Z+, R23 ;2cyc
POP R31
POP R30
POP R29
POP R28
POP R27
POP R26
POP R25
POP R24
POP R23
POP R22
POP R21
POP R20
POP R19
POP R18
POP R17
POP R16
RET
;-rread0_ADC
;==========================
rread_ADC:
PUSH R16
PUSH R17
PUSH R18
PUSH R19
PUSH R20
PUSH R21
PUSH R22
PUSH R23
PUSH R24
PUSH R25
PUSH R26
PUSH R27
PUSH R28
PUSH R29
PUSH R30
PUSH R31
;OVAJ RED ZA SPEED
MOV R28 , R20; LDI R28 , 128 ; MOV R28 , R20
LDI R17 , 127 ;do 255, =N_MAX ;1?
MOV R31, R24 ; R24 SADA SLOBODAN?
MOV R30, R22 ;r22 SADA SLOBODAN?
petlja1b:
; CALL read1_ADC
LDI R19,0xC3;LDI R19,0xC7 ;1cyc
;ADD R19,R20 ;1cyc
STS ADCSRA, R19 ;1cyc
LDS R23 , ADCH ;UHI
CP R23 , R28
BRSH petlja1b
petlja1a:
MOV R27 , R23
; CALL read1_ADC
LDI R19,0xC3;LDI R19,0xC7 ;1cyc
;ADD R19,R20 ;1cyc
STS ADCSRA, R19 ;1cyc
LDI R19,0xC3;LDI R19,0xC7 ;1cyc
;ADD R19,R20 ;1cyc
STS ADCSRA, R19 ;1cyc
;LDS R22 , ADCL ;ULO
LDS R23 , ADCH ;UHI
CALL cekaj
CP R27 , R28
BRSH petlja1a
CP R23 , R28
BRLO petlja1a
;-------------------------------
petlja1:
; CALL u_memoriju ;10-cyc;4cyc
ST Z+, R23 ;2cyc
DEC R17 ;R17 ;1cyc
;::::::::::::::::::::::::::::::
petlja2:
MOV R27, R23 ;1cyc
CALL read1_ADC ; jedno mjerenje ;cca12;4cyc
; LDS R22 , ADCL ;ULO ;2cyc
LDS R23 , ADCH ;UHI ;2cyc
; CALL u_memoriju ;zapisivanje podataka u memoriju ;10cyc
ST Z+, R23 ;2cyc
CALL cekaj ;cekanje u duljini od d_int*4/16e6 ;9-cyc;4cyc
DEC R17 ;R17 ;1cyc
CPI R17 , 0 ; R17,4 ;počinje usporedba ;1cyc
BREQ kraj ; ako je napravljano 127 uzoraka ;1-2cyc
CP R27 , R28 ; počinje usporedba ;1cyc
BRSH petlja2 ; ako je predzadnji podataka isti ili veći od trigera nastavi uzorkovati
;1-2cyc
CP R23 , R28 ; počinje usporedba ;1cyc
BRLO petlja2 ; ako je zadnji podatak manji od trigera nastavi uzorkovati
;1-2cyc
;RJMP petlja2 ;2cyc
kraj:
MOV R27, R23
CALL read1_ADC
;LDS R22 , ADCL ;ULO
LDS R23 , ADCH ;UHI
;CALL u_memoriju
ST Z+, R23 ;2cyc
LDI R22 , 0
LDI R23 , 0
;CALL u_memoriju
ST Z+, R23 ;2cyc
LDI R22 , 255
LDI R23 , 255
;CALL u_memoriju
ST Z+, R23 ;2cyc
POP R31
POP R30
POP R29
POP R28
POP R27
POP R26
POP R25
POP R24
POP R23
POP R22
POP R21
POP R20
POP R19
POP R18
POP R17
POP R16
RET
;-rread_ADC
;=============================
read1_ADC:
;OVA DVA REDA ZA SPEED
LDI R19,0xC3;LDI R19,0xC7 ;1cyc
;ADD R19,R20 ;1cyc
STS ADCSRA, R19 ;1cyc
;---------------------------------------------
; LDI R22, 0 ;T1/3 ;1cyc
; LDI R24, 0 ;T1/3 ;1cyc
wait1_ADC:
LDS R19, ADCSRA ;check ADIF flag in ADCSRA ;2cyc
SBRC R19, 4 ; ;1-2-3cyc
RJMP dalje1 ;2cyc
INC R22 ;T2/3 ;1cyc
; CPI R22 , 0 ;1cyc
; BRNE dalje0 ;1-2cyc
; INC R24 ;T2/3 ;1cyc
;OVA DVA REDA ZA SPEED
LDI R21, 0xD3 ;LDI R27, 0xD7 ;set ADIF flag again ;1cyc
//ADD R21 , R20
STS ADCSRA, R21 ;so that controller clears ADIF ;1cyc
dalje0:
RJMP wait1_ADC ;2 ; ADIF zastavica ;2cyc
;-------------------------------------------
dalje1:
RET ;4cyc
;-read1
;==============================
u_memoriju:
;ZA PRRELAZAK U 3D
; ST Z+, R24 ;T3/3 ;2cyc
; ST Z+, R22 ;T3/3 ;2cyc
ST Z+, R23 ;2cyc
RET ;4cyc
;10cyc
;==============================
cekaj:
MOV R26 , R18 ;1cyc
MOV R25 , R16 ;1cyc
visi:
DEC R26 ;1cyc
nizi:
DEC R25 ;1cyc
CPI R25 , 0 ;1cyc
BRNE nizi ;1-2cyc
CPI R26 , 0 ;1cyc
BRNE visi ;1-2cyc
RET ;4cyc
;======================
Dnevnik.hr
Gol.hr
Zadovoljna.hr
Novaplus.hr
NovaTV.hr
DomaTV.hr
Mojamini.tv
Veliki je broj onih koji su upoznali i imaju Arduino Uno, ali rijetko tko od njih je uspio provesti analogna mjerenja tolikom brzinom koliko to dozvoljava mikrokontroler (klasično jedno analogno mjerenje u Arduino Uno traje cca. 100 mikrosekundi, a u ovom programu traje cca. 1 mikrosekundu).
Ovaj projekt ima i još neke posebnosti:
- provode se se 8-bitna mjerenja napona na pinu A0 (sa rezultatime 0-255, a ne 10-bitna sa rezultatima 0-1023),;
- pomoću naponskog djelila uobičajen raspon rada Arduina Uno (od 0 do 5V) "premješten" je, za potrebe mjerenja ulaznog izmjeničnog napona, na -2,5V do 2,5V;
- osciloskopski rad ne iziskuje nikakva podešavanja, program sam prepoznaje trajanje periode mjerenog signala i sukladno tome na ekranu iscrta cca 124 uzoraka iz periode i precizne podatke o parametrima mjerenog signala (maksimalna vrijednost, srednja vrijednost, frekvencija ....)
- pomoću DFT je iz uzoraka jedne periode moguće napraviti frekventnu analizu mjerenog signala ,tako da postoji sklopka pomoću koje se na ekranu umjesto vremenskog prikaza jedne periode može vidjeti frekventna analiza mjerenog signala
- ....
Osnovna URL adresa:
https://blog.dnevnik.hr/osciloskop
Najbitnije objave su:
- Sheme (3.10.2024.)
- Opis uređaja (6.10.2024.)
- *.ino datoteka (6.10.2024.)
- *.S datoteka (6.10.2024.)
URL adrese iz kojih sam dobio ideju za ovaj projekt:
Video 1
Video 2
Video 3
Video 4
Napomena: Prokazivanje fazno-frekventne karakteristike u frekventoj analizi je neprimjereno, ali nisam imao vremena to popraviti, trko hoće može samo malo izmijeniti funkciju .crtaj_i_pisi_frekventnu u *.ino datoteci.