D/A převodník DAC0832 - velikost výstupního napětí
Moderátor: Moderátoři
- Johny_Servis
- Příspěvky: 11
- Registrován: 09 úno 2010, 00:00
- Johny_Servis
- Příspěvky: 11
- Registrován: 09 úno 2010, 00:00
Jedná se o generátor, který generuje POUZE jednu sinusovku při stisknutí příslušného tlačítka - tj. stisknu a vyrobí mi jeden průběh o předdefinovné (naprogramované) frekvenci.
Úplně úvodní nastavení "konfigurace PIC" (věci jako CP, Watch Dog...) sem vynechal - nastaveny tak jako obvykle
-> zde problém nebude.
Nejprve vydíme nastavení jednotlivých pinů
CS a WR1 jsou piny připojeny ke svým jmenovcům na D/A převodníku
zap a vyp - tlačítka - zatím nepoužita - nepodstatné
tl1 - spustí sinusovku 1kHz
tl2 - spustí sinusovku 500Hz
V části "nastavení portů" mám jenom nastavené porty pro potřeby obsluhy tlačítek (PORTA), zobrazení informace o zvolené sinusovce na 7 segmentovce (PORTB), a samotná data pro D/A lezou přes PORTC - řízení D/A - tj. CS a WR jsou spodní 2 bity (nultý a první) na PORTA (tedy na Ačku mám 4 tlačítka a 2 řídící piny)
-> zde problém nebude
"Hlavní program" běží v nekonečné smyčce a ptá se, jestli bylo stisknuto nějaké tlačítko (tj, jesli je na příslušném pinu PORTuA log. 0) - za klidu je na všech tlačítkových pinech totiž log. 1 a stisk tlačítka je uzemňuje. Pokud bylo stisknuto příslušné tlačítko, tak se zavolá tomu odpovídající podprogram
-> zde problém také nebude - podprogramy se volají (i vrací) korektně
"Sinusovka 1kHz" je již podprogram, který vygeneruje pouze jeden průběh o kmitočtu 1kHz.
postupně do D/A nasypu 17 hodnot, tak aby mě vykreslily sinusovku - tj. podprogram proběhne pouze jedinkrát, pak se vrací do hlavního programu.
->Čekací smyčky asi časově korespondují - 4ms a 50us - použil jsem krystal 3,2768MHz (můj oblíbenec
->registr MEMORY_B je pouze pro uložení informace pro 7 segmentovku - pro faktický chod programu nepodstatné
->Nechal jsem zde pouze podprogram pro 1kHz sinusovku - aby to nezabíralo moc místa
-> jesli bude někde problém, tak v tom, jak zacházím s bity CS a WR1 - snažil jsem se to pochopit z datasheetu, ale víceméně jsem to tipnul.
-> piny WR2 a XFER mám trvale uzeměny (log.0)
Kód: Vybrat vše
; Bits definition :
#define CS PORTA,0 ;CS
#define WR1 PORTA,1 ;WR1
#define zap PORTA,2 ;připoj k ústředně
#define vyp PORTA,3 ;odpoj od ústředny
#define tl1 PORTA,4 ;tlačítko 1 (sin_1kHz)
#define tl2 PORTA,5 ;tlačítko 2 (sin_2kHz)
;START
org 0x0000 ;program starts at address 0x000
;*********************************************
;***************nastavení portů***************
;*********************************************
bsf STATUS,RP0 ;bank 1
movlw 0x06
movwf ADCON1
clrf TRISC ;TRISC(data) bude 0=>výstup
clrf TRISB ;TRISB(zobrazení) bude 0=>výstup
movlw b'11111100' ;TRISA0,1(řízení) bude 0=>výstup
movwf TRISA
bcf STATUS,RP0 ;bank 0
;*********************************************
;***************natsavení portů***************
;*********************************************
;*********************************************
;***************HLAVNÍ PROGRAM****************
;*********************************************
movlw 0xFF
movwf PORTB
main: movfw MEMORY_B
movwf PORTB
main2: call T_4ms
btfss tl1 ;je stisknuto 1.tlačítko?
call sine_one ;ANO - volej sine_one
call T_4ms
btfss tl2 ;NE - je stisknuto 2.talčítko?
call sine_two ;ANO - volej sine_two
goto main2 ;vrať se na začátek
;*********************************************
;***************HLAVNÍ PROGRAM****************
;*********************************************
;********************************************
;***************sinusovka 1kHz***************
;********************************************
sine_one:
movlw 0xDE ;zobraz číslici 1
movwf MEMORY_B ;ulož číslici do reg. MEMORY_B
movwf PORTB ;zobraz číslici na PORTB
call T_4ms
bcf CS ;1 =>nula
movlw .128
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS ;2 =>pi/8
movlw .177
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS
movlw .218 ;3 =>pi/4
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS
movlw .246 ;4 =>3pi/8
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS
movlw .255 ;5 =>pi/2
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS
movlw .246
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS
movlw .218
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS
movlw .177
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS
movlw .128
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS
movlw .79
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS
movlw .38
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS
movlw .10
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS
movlw .0
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS
movlw .10
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS
movlw .38
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS
movlw .79
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
bcf CS
movlw .128
movwf PORTC
bcf WR1
nop
bsf WR1
call T_50us
bsf CS
jmp btfss tl1
goto jmp
return
;********************************************
;***************sinusovka 1kHz***************
;********************************************
;**********************************************************
T_50us: movlw 0x0C ;čekej 50 us
movwf cnt1
decfsz cnt1,F
goto $-1
return
T_4ms: movlw 0x4B ;čekej 4 ms
movwf cnt2
T_4ms2: call T_50us
decfsz cnt2,F
goto T_4ms2
return
end
- Johny_Servis
- Příspěvky: 11
- Registrován: 09 úno 2010, 00:00