D/A převodník DAC0832 - velikost výstupního napětí

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#16 Příspěvek od Andrea »

Tak hledej botu v zapojení. Pin 12 máš připojenej na zem, stejně tak + vstup OZ, pin 11 máš připojenej na - vstup OZ a pin 9 na výstup OZ?
Uživatelský avatar
Johny_Servis
Příspěvky: 11
Registrován: 09 úno 2010, 00:00

#17 Příspěvek od Johny_Servis »

Pozor, pozor - já vůl - předtím jsem DC neměl - měl jsem AC vazbu - teď už to opravdu vychází - výstup prvního OZ je pod nulou!
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#18 Příspěvek od Andrea »

No sláva, tak sem ještě dej ten program z PICu.
Uživatelský avatar
Johny_Servis
Příspěvky: 11
Registrován: 09 úno 2010, 00:00

#19 Příspěvek od Johny_Servis »

Co to vlastně dělá?
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 :) - nevytvářel jsem je já, ale firma ASIX, tak by měly byt OK.

->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
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#20 Příspěvek od Andrea »

Tak to je teda brutální generování sinusovky, na to je toho 8-bit převodníku docela škoda. Už taky chápu proč je ta sinusovka na výstupu prvního OZ "děsně zubatá". Čekala jsem nějakou tabulku sinu + DDS, ale budiž, vypadá to, že by to mělo fungovat. A když tak umíš s tim osciloskopem, nemáš náhodou přepnutou sondu na 10:1 a v osciloskopu nastaveno 1:1? Někde ta chyba musí být.
Uživatelský avatar
Johny_Servis
Příspěvky: 11
Registrován: 09 úno 2010, 00:00

#21 Příspěvek od Johny_Servis »

:-D

Máš u mě pivo!

Je to zajebaný moderní osciloskop který mám pučený a nevyznám se v něm - skutečně

sonda 10x
osciloskop 1X

=> změnil jsem nastavení a už to funguje perfektně


Díky - není nad to, když na fóra chodija ludé s velikou představivostí a ochotou pomoci

ještě jednou - díky!!!!!!!!!!!!!!!!
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#22 Příspěvek od Andrea »

Pivo si nech :lol: A na osciloskop nenadávej, ten za to nemůže. :wink:
Uživatelský avatar
Bernard
Příspěvky: 3654
Registrován: 27 kvě 2005, 00:00

#23 Příspěvek od Bernard »

Já taky děkuji. Mám v oblibě detektivní seriály, ale na tuhle epizodu by byl i Columbo krátký! :D
Uživatelský avatar
Crifodo
Příspěvky: 14779
Registrován: 11 říj 2005, 00:00

#24 Příspěvek od Crifodo »

Andrea píše:Tak to je teda brutální generování sinusovky.

každý nemá talent Sira Cliva pro implementaci goniometrických funkcí do pár kB ROMky :roll:
Uživatelský avatar
ST78
Příspěvky: 116
Registrován: 16 lis 2009, 00:00

#25 Příspěvek od ST78 »

Andreo, tiše tě začínám obdivovat :wink:
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“