Jelgenerátor AVR-el

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
kala1982
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2011. január 4. kedd, 7:00

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

SID-hez kellene majd az órajel, adatlap szerint 1 MHz, de ettől eltérhetek, viszont a hangok nem lesznek a helyén.. :)

A lényeg az lenne hogy egy kis időm azért legyen konfigolni a hangokat meg átküldeni a hang frekvenciának az adatait, azért gondoltam hogy jó lenne ha magasabban járna az AVR.(Atmega 8,3 szólamú dallamcsengő projekt).

Majd olvasok utána még többet is, csak nincs most sok időm, végül is ez sem annyira sürgős, csak na, valaki nem tud aludni dolgok miatt ... :)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Az AVR fusson 1 MHz-n. Akkor mindenféle időd van másra is. Szóval ClkOut :)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Ha mégis jobb lenne neked a 8MHz.
Próbáld ki ezt a beállítást:
(Megjegyzem: Nem teszteltem! Csak elméletileg működnie kellene! Szóval próba és jelzed mi az eredmény!)

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


' TesztCTC1.bas
'Chip___________________________________________________________________________
 $crystal = 8000000
 $regfile = "M8def.dat"

 $swstack = 32
 $hwstack = 32
 $framesize = 32

Dim Crystal_divide As Word
Dim Crystal_divide_l As Byte At Crystal_divide Overlay
Dim Crystal_divide_h As Byte At Crystal_divide + 1 Overlay
Crystal_divide = 4                   'Frekvenciaosztó értéke  1MHz-hez

 'Config Timer1 CTC (Orajel Frekvencia osztó)
 Configtimer1_ctc:
   Config Pinb.1 = Output           ' PB1 (OC1A)   Ez a PIN lesz a kimenő jel
   Tccr1a = 0                     'RESET Timer/Counter 1 Control Register A
   Tccr1a.com1a0 = 1               ' Toggle OC1A/OC1B Output on Compare Match
   Tccr1a.foc1a = 1       'Bit 3 - FOC1A: Force Output Compare for channel A

   Tccr1b = 0                  'RESET Timer/Counter 1 Control Register B
   Tccr1b.cs10 = 1                                 '1 (No prescaling)
   Tccr1b.ctc1 = 1                                 'CTC TOP OCR1A

   'Output Compare Register 1 A -                          
 'Az Érték Amikor Törlődik A Timer1 (TCNT1)
   Ocr1ah = Crystal_divide_h
   Ocr1al = Crystal_divide_l
'Return
Start Timer1

Do


Loop

End                                                         'end program

A hozzászólást 4 alkalommal szerkesztették, utoljára kapu48 2012. május 30. szerda, 11:28-kor.
Avatar
kala1982
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2011. január 4. kedd, 7:00

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

Köszi, mindenféleképpen kipróbálom ezt a megoldást is, remélem egy héten belül tudok időt szakítani rá. Amúgy lehet az egész majd 1Mhz-ről fog menni, C64-nél is annyi volt az órajel :) Köszönöm a segítséget , kipróbálom a megoldásokat, tesztelek és jelzem.
Avatar
kala1982
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2011. január 4. kedd, 7:00

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

Még most van időm azóta foglalkozni a témával, annyit szeretnék kérdezni, hogy amikor az órajel magas, akkor lehet csak írni, honnan tudom hogy mikor magas? Elég ha figyeljem a pinb.1-et? Egyenlőre így szimulátorban nem működik. Eddigi kód:


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

$crystal = 8000000
$regfile = "M8def.dat"
$swstack = 32
$hwstack = 32
$framesize = 32

Dim I As Byte
Dim Crystal_divide As Word
Dim Crystal_divide_l As Byte At Crystal_divide Overlay
Dim Crystal_divide_h As Byte At Crystal_divide + 1 Overlay
Declare Sub Write_sid(byval Cimb As Byte , Byval Adatb As Byte) As Byte
Crystal_divide = 4

Sid_cim Alias Portc
Sid_adat Alias Portd
Rw Alias Pinb.2
Cs Alias Pinb.3
Ora Alias Pinb.1

Config Sid_cim = Output
Config Sid_adat = Output
Config Rw = Output
Config Cs = Output
Config Timer1 = Timer , Prescale = 1


On Timer1 Timer1_ctc
Enable Timer1
Enable Interrupts
Start Timer1
Rw = 1
Cs = 1

Do
     For I = 0 To 24
     Call Write_sid(i , 0)
     Next I
     Wait 5
Loop

Timer1_ctc:
   Tccr1a = 0
   Tccr1a.com1a0 = 1
   Tccr1a.foc1a = 1
   Tccr1b = 0
   Tccr1b.cs10 = 1
   Tccr1b.ctc1 = 1
   Ocr1ah = Crystal_divide_h
   Ocr1al = Crystal_divide_l
Return

Sub Write_sid(byval Cimb As Byte , Byval Adatb As Byte)
Local Ok As Byte
   Ok = 0
   Do
      If Ora = 1 Then
          Rw = 0
          Sid_cim = Cimb
          Cs = 0
          Sid_adat = Adatb
          Ok = 1
      End If

   Loop Until Ok = 1
   Cs = 1
   Rw = 1

End Sub

End
egyáltalán jó helyre illesztettem a kódodat? :)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Ajaj... Nem értem a kérdést:(....
Mit szeretnél írni?


"TE ülsz az áramkör előtt, TE látod mi zajlik, mi van ott. Mi csak a leírásodat látjuk....
Szóval inkább legyen terjengős, mint nem követhető. "
:)
Avatar
kala1982
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2011. január 4. kedd, 7:00

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

Sid-nek akarok küldeni adatokat, adatlapban benne van, hogy akkor érti meg ha az órajel magas állapotban van. Kapu48 írt egy kódrészletet, ami 8mhz-en járó atmega 8-al oc1a-n 1 megahertzes jelet állít elő. (1 megahertz azért kell, mert a sid akkor tudja a helyén megszólaltatni a hangokat.)

Sajnos nincs előttem a kapcsolás egyenlőre, majd csak este tudom letesztelni a kódot. Csak azt szerettem volna kérdezni, hogy hol figyeljem azt, hogy magas-e az 1 mhz-es jel, és akkor küldhetem az adatokat... Jelen esetben 25 címre, 25 db 0-át.. (ezzel lenne alaphelyzetben a Sid).


Robert írta:Ajaj... Nem értem a kérdést:(....
Mit szeretnél írni?


"TE ülsz az áramkör előtt, TE látod mi zajlik, mi van ott. Mi csak a leírásodat látjuk....
Szóval inkább legyen terjengős, mint nem követhető. "
:)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

_felejtsd el_
Azt, hogy mikor magas vagy sem az órajel, azt így beszinkronizálni esélytelen.
nem az van, hoyg az adatvonalon már beállt a jkel és _utána_ menjen az órajel, hogy mostmár olvashatod?

1 MHz esetén már lassan ilyen áramkörnél, - hogy _egyszerre_ küldöd az adatot és az érvényességjelet - a kábelkapacitás, a jelhossz, jelterjedéssel is számolnod kell....

Nem olvasol valamit félre?
Avatar
kala1982
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2011. január 4. kedd, 7:00

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

Nem csináltam még ilyet, és ráadásul nem is régóta foglalkozom avr-rel. Ezt szeretném írni, olvasni nem kell:

http://www.waitingforfriday.com/index.p ... _Datasheet
nano sec-re hogy várjak programból? :D

Robert írta:_felejtsd el_
Azt, hogy mikor magas vagy sem az órajel, azt így beszinkronizálni esélytelen.
nem az van, hoyg az adatvonalon már beállt a jkel és _utána_ menjen az órajel, hogy mostmár olvashatod?

1 MHz esetén már lassan ilyen áramkörnél, - hogy _egyszerre_ küldöd az adatot és az érvényességjelet - a kábelkapacitás, a jelhossz, jelterjedéssel is számolnod kell....

Nem olvasol valamit félre?
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

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

Ha jól rémlik, akkor Motoroláéknál a Fi2 a mem/periféria váltó. 1-ben perifériákkal foglalkozik a proc, 0-nál RAmmal, ezért nincs ütközés pld. CRT vezérlő RAM hozzáférésnél. Sajnos ez a SID a Fi2-ből csinálja akkor a zenebonát is, tehát nem lehet elhúzni. Akkor nem marad más, mint a célhardver. Egy tárolóba az AVR beteszi amit akar és amikor a Fi2 magasra vált, akkor a tároló kimenetén megjelenik, aminek kell. Egy duplán élvezérelt tárolótömböt kell csinálnod (már mert az AVR-nek is illik tudni, hogy kiment az adat a SID felé).
Nem egyszerű aszinkron hálózat.
Másutt ezt úgy oldották meg (Z80), hogy clock-stretch áramkört tettek be, ami azt csinálta, hogy ha a proc hozzá akart férni a Motorola perifériához és az nem volt aktív kedvében, akkor nemes egyszerűséggel a proc órajelét megfogták az aktuális szinten. Ha jött az idő, akkor elengedték. Így a proc nem is tudott róla, hogy át van verve és a címzésnél igazából várakozott. Ha nem akarsz időzíteni az AVR-el, tehát belefér az instabil órajel-drift, akkor ez a megoldás használható, ez pár kapu meg tároló.
JAni
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Próbáldmeg ezt:

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


