Virtual Dj vezérlő

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Sorosport: 115200 bps ~ 10 kbyte/sec => 10.000 karakter!
A billentyűzet 30 karakterével szemben.....
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

Hozzászólás Szerző: Bence »

Az jó! :D
Kész van nagyából a program, csak az a baj, hogy ha tul gyorsan tekerem a potmétert, akkor nem megy végig. Lehet, hogy az a baj, hogy 10000000 MHz és 57600 bps-nél 7,84 % a hiba?
Itt a kód:

Kód: Egész kijelölése

$regfile = "m8def.dat"
$crystal = 10000000
$baud = 57600


Config Adc = Single , Prescaler = Auto
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output
Config Portb.0 = Output


Reset Portd.5
Reset Portd.6
Reset Portd.7
Reset Portb.0


Start Adc


Dim W(5) As Word
Dim We(5) As Word
Dim Ido(5) As Word
Dim B As Byte
Dim Getadcv As Byte
Dim Ir As Byte
Ido(1) = 32
Ido(2) = 32
Ido(3) = 32
Ido(4) = 32
Ido(5) = 32

For B = 1 To 5
  Getadcv = B - 1
  W(b) = Getadc(getadcv)
  Incr W(b)
  We(b) = W(b) / 32
Next

Do
    W(1) = Getadc(0)
    Incr W(1)
    W(1) = W(1) / Ido(1)
    Select Case W(1)
      Case Is > We(1) : Print "11"
      Case Is < We(1) : Print "12"
    End Select
    We(1) = W(1)


    W(2) = Getadc(1)
    Incr W(2)
    W(2) = W(2) / Ido(2)
    Select Case W(2)
      Case Is > We(2) : Print "21"
      Case Is < We(2) : Print "22"
    End Select
    We(2) = W(2)


    W(3) = Getadc(2)
    Incr W(3)
    W(3) = W(3) / Ido(3)
    Select Case W(3)
      Case Is > We(3) : Print "31"
      Case Is < We(3) : Print "32"
    End Select
    We(3) = W(3)


    W(4) = Getadc(3)
    Incr W(4)
    W(4) = W(4) / Ido(4)
    Select Case W(4)
      Case Is > We(4) : Print "41"
      Case Is < We(4) : Print "42"
    End Select
    We(4) = W(4)


    W(5) = Getadc(4)
    Incr W(5)
    W(5) = W(5) / Ido(5)
    Select Case W(5)
      Case Is > We(5) : Print "51"
      Case Is < We(5) : Print "52"
    End Select
    We(5) = W(5)
Loop

End
Bence
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Igen!

A Printnél 1% feletti hiba esetén-> kuka!
Quartzból miért nem használsz 16 MHz-set?
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

Hozzászólás Szerző: Bence »

Mert nincs itthon :D, de majd fogok venni! Csak 10 meg 4 MHz-es van itthon. De 115200 bps-sel 11059200 Hz vagy 14745600 Hz 0 %, szóval az jobb nem?
Bence
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

Hozzászólás Szerző: Bence »

Szerintetk hogyan kéne megoldani az egész áramkört? Kell összesen kb 50 gomb (két oldal 25-25 szóval minden gomb kétszer van, csak az egyik a jobb, másik a bal oldal), 5 tolo-, 7 forgó potméter, 2 rotary encoder. Egy AVR a gomboknak, ami küldi soros porton a jeleket a gépnek, a potmétereknek 2 db AVR 6-6 ADC-vel, a két encodernek 1-1 kisebb AVR. Az AVR-ek egymással hogy komunikáljanak? A szoftveres UART tud megszakitást? A "fő" AVR-nek (ami a gombokat kezeli és a géppel komunikál) elég csak annyit csinálnija, hogy továbbküldi a többi AVR (potméter, encoder) jeleit.
Bence
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A 14745600 tényleg jobb.....

Ennyi gombra:
50 gomb, az lehetne mátrixban (az egyszerre lenyomás tiltott vagy angedélyezett? -> tiltott esetre jó csak a mátrix, vagy adott kupacban nem lehet lenyomba egyszerre több, akkor lehet...)

Poti: ADCre mehet. AVRben van 6 v. 8 ill a nagyobbakban (SMD, soklábú) 16.

Enkóder: INT láb kell neki (INT0/1/2 vagy PCINTx) Enkóderenként 2 javasolt.


SWUART _nem_ tud megszakítást. Létezik valami megoldás, hogy INT lábra megy, de felejtős.
AVR-ből van 2 UART-os, pl:
M162, M324, M644 (DIP)
M64/128/1281/2561 (SMD)
M1280/M2560 (SMD, 4 UART)


