Fórum témák

» Több friss téma
Fórum » Bascom-AVR
 
Témaindító: puli122, idő: Ápr 11, 2010
Lapozás: OK   2 / 18
(#) tej válasza gabi20 hozzászólására (») Ápr 17, 2010 /
 
Portc helyett a Pinc-t olvasd.
(#) puli122 válasza gabi20 hozzászólására (») Ápr 17, 2010 /
 
Igazábol nem is értem hogy mit akarsz így megoldani. Beállítod a portC-t 255-re,és hogy azt írja ki az lcd ? Ha meg input, akkor valahogyan vezérelni kéne, hogy láss valami változást. Szóval ezt így nem tudom hogy akarod.
Ha van egy potid szerin próbálgasd az ad átalakítót, annak az értékét kiteszed az lcd-re és akkor látod ahogy változik.
(#) gabi20 válasza puli122 hozzászólására (») Ápr 17, 2010 /
 
Amikor a PORTC re kiküldtem 255 - öt azalatt azt értettem hogy bekapcsolom a felhúzóellenállásokat.
Egyébként tényleg a PINC kellett olvasni így már működött.
Kösz nektek!
(#) kemenygolya hozzászólása Ápr 25, 2010 /
 
Sziasztok!
egy projekt kapcsán úgy gondoltam, hogy belevágok a digitális elektronikába.
Ezen belül is az AVR mellett döntöttem.
Átrágtam már magam az avr.tavir.hu weboldalon hogy mit is kell tudni az AVR-ekről, hogyan is működik stb.
Viszont basic nyelvről nem nagyon találtam magyar könyvet. Ebben szeretném a segítségeteket kérni.
Bár igaz hogy találtam egy könyvet, QBASIC címmel (írta Csík Tibor) de véleményem szerint ez inkább pc-hez érdemesebb használni mint AVR-hez
köszi előre is a segítségeteket
(#) puli122 válasza kemenygolya hozzászólására (») Ápr 25, 2010 /
 
Igen azzal a könyvel én is találkoztam, de én sem tudtam hasznosítani ebben a témában. Sajnos nincs túl sok könyv az avr-ekről és a qbasic-ről sem, de szerintem ha a taviros bascom könyvet elolvasod, már nagyjából mindent tudsz ami akár komolyabb projektekhez kell.
Szerintem a legjobban akkor tudod megtanulni a mikrovezérlő kezelést, ha elkezdesz valamit megvalósítani PL: ledvillogo, gomb beolvasásá, lcd kezelés, hang kezelés, A/D átalakító használta, pwm használata. Ha ezeket kipróbálod és megy, akkor már majdnem mindent meg tudsz valósítani. Szerintem...
Több helyen, itt az oldalon is, találsz mintaprogramokat, de ha nem, és valami konkrét témában kell, írj és megpróbálok segíteni.

Üdv: Peti
(#) kemenygolya válasza puli122 hozzászólására (») Ápr 25, 2010 /
 
Rendben
köszönöm a segítségedet
végigolvastam amit a weboldalon írtak, bár tesztelgetés közben LCD-re való szöveg kiírásakor, mégis előjöttek hibák.
Pl. Az első sort ha beállítom, igazítom a szöveget, megcsinálom a másodikat is, és ott a pozíció után mindent szétcsúsztat (még az első sort is)
(#) puli122 hozzászólása Ápr 25, 2010 /
 
Fölteszek pár mintaprogramot.

Itt az első:

Led villogtató program B portra, do-loop végtelen ciklussal, mega8 hoz.

  1. '--- alapadatok ---
  2. $regfile = "m8def.dat"
  3.  $crystal = 8000000
  4.  
  5.  Config Portb = Output                                     ' B port kimenetnek konfigurálva
  6.  
  7.  
  8.   Do                                                        'végtelen ciklus kezdete
  9.  
  10.   Portb = 255                                              'B port logikai magas szinte kapcsolása
  11.    Wait 1                                                   ' 1 mp várakozás
  12.   Portb = 0                                                ' B port logikai alacsony szintre kapcsolása
  13.    Wait 1
  14.  
  15.   Loop
(#) puli122 hozzászólása Ápr 25, 2010 /
 
LCD kezelés:

mega8 szintén, 2*24-es lcd ( bár most csak az 1. sor használva ):

  1. '--- alapadatok ---
  2. $regfile = "m8def.dat"
  3.  $crystal = 8000000
  4.  
  5.  
  6. Config Lcd = 24 * 2
  7. Config Lcdpin = Pin , Db4 = Portb.0 , Rs = Portb.1 , Db6 = Portb.5 , E = Portb.2 , Db5 = Portb.3 , Db7 = Portb.4.
  8. Config Lcdmode = Port
  9.  
  10. Config Portb = Output
  11.  
  12. Do
  13.  
  14. Cls
  15. Lcd "HELLO WORLD"
  16. Wait 3
  17. Cls
  18. Lcd " Elso lcd-s programom "
  19. Wait 3
  20.  
  21. Loop
(#) puli122 hozzászólása Ápr 26, 2010 /
 
Gomb kezelés: ( nem megszakítással )
(pinD.4 -re van a gomb kötve), ha nyomod a gombot akkor pinB.0 =1 ha nem akkor pinB.0 =0


  1. '--- alapadatok ---
  2. $regfile = "m8def.dat"
  3.  $crystal = 8000000
  4.  
  5. Config Pind.4 = Input
  6.  
  7. Config Portb = Output
  8.  
  9. Do
  10.  
  11. If Pind.4 = 0 Then
  12.  
  13. Pinb.0 = 1
  14.  
  15. Else
  16.  
  17. Pinb.0 = 0
  18.  
  19. End If
  20.  
  21. Loop
(#) elektromos válasza puli122 hozzászólására (») Ápr 26, 2010 /
 
Ha tudsz, akkor tehetnél fel sok-sok minta példát a megszakításokra, mert egyszerűen nem értem a megszakítások használatát. Ha lehetséges sok-sok kis megjegyzéssel. A minta példákkal talán jobban meg tudnám érteni. Szerintem sok kezdőt is érdekelné ez a téma. Előre is, köszi.
(#) kemenygolya válasza elektromos hozzászólására (») Ápr 26, 2010 /
 
hali
hogy sértsd a megszakítást puli122 nekem is a következőt javasolta:
építsd meg a próbapanelt és azon gyakorolj/kísérletezz
(#) puli122 hozzászólása Ápr 26, 2010 /
 
Akkor rövid infó a megszakításokról, csak konyhanyelven, példaprogram később.

Szóval. Tegyük fel hogy egy gomb megnyomását akarod figyelni az avr-eddel ( vagy pic ). Ezt egyszerűen úgy lehet megtenni ahogyan az előző példában van, tehát:
  1. if portx.y = 0 ( vagy 1 ) then
akkor végrehajtja az utána következő részeket ( és amikor ez nem teljesül akkor az Else utasításhoz ugrik )

De ezzel van egy-két probléma. Például ha valami időigényes feladatot végez a vezérlő, ( éppen kiíratsz valamit lcd-re vagy zenél vagy akármi ) akkor abban a pillanatban mikor megnyomod a gombot, nem fog történni semmi, mert egyszerűen máshol jár a program, nem figyeli az if-es feltételedet, csak mikor odaér, de addigra már elengedted, vagy épp újra megnyomtad.

Ezt küszöböli ki a megszakítás. Minden vezérlőnek van un. megszakítás lába (pl: INT0), ha erre kötsz egy gombot, és ezt használod a programban is, akkor mikor megnyomod, a vezérlő abbahagyja az éppen végzett feladatot, "kiugrik" egy általad előre megadott helyre, ott végrehajtja az ott lévő utasítást, majd visszatér a főprogramba, és ott folytatja ahol abbahagyja.

Természetesen a kiugrás célszerűen olyan rövid idő, hogy nem veszed észre, a fő program futása közben, de ez biztosítja, hogy pontosan érzékeld a gombot.

Megszakítást még egy csomó dolog okozhat, pl timer ( bizonyos időnként megszakítás és ott valami feladat, jellemzően időmérés ), vagy külső impulzusok sorozata, pl frekvencia mérés, és hasonlók.
(#) elektromos válasza kemenygolya hozzászólására (») Ápr 27, 2010 /
 
építettem már próbapanelt atmega8-hoz, de a megszakítás használata nem tiszta sajna
(#) elektromos válasza puli122 hozzászólására (») Ápr 27, 2010 /
 
Ez tiszta, és érthető leírás! Várom a folytatást.
(#) puli122 hozzászólása Ápr 28, 2010 /
 
Egyszerű megszakításos gombkezelő program:

Int0 lábra kell a gombot kötni. A C portra bárhova pedig egy led-et ( előtét ellenállással persze ). A program a c portot kapcsolgatja föl-le. Amikor elindítjuk a led világítani fog, mert a le-föl kapcsolgatás idejét a megnyomások száma adja, az pedig kezdetben nulla. Ha egyszer megnyomjuk a gombot, hozzáad 100-at, ez pedig 100ms-ot jelent, így a led villogni fog. Ha megint megnyomjuk még 100-at hozzáad, agy már 200ms lesz a várakozás a kapcsolgatások között, tehát lassabban villog.

  1. '--- alapadatok ---
  2. $regfile = "m8def.dat"
  3.  $crystal = 8000000
  4.  
  5. Config Portc = Output
  6. Config Portd = Input
  7.  
  8. Config Int0 = Falling
  9.  
  10. On Int0 Gomb
  11.  
  12. Dim Ido As Word
  13.  
  14. Enable Interrupts
  15. Enable Int0
  16.  
  17. Ido = 0
  18.  
  19. Do
  20.  
  21. Portc = 255
  22. Waitms Ido
  23. Portc = 0
  24. Waitms Ido
  25.  
  26. Loop
  27.  
  28. Gomb:
  29.  
  30. Ido = Ido + 100
  31.  
  32. Return
  33.  
  34. End
(#) elektromos válasza puli122 hozzászólására (») Ápr 29, 2010 /
 
Eddig úgy látszik értem, és írtam az Int0, és Int1 használatára egy kis kiegészítést. Mint látszik, Int0 csökkenti a villogások számát, még az Int1 növeli a sebességet. Ha ez így jó, akkor a többi megszakításra is szeretnék kapni egy kis minta programot, mert így apránként könnyebb tanulni. Arra gondoltam, hogy van a Timer megszakítás, és azt szeretném most megérteni.
'--- alapadatok ---
$regfile = "m8def.dat"
$crystal = 8000000

Config Portc.3 = Output
Config Portd.2 = Input
Config Portd.3 = Input

Config Int0 = Falling
Config Int1 = Falling

On Int0 Gomb
On Int1 Gomb1

Dim Ido As Word
Dim Ido1 As Word

Enable Interrupts
Enable Int0
Enable Int1
Ido = 0
Do
Portc.3 = 1
Waitms Ido
Portc.3 = 0
Waitms Ido
Loop

Gomb:
Ido = Ido + 100
Return

Gomb1:
Ido = Ido - 100
Return

End
(#) puli122 válasza elektromos hozzászólására (») Ápr 30, 2010 /
 
Ez jónak tűnik így ránézésre ( máskor azért használd a "Kód" gombot )

Írok majd még minta programot, a többi megszakításra is.
(#) elektromos válasza puli122 hozzászólására (») Máj 1, 2010 /
 
Eszembe jutott egy megszakítási ötlet. Van ez a két nyomógomb, és egy led. Azt hogyan kell megszakításokkal megoldani, hogy ha benyomom mind a két nyomógombot, akkor világít csak a led, és erre van, mondjuk 2mp idő. Ha ezt tovább bonyolítjuk, akkor ne lehessen azt kijátszani, hogy az egyiket folyamatosan nyomom és elég csak a másikat nyomkodni, hogy a led világítson. Ezt meglehet csinálni megszakításokkal, és timerekkel?
(#) puli122 válasza elektromos hozzászólására (») Máj 2, 2010 /
 
Így első ránézésre én a következő képpen csinálnám:

Mind a két gomb ugyanabba a megszakításba ugrasztja be a vezérlőt, ott lekérdezed a gombok állapotát az IF -es módszerrel, betehetsz időzítést is. Úgy írod meg hogy a feltételed csak akkor igaz, ha mind a két gomb nyomva van, a többi esetben nem. Betehetsz várakozási időt is, hogy ne kelljen pont ugyan abban az ezredmásodpercben megnyomni, mert az lehetetlen. Ha a feltételed igaz, a program átbillent egy változót ( pl: A=1 ) és a fő programban azt nézed, hogy ha A=1 akkor világít.
(#) elektromos válasza puli122 hozzászólására (») Máj 2, 2010 /
 
Hát elméletben én is ilyenre gondoltam, de nem tudom megírni.
(#) puli122 válasza elektromos hozzászólására (») Máj 2, 2010 /
 
A megszakítást már tudod, az if -es lekérdezés egyszerű, és gyakorlatilag más nem is kell hozzá. Mi nem megy ? Próbáld megírni, és ha elakadsz, írd meg hogy konkrétan mi a probléma.
(#) elektromos válasza puli122 hozzászólására (») Máj 2, 2010 /
 
Szia!
Eddig jutottam el, de azt nem tudom megcsinálni, hogy mindegyik nyomógomb csak egyszer működjön, tehát ha folyamatosan nyomom az egyiket, akkor ne induljon újra, vagyis ne lehessen, mondjuk kitámasztani az egyiket. Másképpen nem tudom elmondani. De a timert hol kell itt használni?


[code=c] '--- alapadatok ---
$regfile = "m8def.dat"
$crystal = 8000000

Config Portc.1 = Output 'gomb1-led
Config Portc.2 = Output 'gomb2-led
Config Portc.3 = Output 'ki-led
Config Portd.2 = Input 'gomb
Config Portd.3 = Input 'gomb1

Config Int0 = Falling
Config Int1 = Falling

On Int0 Gomb
On Int1 Gomb1

Dim Ido As Word
Dim Ido1 As Word

Enable Interrupts
Enable Int0
Enable Int1

Do
If Portc.1 = 1 And Portc.2 = 1 Then
Set Portc.3
Wait 2

Reset Portc.1
Reset Portc.2
Reset Portc.3

End If
Loop

Gomb:
Waitms 100
Set Portc.1
Return
Gomb1:
Waitms 100
Set Portc.2
Return
End
(#) kemenygolya válasza elektromos hozzászólására (») Máj 3, 2010 /
 
hali
sajna még nem értek hozzá, de a Do és a Loop közötti részt a program folyamatosan ismétli végtelenszer.
(#) hpmaster válasza kemenygolya hozzászólására (») Máj 3, 2010 /
 
Ha a csak Do és Loop között vannak a dolgok, akkor azt végtelenszer ismétni. Ez lehet mondjuk a főprogram.
Lehet viszont feltételes ciklust is írni.
  1. Do
  2. ...
  3. If valami tlejesül vagy nemteljesül THEN kilépés=1
  4. Loop Until kilépés=1


Ebben az esetben a ciklus addíg ismétlődik, amíg a 'kilépés' helyén álló változó (pl jelzőbit) értéke adott értékre nem változik. Ezután a program a loop until sor utáni sorokkal folytatódik.
(#) puli122 válasza kemenygolya hozzászólására (») Máj 3, 2010 /
 
Igen, ezt régebben már leírtam valahova de most nem talállom.
2 féle ciklus van alapvetően. Az elsö:
  1. do
  2. általában a fóprogram
  3. loop

Ezt végtelen ciklusnak is nevezzük mert a kontroller végtelenszer ismétli a benne lévő dolgot ( alap esetben ). Persze több módszerrel is ki lehet lépni a ciklusból: If-es feltétellen, goto-val.

A másik:
  1. For A (változó)= 1 To 10 Step 1
  2. valami végrehajtandó
  3. next
  4. további program

Ezt a ciklust jelen esetben 10 szer hajtja végre, majd továbblép.

Más téma: a feltételekről egyszerűen:

  1. If "akarmi" = "valamennyi" Then
  2. ha igaz végrehajtja ezt
  3. Else
  4. ha nemigaz ezt hajtja végre
  5. EndIf
(#) gerry válasza elektromos hozzászólására (») Máj 3, 2010 /
 
Szia!

A programod azért nem működik, mert ez
  1. Do
  2. If Portc.1 = 1 And Portc.2 = 1 Then
  3. Set Portc.3


nem jó. Egy portbit kiolvasása mindig a Pinx.y-al történik.
A te esetedben
  1. if Pinc.1=1 And Pinc.2=1 Then Set Portc.3
(#) hpmaster válasza elektromos hozzászólására (») Máj 3, 2010 /
 
Ha azt szeretnéd megoldani, hogy egy nyomógomb megnyomásával valami csak egyszer hajtódjon végre, akkor azt a következőképpen teheted meg:

  1. $regfile="m8def.dat"
  2.  
  3. config pinb.0=input
  4.  
  5. dim a as bit
  6.  
  7. a=0
  8.  
  9. do
  10.    if pinb.0 = 0 and a = 0 then
  11.       ...
  12.       a = 1
  13.       end if
  14.    if pinb.0 = 1 then a = 0
  15. loop


A működésének elve:
10k felhúzóellenállással a B portod 0. lábát felkötöd az 5V-ra. Azért ezt a megoldást javaslom, mert így a nyomógombod a GND-t kapcsolgatja a bemenetre és azt kezeled a programban, hogy 0 lett-e az értéke. Célszerű így csinálni, mert ha a tápot kapcsolgatod, akkor megeshet, hogy véletlenül nem az 5V-os tápot, hanem pl a 12V-os körödről kapcsolsz neki és akkor vége mindennek
Tehát célszerű nem a VCC-t kapcsolni és azt figyelni, hanem a GND-t kapcsolni. (Hiszen a 12V-os kör GND-je ugyanúgy null potenciál, mint az 5V-os köré.)

Tehát ennek fényében, ha a bemenetedre 0 szint érkezett és az 'a' változó értéke 0, akkor belép az IF ágba és megcsinálja amit szeretnél, végül az 'a' változót '1'-be állítja. A ciklusod újra lefut és megvizsgálja mégegyszer a feltételt, de ezesetben mivel a gombot még nem engedted el, az 'a' változód értéke még nem változott át '0'-ra, tehát nem csinálja meg mégegyszer ami a feltételben szerepel. És ez egészen addíg így is marad, amíg a gombot el nem engeded. Akkor ugyanis a felhúzó ellenállat miatt a pinb.0 értéke '1'-re vált, és nullázza az 'a' változódat. Így a következő gombnyomáskor újra végrehajtódhat a feltételed. Persze csak egyszer, amíg el nem engeded a gombot.
(#) hpmaster válasza elektromos hozzászólására (») Máj 3, 2010 /
 
  1. regfile = "m8def.dat"
  2. $crystal = 8000000
  3.  
  4. Config Pinb.0 = Input
  5. Config Pinb.1 = Input
  6. Config Portd.0 = Output
  7. Portb = 3  'belső felh.ellenállások bekapcsolása (így csak egy nyomógomb kell a pinb.0-1 lábakra a GND felé)
  8.  
  9.  
  10.  
  11. Dim A As Bit
  12. Dim Ok As Bit
  13. A = 0
  14.  
  15. Do
  16.   If Pinb.0 = 0 Or Pinb.1 = 0 Then                         'ha bármelyik gombot megnyomtad
  17.    Waitms 200                                               'vár 200ms-ot
  18.      Do                                                    'belép a belső ciklusba
  19.          If Pinb.0 = 0 And Pinb.1 = 0 And A = 0 Then        'ha mindkét gomb megnyomódott a 200ms-alatt
  20.            A = 1                                           'a változót '1-be
  21.            Ok = 1                                          'OK változót '1'-be
  22.             Set Portd.0                                     'kimenetet (LEDet) bekapcsolni
  23.         End If
  24.         If Pinb.0 = 1 Or Pinb.1 = 1 Then Ok = 0            'ha bármelyik gombot elengetdjük (vagy megsem nyomtuk) OK =0
  25.          A = 1                                              ' 'a' változó értéka mindenképpen 1-re
  26.      Loop Until Ok = 0                                     'ha OK=0 (azaz valamelyik gombot elengedtük) kilépés a belső ciklusból
  27.    End If
  28.  
  29.    If Pinb.0 = 1 And Pinb.1 = 1 Then A = 0                  'ha mindkét gombot elengedjük az 'a' segédváltozó legyen ismét 0
  30.   Reset Portd.0                                            'kikapcsoljuk a kimenetet
  31. Loop


Lehet kérdezni
(#) hpmaster válasza hpmaster hozzászólására (») Máj 3, 2010 /
 
  1. $regfile = "m8def.dat"
  2. $crystal = 8000000
  3.  
  4. Config Pinb.0 = Input
  5. Config Pinb.1 = Input
  6. Config Portd.0 = Output
  7. Portb = 3
  8.  
  9.  
  10.  
  11. Dim A As Bit
  12. Dim Ok As Bit
  13. A = 0
  14.  
  15. Do
  16.    If Pinb.0 = 0 Or Pinb.1 = 0 Then
  17.    Waitms 200
  18.       Do
  19.          If Pinb.0 = 0 And Pinb.1 = 0 And A = 0 Then
  20.             A = 1
  21.             Ok = 1
  22.             Set Portd.0
  23.          End If
  24.          If Pinb.0 = 1 Or Pinb.1 = 1 Then Ok = 0
  25.          A = 1
  26.       Loop Until Ok = 0
  27.    End If
  28.  
  29.    If Pinb.0 = 1 And Pinb.1 = 1 Then A = 0
  30.    Reset Portd.0
  31. Loop


Így talán átláthatóbb
(#) gerry válasza hpmaster hozzászólására (») Máj 3, 2010 /
 
Én sokszor alkalmaztam már a bitwait utasítást nyomógombnál. Addig biztos nem fut tovább a program amíg fel nem engedem a gombot elé egy 25 us várakoztatást, hogy a prellt kiküszöböljük. Hátránya, hogy addig áll a program amíg el nem engedem a gombot, de egy menüvezérléses programban tökéletesen működik.
Következő: »»   2 / 18
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem