www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Programiranje v bascom avr
Pojdi na stran Prejšnja  1, 2, 3 ... 24, 25, 26 ... 36, 37, 38  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Bascom sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Vlado
Član
Član



Pridružen-a: Sre 03 Mar 2004 21:35
Prispevkov: 561
Aktiv.: 2.51
Kraj: Ljubljana

PrispevekObjavljeno: Pon Avg 13, 2012 6:52 pm    Naslov sporočila:   Odgovori s citatom

Denis,
obstaja še bolj enostavna rešitev,
v Helpu poglej ukaz OVERLAY.
LP
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tezo
Član
Član



Pridružen-a: Sob 19 Sep 2009 10:44
Prispevkov: 40
Aktiv.: 0.22
Kraj: Zgornji brnik

PrispevekObjavljeno: Sob Okt 13, 2012 10:05 am    Naslov sporočila:  I2c slave Odgovori s citatom

Lep pozdrav!

Izdelujem QuadCopter z Atmega8, pa se je zataknilo pri hitrosti, Namreč če hočem vse narediti z enim mikrokontrolerjem, je stvar zelo počasna. Zato sem se odločil da PWM servo signal generiram z še eno Atmega8, ki bo uporabljal BASCOM slave TWI knjižnico za prejemanje podatkov preko I2C.

MASTER koda
Koda:


$lib "i2c_twi.lbx"                                          ' we do not use software emulated I2C but the TWI

Config Scl = Portc.5                                        ' we need to provide the SCL pin name
Config Sda = Portc.4                                        ' we need to provide the SDA pin name

I2cinit                                                     ' we need to set the pins in the proper state

Config Twi = 100000                                         'clock speed


Do

 Pulsein Motor1 , Pinb , 1 , 1                              ' Na portb prejema PWM vrednosti
 Pulsein Motor2 , Pinb , 2 , 1
 Pulsein Motor3 , Pinb , 3 , 1
 Pulsein Motor4 , Pinb , 4 , 1

                                                             'in jih nato pošlje po I2c

      I2cstart
 I2cwbyte &H70                                              ' Slave address
 I2cwbyte Motor1
 I2cwbyte Motor2
 I2cwbyte Motor3
 I2cwbyte Motor4
 I2cstop

Loop




SLAVE koda

Koda:



   Config Sda = Portc.4
 Config Scl = Portc.5


Config Twislave = &H70 , Btr = 1 , Bitrate = 100000           'Slave Address, clock speed

Const Timer2reload = 156                                    'Timer, ki vsakih 20ms Generira pulz za PWM servo signal
Config Timer2 = Timer , Prescale = 1024
Load Timer2 , Timer2reload
On Ovf2 Timer2_isr
Enable Ovf2
Start Timer2
Enable Interrupts



Do

Loop



   Timer2_isr:                                              'Generira PWM servo signal
   Load Timer2 , Timer2reload

   Portb.1 = 1
   For I = 0 To Motor1

   Waitus 10

   Next
   Portb.1 = 0
''''''''''''''''''''''''''''''''''''''''

      Portb.2 = 1
   For I = 0 To Motor2

   Waitus 10

   Next
   Portb.2 = 0
''''''''''''''''''''''''''''''''''''''''

      Portb.3 = 1
   For I = 0 To Motor3

   Waitus 10

   Next
   Portb.3 = 0

''''''''''''''''''''''''''''''''''''''''
      Portb.4 = 1
   For I = 0 To Motor4

   Waitus 10

   Next
   Portb.4 = 0

 Return






''''''''''''''''''''''''''''''''''''''''''''
Twi_stop_rstart_received:

Return
''''''''''''''''''''''''''''''''''''''''''''''

Twi_addressed_goread:

Return
''''''''''''''''''''''''''''''''''''''''''

Twi_addressed_gowrite:

Return
''''''''''''''''''''''''''''''''''''''''''




Twi_gotdata:



  Select Case Twi_btw
  Case 1 : Motor1 = Twi - 40                                ' Spremenljivke napolni z vrednosti, ki jih prejme po i2c
  Case 2 : Motor2 = Twi - 40
  Case 3 : Motor3 = Twi - 40
  Case 4 : Motor4 = Twi - 40

  End Select


  Print Motor1                                              'In jih pošlje po uart
  Print Motor2
  Print Motor3
  Print Motor4

Return
''''''''''''''''''''''''''''''''''''''''


Twi_master_needs_byte:

Return
''''''''''''''''''''''''''''''''''''''''

Twi_master_need_nomore_byte:

Return


Problem pa je da zato da preko i2c prenese 4byte za motorje porabi "na uč" 50ms.
Je to normalno? Ali ni i2c hitrost nekaj Mbytov/s ?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tezo
Član
Član



Pridružen-a: Sob 19 Sep 2009 10:44
Prispevkov: 40
Aktiv.: 0.22
Kraj: Zgornji brnik

PrispevekObjavljeno: Sob Okt 13, 2012 9:44 pm    Naslov sporočila:   Odgovori s citatom

Sem ugotovil , da je master ustavljen dokler program v SLAVEu ne doseže ukaza return, tako da sem izbrisal vrstice print in je sedaj vse veliko hitreje. Very Happy Bom verjetno še branje iz sprejemnika prestavil na slave čip, da se glavni nebo matral z branjem PWMja.

LP
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
zok
Član
Član



Pridružen-a: Pet 02 Jan 2009 23:59
Prispevkov: 1115
Aktiv.: 5.98
Kraj: Ponikva

PrispevekObjavljeno: Pon Okt 15, 2012 10:00 am    Naslov sporočila:   Odgovori s citatom

za PWM poskusi raje tole:

Koda:
$regfile = "m8def.dat"
$prog &HFF , &HE1 , &HD9 , &H00

Config Servos = 2 , Servo1 = Portc.1 , Servo2 = Portc.2 , Reload = 10 'konfiguriras servota
Config Portc.1 = Output
Config Portc.2 = Output
Enable Interrupts
Servo(1) = 10                                               '10 times 10 = 100 uS on
Servo(2) = 10                                         

dim podatek1 as word                  'za primer sem dolocil dve spremenljivki
dim podatek2 as word
podatek1 = 25                              'spremenljivkama sem dolocil dve vrednosti (samo za primer, da ve kam postaviti servota ob inicializaciji)
podatek2= 135

do           'malo bomo ponavljali

'tu vmes pride vsa logika - skaliranje, mix komand, itd
'za prvi preizkus pa sem zaenkrat napisal samo naslednji sestavek:

incr podatek1 'premakni servo za en delcek
incr podatek2

if podatek1=210 then                             'ce servo pride do skrajne tocke (vsaj pri mojih servotih je 210 ena skrajna tocka)
podatek1 = 25                                      'ga postavi v drugo skrajno tocko
endif

if podatek2=210 then
podatek2 = 25
endif

Servo(1) = podatek1                       'vrednost posljes na servo, in ti ni potrebno uporabljati waitus komand - tako program tece naprej, PWM pa se izvaja v ozadju
Servo(2) = podatek2
Loop


upam da pomaga. Tako lahko uporabis samo en mikrokontroler in prihranis na kompleksnosti, na masi in ceni.

edit: ah se nekaj:



LP!
Koda:
'Servo's need a pulse in order to operate
'with the config statement CONFIG SERVOS we can specify how many servo's we
'will use and which port pins are used
'A maximum of 16 servos might be used
'The SERVO statements use one byte for an interrupt counter and the TIMER0
'This means that you can not use TIMER0 anymore
'The reload value specifies the interval of the timer in uS
Config Servos = 2 , Servo1 = Portc.1 , Servo2 = Portc.2 , Reload = 10
'we use 2 servos with 10 uS resolution(steps)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tezo
Član
Član



Pridružen-a: Sob 19 Sep 2009 10:44
Prispevkov: 40
Aktiv.: 0.22
Kraj: Zgornji brnik

PrispevekObjavljeno: Tor Okt 30, 2012 3:57 pm    Naslov sporočila:   Odgovori s citatom

Sem ugotovil, da je branje vhodov z pulsein tudi prepočasno. Mogoče kdo ve kako brati PWM vhode na hitrejši način?

MOJ POIZKUS:
Naročil sem atmego88 ki ima "pin change interrupte", In naredil program da vsakič ko se pojavi pulz, se sproži interrupt. V interruptu sprožim timer0 , in ob koncu pulza spet sproži interrupt v katerem preberem vrednost timerja in spremenim PCMSK (da bo interrupt zaznaval na naslednjem pinu). To lepo bere pwm če se spreminja le en pwm naenkrat, ostali pa imajo sredinsko vrednost. Če vrednosti večih PWM vhodov spreminjam hkrati , začnejo vplivati eden na drugega, in vse prebrane vrednosti so čudne. Že 3 dni iščem napako, ampak se vse zdi vredu.



Koda:
  On Pcint2 Isr_pcint0
  Pcmsk2.6 = 1                                      'določim na katerem pinu bo prvič PCINT
  Enable Pcint2
  Config Timer0 = Timer , Prescale = 64
  Enable Interrupts

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  Do

  Waitms 100
  Print In3
  Loop

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

  Isr_pcint0:

  If Pind.t = 1 Then                                        'preveri če je interrupt sprožen na prednjem ali zadnjem robu pulza
  Goto Naprej                                               'če je na prdnjem, potem samo resetira timer0 in se vrne
  End If
                                                             'Če je na zadnjem robu, potem gre naprej v program za branje vrednosti timerja



  Select Case T

  Case 4 : In1 = Timer0                                     'izbere pravo spremenljivko in jo napolni z vrednsostjo timerja
  Case 5 : In2 = Timer0
  Case 6 : In3 = Timer0
  Case 7 : In4 = Timer0

  End Select




   T = T + 1                                                'spremenljivko t vsakič poveča za 1
   If T > 7 Then
   T = 4
   End If

   Pcmsk2 = 0                                               'spremenljivka t določi na katerem pinu bomo čakali pulz
   Pcmsk2.t = 1


   Naprej:                                                  'resetiranje timerja
   Timer0 = 0

  Return


Če nebo šlo drugače bi lahko na pwm vhode dal rc filter, in bral vrednosti z ADC, samo nevem kakšna bi bila natančnost.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
linel
Član
Član



Pridružen-a: Čet 06 Mar 2008 21:14
Prispevkov: 178
Aktiv.: 0.91
Kraj: prekmurje

PrispevekObjavljeno: Sre Feb 27, 2013 9:56 pm    Naslov sporočila:  Programiranje v bascom avr Odgovori s citatom

Pozdravljeni!

Rad bi povezal mikrokontrolerja med sabo, in sicer tako da bi na uc1 (oddajni) pritisnil tipko 1 za vklop oz. 2 za izklop led diode. led dioda bi pa bila na uc2 (sprejemni).

Komunikacija z terminalom deluje, ko pritisnem tipko 1 pošlje na terminal znak A ko pa tipko 2 pa znak B.

Tudi ko iz terminala pošiljam znak A se vključi led dioda, če pa kaj ostalega se pa izključi.

Tx povežem z RX. prilagam programa. zanima me pa kaj je narobe.

Koda:

oddajni mikrokontroler

$regfile = "m8def.dat"


$baud = 4800

$hwstack = 32
$swstack = 8
$framesize = 24

Config Portb.0 = Input
Config Portb.1 = Input
Config Portb.2 = Output

Dim A As String * 1
Dim B As String * 1
A = Chr(65)
B = Chr(66)
Do
If Pinb.0 = 1 Then
Waitms 150
Print A
Set Portb.2
End If
If Pinb.1 = 1 Then
Waitms 150
Print B
Reset Portb.2
End If


Loop




Koda:

sprejemni mikrokontroler

$regfile = "m8def.dat"

$baud = 4800

$hwstack = 32
$swstack = 8
$framesize = 24

Config Portd = Output

Dim A As String * 1

Do


    A = Waitkey()

   If A = "{065}" Then
      Set Portd.7
      Else
      Reset Portd.7
   End If

Loop

Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
protoncek
Član
Član



Pridružen-a: Sre 31 Jan 2007 9:41
Prispevkov: 9573
Aktiv.: 45.60
Kraj: Mengeš

PrispevekObjavljeno: Sre Feb 27, 2013 10:20 pm    Naslov sporočila:   Odgovori s citatom

IF stavek v sprejemnem delu. Ti imaš narejeno če je sprejem 65 potem vklopi portd.7, sicer ga izklopi. Torej karkoli drugega dobi RAZEN 65 ga izklopi. Imeti moraš na način:

If A = "{065}" Then Set Portd.7
If A = "{066}" Then Reset Portd.7

loop

Tako bo 65 vklopil, 66 izklopil, ostalo pa ignorira.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
linel
Član
Član



Pridružen-a: Čet 06 Mar 2008 21:14
Prispevkov: 178
Aktiv.: 0.91
Kraj: prekmurje

PrispevekObjavljeno: Sre Feb 27, 2013 10:37 pm    Naslov sporočila:  Programiranje v bascom avr Odgovori s citatom

saj to glih hočem, zato sem dal vse kar nebo 65 izklopi led. ( tipka dva je 66 (ker ni 65 izkopi led)), mislim da je drugje nekaj narobe
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
protoncek
Član
Član



Pridružen-a: Sre 31 Jan 2007 9:41
Prispevkov: 9573
Aktiv.: 45.60
Kraj: Mengeš

PrispevekObjavljeno: Sre Feb 27, 2013 11:28 pm    Naslov sporočila:   Odgovori s citatom

hm...potem pa ne razumem, kaj je narobe, oziroma, kaj dela, kar ne bi smelo?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Cule
Član
Član



Pridružen-a: Sob 28 Maj 2011 14:50
Prispevkov: 114
Aktiv.: 0.72
Kraj: Šentjur

PrispevekObjavljeno: Pon Mar 04, 2013 10:29 pm    Naslov sporočila:   Odgovori s citatom

Imam težavo v Bascomu.
Koda:

.....
Dim Os_x As Dword
Dim Kot_x As Dword
Dim Ux_skal As Dword
Dim Adc_x As Dword
Dim Ux As Dword

Dim X_vred As Single
Dim X As Single   
.....
Adc_x = Getadc(4)
Adc_y = Getadc(3)
Adc_z = Getadc(2)
.....
Ux_skal = Adc_x * 1000
Ux = Ux_skal / 1023
Ux = Ux * 500

Kot_x = Ux - 165000
X_vred = Kot_x / 80000

X_vred = Kot_x : X = Asin(x_vred)
X = Deg2rad(x)



To je le del programa, program deluje, težava pa je v vrstici: " X_vred = Kot_x / 80000" , saj nevem kako naj definiram spremenljivko X_vred.

Spremenljivka Ux ima lahko vrednost med 165000 pa 245000, torej bo X_vred med 0 in 1.
Iz teh vrednosti bom izračunal asin (v radijanih) in jih spremenil v stopinje in s tem dobil kot med 0 in 90°
Torej kako naj spremenim program, da bo delovalo pribljižno tako kot je napisano zgoraj.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
davyd1994
Član
Član



Pridružen-a: Sob 17 Okt 2009 21:26
Prispevkov: 53
Aktiv.: 0.30
Kraj: Šentjur pri Celju-Ponikva

PrispevekObjavljeno: Sob Mar 09, 2013 5:58 pm    Naslov sporočila:   Odgovori s citatom

Imam eno tažavo. Na mikrokrmilnik bi moral naložiti iz Bascoma program ki je za demo prevelik. Dobil sem neko starejšo krekano različico, ampak ta različica mi pa noče naložiti oz. neka napaka pri povezavi. Čip je ATmega32, nalagam preko ISP, s programatorjem pololu AVR ISP.
_________________
Ko misliš da ne zmoreš več pa mal pospeši.Smile

Lp. David
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mucek
Član
Član



Pridružen-a: Tor 01 Avg 2006 10:47
Prispevkov: 5337
Aktiv.: 24.70
Kraj: Domzale

PrispevekObjavljeno: Sob Mar 09, 2013 6:11 pm    Naslov sporočila:   Odgovori s citatom

a) Kupiš licenco za program (ki je, mimogrede, res presneto poceni glede na lifetime support)
b) Pošlješ komu, ki licenco ima, pa ti skompajla. To narediš, če res programiraš 1x na leto.

LP, g

(p.s. Za B opcijo lahko pošlješ tudi meni Smile

_________________
...lahko pa se tudi motim ...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
program_er
Član
Član



Pridružen-a: Sob 08 Mar 2008 13:47
Prispevkov: 2173
Aktiv.: 11.06
Kraj: Maribor (Pohorje)

PrispevekObjavljeno: Sob Mar 09, 2013 11:17 pm    Naslov sporočila:   Odgovori s citatom

davyd1994 je napisal/a:
Imam eno tažavo. Na mikrokrmilnik bi moral naložiti iz Bascoma program ki je za demo prevelik. Dobil sem neko starejšo krekano različico, ampak ta različica mi pa noče naložiti oz. neka napaka pri povezavi. Čip je ATmega32, nalagam preko ISP, s programatorjem pololu AVR ISP.


Pošlji mi .bas kodo (v .zip pod ZS) in ti jo brez problema scompilam z najnovejšo verzijo Bascoma (imam kupljeno licenco) ter pošljem nazaj.

Pa tudi če boš rabil kdaj kaj za urediti, ni problem ta minuta dela. Če pa hočeš dejansko programirati, pa je res najbolje kupiti licenco.

EDIT: Pravkar videl, da se je že mucek ponudil za compilat.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo MSN Messenger - naslov
program_er
Član
Član



Pridružen-a: Sob 08 Mar 2008 13:47
Prispevkov: 2173
Aktiv.: 11.06
Kraj: Maribor (Pohorje)

PrispevekObjavljeno: Sob Mar 09, 2013 11:24 pm    Naslov sporočila:   Odgovori s citatom

Cule je napisal/a:

...
To je le del programa, program deluje, težava pa je v vrstici: " X_vred = Kot_x / 80000" , saj nevem kako naj definiram spremenljivko X_vred.

Spremenljivka Ux ima lahko vrednost med 165000 pa 245000, torej bo X_vred med 0 in 1.
Iz teh vrednosti bom izračunal asin (v radijanih) in jih spremenil v stopinje in s tem dobil kot med 0 in 90°
Torej kako naj spremenim program, da bo delovalo pribljižno tako kot je napisano zgoraj.


Kaj točno pa ne dela? Ti javi error (kakšen), ti narobe računa?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo MSN Messenger - naslov
Cule
Član
Član



Pridružen-a: Sob 28 Maj 2011 14:50
Prispevkov: 114
Aktiv.: 0.72
Kraj: Šentjur

PrispevekObjavljeno: Ned Mar 10, 2013 9:19 am    Naslov sporočila:   Odgovori s citatom

program_er je napisal/a:

Kaj točno pa ne dela? Ti javi error (kakšen), ti narobe računa?

Je že v redu. Sem popravil. Narobe sem definiral spremenljivke pa mi je javljalo napako.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Bascom sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3 ... 24, 25, 26 ... 36, 37, 38  Naslednja
Stran 25 od 38

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 79 dni


Powered by phpBB © 2001, 2005 phpBB Group