De AVRAVR kapcsolatra én SPI-t használnék. Gyorabb. Bascom minták közt ott a megvalósítás is.



Akkor kell neked:
5+7 = 12 potméter (ADC)
2 enkóder = 4 INT láb

Erre elég össz 2 AVR (pl. ATMEGAx8 sorozat az SPI, ADC és a PCINT miatt)
A billentyűzetre kellene ha mátrixban van:
8*8 vagy 7*8 (ha nincs egyigejű lenyomás) -> M128SMD v. M644DIP
vagy 50 ha lehet mind egyeidejűleg (ez felejtős) ->M128 TQFP kicsi!, M1280/M2560 (SMD. 0,65mm lábközzel!!!)
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

Hozzászólás Szerző: Bence »

Az a baj, hogy egyidejű lenyomás lehetséges. :? Akkor kell 2 pl. ATMega48 a potikra ADC-vel és a 2 encderre INT0/1-re. És vmi soklábú AVR a gombokra + a soros portra és ez SPI vel komunikál a másik két AVR-rel. DIP-ben a legtöbb láb mennyi 40 (pl.: ATMega32), csak SMD-ben van sok láb? És ha I2C-vel bővítem a lábakat, az jó nem?
Bence
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A DIP-es max láb: 40.
I2Cvel bővíteni:
MCP23017 és ez tud INT-et is generálni, ha új gombnyomás van rajta (a chip 16 IO lábat tud! és max 8 fűzhető fel belőle...)...
I2C kergethető 400kHz-vel is (sőt az AVR-re is van I2C library (HW-es, slave -> mcselec.com, kb. 2000 Ft))
De van DIP-es I2C-re ADC is!


Kérdés, hogy a gomb lenyomása és a hozzákötött effektus közt mennyi idő telhet el?
400kHz buszon a I2C címzés, és beolvasás:
- címkijelölés, parancskód (2byte)
- I2Cread cím, adat (2byte)
- sallangok (start,stop...) ~1bytenyi idő.

1 sec alatt -> 400kHz (~~bit/sec)
x sec alatt -> (2+2+1)*8 = 40 bitnyi
Igy az X=40*1/400.000 = 0,1msec

Ha van 6 eszköz a buszon, akkor : 0,6 msec a késleltetés....
Avatar
herc1234
Bitfaragó
Hozzászólások: 459
Csatlakozott: 2007. február 9. péntek, 7:00

Hozzászólás Szerző: herc1234 »

Meg + még átküldöd a soros porton +a programod reagál rá :D
Az hogy a sorosportról betölteni mondjuk a bill bufferbe a pc-n
visual basicban az engem is érdekelne bár én 08-at használom..
Mert akkor müködne az én usb/soros/bill-em nekem is.
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

Hozzászólás Szerző: Bence »

Soros billentyűzet nem jó neked? (Vezérlűpult/ Kisegítő lehetőségek/ Általános/ Soros gombok használata). De ha akarod átküldöm a program forrását (igaz még csak prototipus és VB2005-ben van).
Bence
Avatar
herc1234
Bitfaragó
Hozzászólások: 459
Csatlakozott: 2007. február 9. péntek, 7:00

Hozzászólás Szerző: herc1234 »

Nem jó mivel ha a program elöbb fut mint rádugom az usb-t
akkor nem jönnek a gombok de ha az usb az első akkor müködik.
Én szolgáltatásban akarom megírni amit egy kis config program fog
futtatni de azt meg indításkor betölti.Viszont megnézném te hogy csináltad
a soros port részt mert arról ötletem sincs hogy kéne.
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

Hozzászólás Szerző: Bence »

Majd lerom, csak most laptopon vagyok nem a gépnél amin van a VB. De az én programom nem tökéletes sajnos, mert amikor betölt a program Do-Loop-ban ellenőrzi a soros portot, és így nem jelenik meg maga a program és ezért bezárni se lehet. Szval a program még fejlesztés alatt de leírom majd ha a gépnél leszek.
Bence
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

Hozzászólás Szerző: Bence »

Na itt a VB kód:

Kód: Egész kijelölése

Imports System.Runtime.InteropServices

Public Class Form1

    Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)

    Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Integer, ByVal wMapType As Integer) As Integer

    Private Const KEYEVENTF_KEYDOWN As Long = &H0
    Private Const KEYEVENTF_KEYUP As Long = &H2

    Declare Auto Function FindWindow Lib "USER32.DLL" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr

    Declare Auto Function SetForegroundWindow Lib "USER32.DLL" (ByVal hWnd As IntPtr) As Boolean



    Dim sorosport As Integer



    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.SerialPort1.Open()
       

        Do
            sorosport = Me.SerialPort1.ReadLine()

            Select Case (sorosport)
                Case 11
                    keybd_event(Keys.Y, MapVirtualKey(Keys.Y, 0), KEYEVENTF_KEYDOWN, 0)
                    keybd_event(Keys.Y, MapVirtualKey(Keys.Y, 0), KEYEVENTF_KEYUP, 0)

                Case 12
                    keybd_event(Keys.X, MapVirtualKey(Keys.X, 0), KEYEVENTF_KEYDOWN, 0)
                    keybd_event(Keys.X, MapVirtualKey(Keys.X, 0), KEYEVENTF_KEYUP, 0)

                Case 21
                    keybd_event(Keys.D, MapVirtualKey(Keys.D, 0), KEYEVENTF_KEYDOWN, 0)
                    keybd_event(Keys.D, MapVirtualKey(Keys.D, 0), KEYEVENTF_KEYUP, 0)

                Case 22
                    keybd_event(Keys.F, MapVirtualKey(Keys.F, 0), KEYEVENTF_KEYDOWN, 0)
                    keybd_event(Keys.F, MapVirtualKey(Keys.F, 0), KEYEVENTF_KEYUP, 0)

                Case 31
                    keybd_event(Keys.B, MapVirtualKey(Keys.B, 0), KEYEVENTF_KEYDOWN, 0)
                    keybd_event(Keys.B, MapVirtualKey(Keys.B, 0), KEYEVENTF_KEYUP, 0)
                    'TrackBar1.Value = TrackBar1.Value + 1

                Case 32
                    keybd_event(Keys.N, MapVirtualKey(Keys.N, 0), KEYEVENTF_KEYDOWN, 0)
                    keybd_event(Keys.N, MapVirtualKey(Keys.N, 0), KEYEVENTF_KEYUP, 0)
                    'TrackBar1.Value = TrackBar1.Value - 1

                Case 41
                    keybd_event(Keys.G, MapVirtualKey(Keys.G, 0), KEYEVENTF_KEYDOWN, 0)
                    keybd_event(Keys.G, MapVirtualKey(Keys.G, 0), KEYEVENTF_KEYUP, 0)

                Case 42
                    keybd_event(Keys.H, MapVirtualKey(Keys.H, 0), KEYEVENTF_KEYDOWN, 0)
                    keybd_event(Keys.H, MapVirtualKey(Keys.H, 0), KEYEVENTF_KEYUP, 0)

                Case 51
                    keybd_event(Keys.C, MapVirtualKey(Keys.C, 0), KEYEVENTF_KEYDOWN, 0)
                    keybd_event(Keys.C, MapVirtualKey(Keys.C, 0), KEYEVENTF_KEYUP, 0)

                Case 52
                    keybd_event(Keys.V, MapVirtualKey(Keys.V, 0), KEYEVENTF_KEYDOWN, 0)
                    keybd_event(Keys.V, MapVirtualKey(Keys.V, 0), KEYEVENTF_KEYUP, 0)

                Case 61
                    keybd_event(Keys.Q, MapVirtualKey(Keys.Q, 0), KEYEVENTF_KEYDOWN, 0)
                    keybd_event(Keys.Q, MapVirtualKey(Keys.Q, 0), KEYEVENTF_KEYUP, 0)

                Case 62
                    keybd_event(Keys.W, MapVirtualKey(Keys.W, 0), KEYEVENTF_KEYDOWN, 0)
                    keybd_event(Keys.W, MapVirtualKey(Keys.W, 0), KEYEVENTF_KEYUP, 0)

            End Select
        Loop

    End Sub


End Class
Remélem segít!
Bence
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

Hozzászólás Szerző: nobody_hun »

Bence írta:... nem tökéletes sajnos, mert amikor betölt a program Do-Loop-ban ellenőrzi a soros portot, és így nem jelenik meg maga a program és ezért bezárni se lehet...
Tegyél a form-ra egy timer controlt és onnan hívd meg a soros porti rutint. Valamivel lassabb lesz, mint a do-loop, de nem jelentősen.
"Az IC-k füsttel működnek. Ha kijön belőlük a füst, nem működnek tovább." - ismeretlen szerző
"Az ID:FFFFFF egyenlő az Atmel még nem kiadott processzorával."
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

Hozzászólás Szerző: Bence »

Először úgy csináltam, és sokkal lassabb volt. Amikor eltekertem a potmétert és a VDJ-ben szép lassan átment, most így, rögtön megy utána a potméter. Most azt találtam ki, hogy lesz két program, az egyik elindítja a másikat, a 2. láthatatlan és az 1.-ből be lehet zárni a 2.-at.
Bence
Válasz küldése