Sub Write_sid(byval Cimb As Byte , Byval Adatb As Byte)
'Előkészitjük az adatokat mert nagyon rövid az idő a SW szinkronizálásra
' Mivel ezt HW-vel szokták megoldani
  Sid_cim = Cimb

  Sid_adat = Adatb

$asm

  Push r24
Stopb1:
  IN r24,portb                                              'Beolvassa PortB-t

  Andi r24,&B00000010              ; isolate Portb.1 bit 1?
  rjmp Stopb1                      ;Várunk B.1 = 1 szintre
  CBI Pinb,3                                                ' Az CBI az 2 orajel
  CBI Pinb,2
  Nop                                                       'Nem tudom 1 - 3 Nop várakozás kel amig SID elveszi az adatot

  SBI Pinb,2                                                ' Az SBI az 2 orajel
  SBI Pinb,3
  Pop r24
$end Asm
End Sub

A lehető Legrövidebbre vettem a rutinodat!
Számolom az Órajeleket/utasítás!
Nem hiszem, hogy sikerül?

8)
Esetle még rövidebb az irás idözitése:

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


Sub Write_sid(byval Cimb As Byte , Byval Adatb As Byte)
'Előkészitjük az adatokat mert nagyon rövid az idő a SW szinkronizálásra
' Mivel ezt HW-vel szokták megoldani
  Sid_cim = Cimb

  Sid_adat = Adatb

$asm

  Push r24

  CBI Pinb,3                       ;WR = 0 Az CBI az 2 orajel
Stopb1:
  IN r24,portb                     ;Beolvassa PortB-t
  Andi r24,&B00000010              ; isolate Portb.1 bit = 1?
  rjmp Stopb1                      ;Várunk B.1 = 1 szintre
' Itt már biztosan a H szint elejét kapjuk el!
Stopb2:
  CBI Pinb,3                       ;WR = 0 Az CBI az 2 orajel
  Andi r24,&B00000010              ; isolate Portb.1 bit = 1?
  rjmp Stopb2                      ;Várunk B.1 = 1 szintre

  CBI Pinb,2                       ;CE = 0
  Nop                                                       'Nem tudom 1 - 3 Nop várakozás kel amig SID elveszi az adatot

  SBI Pinb,2                                                ' Az SBI az 2 orajel
  SBI Pinb,3
  Pop r24
$end Asm
End Sub
:?: :?
(Jó sokáig agyaltam rajta! Szóval megérdemelnék valami vissza jelzést. Az eredményről!)
8)
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. június 28. csütörtök, 7:39-kor.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Gyorsabb kavics kellene! Mondjuk 16MHz.
Úgy 2* annyi órajelünk lenne a beavatkozáshoz!

:idea:

„tehát belefér az instabil órajel-drift” Ez sajnos itt nem mükszik mert akkor a CTC számláló is meg áll!
És tulajdon képen ahhoz akarjuk időzíteni az Periféria írást
:cry:
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. június 28. csütörtök, 7:43-kor.
Avatar
kala1982
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2011. január 4. kedd, 7:00

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

kapu48 írta:Gyorsabb kavics kellene! Mondjuk 16MHz.
Úgy 2* annyi órajelünk lenne a beavatkozáshoz!

:idea:
Semmi akadálya a 16-os kvarcnak, az előosztást nem kell változtatni?
Tegnap gépet kellett szervízelnem, este tudom kipróbálni majd, holnap délelőtt lesz visszajelzés mindenképpen.

Most költöztem, új helyen nincs még net... :S
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

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

Szia!
Az ANDI vagy az RJMP komparál is?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Igen a : Crystal_divide = 8
8)

Huu! Várjunk !
Az RJMP Mindig ugrik!
Ide Feltételes ugrás kel!

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


ANDI   =    Össze hasonlit és be állitja a Z jelzőt
 Rd, K
 Logical AND with Immediate
 Rd = Rd · K
 Z,N,V
 1

 BREQ =     Ha Z = 1 Ugrik
 K
 Branch if Equal
 if (Z = 1) then PC = PC + k + 1
 None
 1 / 2

BRNE  =       Ha Z = 0 ugrik
 K
 Branch if Not Equal
 if (Z = 0) then PC = PC + k + 1
 None
 1 / 2

Szóval Rjmp Helyett Inkább Talán Brne Stopb , 1
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. június 28. csütörtök, 7:58-kor.
Válasz küldése