LED villogtató

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

LED villogtató

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

Sziasztok!

Írtam egy programot ATTiny2313-ra! A program 8 LED-et villogtat. Íme a program:

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

Config Portb = Output


Do
    Portb = 1
    Waitms 100
    Portb = 2
    Waitms 100
    Portb = 4
    Waitms 100
    Portb = 8
    Waitms 100
    Portb = 16
    Waitms 100
    Portb = 32
    Waitms 100
    Portb = 64
    Waitms 100
    Portb = 128
    Waitms 100
Loop

End
Azt meglehet csinálni hegy a LEDek véletlenszerüen villogjanak? Még nagyon kezdő vagyok ehhez.
Bence
Hooligan01

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

Nem túl nehéz, ha csak erre van szükséged:

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


Do
waitms 100
portb = rnd(255)
loop

Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

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

Köszi!!! Én is próbálkoztam az rnd-vel de nem tudtam, hogy így kell!
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 »

Vigyázz, ez álvéletlen számot ad!
Azzaz ki/bekapcs után ugyanzt a sort futja végig...
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

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

Köszi neked is Robert!
Bence
Avatar
albinolynx
Tranzisztorgyógyász
Hozzászólások: 161
Csatlakozott: 2007. október 28. vasárnap, 6:00

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

Csak nem nyitok uj topikot feleslegesen... (:


Egy kis elzomeny, hogy kepben legyen mindenki:
http://www.hightechspeed.com/index.asp

Hasonlo aramkort szeretnek kesziteni. A feladat 20db nagyfenyereju led vezerlese lenne. Azon mar tul vagyunk, hogy atmega16 lesz a chip. Ehhez szeretnek irni egy programot.

Az egyszeru villogtatas, labak cimzese mar pazarul megy. Ott vagyok elakadva, hogyan kezeljek egy kulso nyomogombot, aminek a hatasara lehetne ugrasokat vegezni a chipen belul.

Idezem Robert-tol, erthetobb lesz:
Sok prg 1 chipben: NEM.
De ha a prg elején lekérdezed a kapcsoló állapotát, akkor arra fusson rá, az mehet. Itt a láb állapota beolvas és annak megfelelő ágon fut a prg. Pl:

do
If pina.1=1 then
.
.
.
.
endif
If pina.2=1 then
.
.
.
.
endif
If pina.3=1 then
.
.
.
.
endif
loop

Igy az A1...3 kapcsolókkal álltasz prg-t.
Ha 2 van bekapcsolva, akkor 2 prg-t váltogat, amint az egyik végetért....

Annyi valtoztatast szeretnek, hogy ha ki van valasztva egy program a nyomogombbal, akkor azt tarolja es a kovetkezo kivalasztasig (nyomkodom a nyomogombot) es folyamatosan az fusson.

Osszesen harom kapcsolo figyelesere lesz szukseg:
1: fekezeskor futo program kivalasztasa
2: feklampa kapcsolo
3: helyzetjelzo program

Igy is eleg lesz az atmega16?
Avatar
herc1234
Bitfaragó
Hozzászólások: 459
Csatlakozott: 2007. február 9. péntek, 7:00

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

szia
én ezt úgy oldottam meg hogy
1. eepromba tárolom a változók kezdeti értékét
2. megszakításnál megnézem mi volt megnyomva eltárolom egy bitben
3.select case-el eldöntöm mi volt megnyomva és közben beolvasom a ledek állását egy databól aztán léptetek egyett (futófény)
egyenlőre itt tartok vele ha érdekel :

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

$regfile = "m8def.dat"
$crystal = 8000000


'portok beállítása (direkt nincs konfigolva az input csak a megszakítás)
Config Portd.4 = Output
Config Portd.1 = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.7 = Output
Config Portd.0 = Output
Config Portd.3 = Input
Config Portb = Output
Config Portc = Output
Config Int1 = Low Level

Dim Rogzit As Byte
Dim Led As Byte
Dim Pvzled As Byte
Dim V As Byte
Dim Ledpoz As Byte
Dim Speed As Byte
Dim Gomb As Bit
Dim Sig As Bit
Dim Ledaddress As Integer

'adatok beolvasása
Waitms 250
Readeeprom Ledaddress , &H1F0
Waitms 10
Readeeprom Rogzit , &H1F1
Waitms 10
Readeeprom Pvzled , &H1F2
Waitms 10
Readeeprom Speed , &H1F3
Waitms 10


'itt majd lessz egy konfigurálási lehetőség ha bekapcsoláskor valaki benyomva tartja a gombot

If Pind.6 = 0 Then Gosub Beallit


'megszakítás konfigja

On Int1 Lekerdez Nosave


Enable Interrupts
Enable Int1

'a főprogram!

Res:

'az eepromba eltárolva vannak a Data szegmensei
Readeeprom Ledpoz , Ledaddress
Waitms 10


'itt gombnyomásra ugrik egyett a beállítás

If Gomb = 1 Then
   Portd.2 = 0
   Portd.0 = 0
   Portd.7 = 0
   Portd.1 = 0
   Portb = 0
   Portc = 0
      Select Case Pvzled
      Case 3
      Pvzled = 1
      Case 2
      Pvzled = 3
      Case 1
      Pvzled = 2
      End Select
   Incr Ledaddress
   Gomb = 0
End If

'itt egy másik bemenetre véletlenszerűen kezd villogni a futófény

If Rogzit = 0 Then
   If Sig = 1 Then
   Pvzled = Rnd(3) + 1
   Ledaddress = Rnd(24) + 1
   Sig = 0
   End If
End If

'8x2 led futófény főprogramja itt direkt címezve a portlábak de kicsit 
keverve hogy a led byteba el legyen tárolva igy egy ledállás

For V = 1 To 8
Led = Lookup(ledpoz , Leddata)
Waitms 5
Select Case Pvzled
Case 1
   Portc.1 = Led.0
   Portb.4 = Led.1
   Portb.2 = Led.2
   Portb.0 = Led.3
   Portd.2 = Led.4
   Portd.0 = Led.5
   Portc.5 = Led.6
   Portc.3 = Led.7
Case 2
   Portb.5 = Led.0
   Portb.3 = Led.1
   Portb.1 = Led.2
   Portd.7 = Led.3
   Portd.1 = Led.4
   Portc.6 = Led.5
   Portc.4 = Led.6
   Portc.2 = Led.7
Case 3
   Portc.1 = Led.0
   Portb.5 = Led.0
   Portb.4 = Led.1
   Portb.3 = Led.1
   Portb.2 = Led.2
   Portb.1 = Led.2
   Portb.0 = Led.3
   Portd.7 = Led.3
   Portd.2 = Led.4
   Portd.1 = Led.4
   Portd.0 = Led.5
   Portc.6 = Led.5
   Portc.5 = Led.6
   Portc.4 = Led.6
   Portc.3 = Led.7
   Portc.2 = Led.7

End Select

'sebesség beállítása

Waitms Speed


'következő ledállás


Incr Ledpoz
Next V
Waitms 10
Restore Leddata
Goto Res

'ledállások a flasht nem terheli mega 8 nál eepromba nem férne el

Leddata:
Data 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128
Data 128 , 64 , 32 , 16 , 8 , 4 , 2 , 1
Data 3 , 6 , 12 , 24 , 48 , 96 , 192 , 129
Data 129 , 192 , 96 , 48 , 24 , 12 , 6 , 3
Data 7 , 14 , 28 , 56 , 112 , 224 , 193 , 131
Data 131 , 193 , 224 , 112 , 56 , 28 , 14 , 7
Data 15 , 30 , 60 , 120 , 240 , 225 , 195 , 135
Data 135 , 195 , 225 , 240 , 120 , 60 , 30 , 15
Data 31 , 62 , 124 , 248 , 241 , 227 , 199 , 143
Data 143 , 199 , 227 , 241 , 248 , 124 , 62 , 31
Data 63 , 126 , 252 , 249 , 243 , 231 , 207 , 159
Data 159 , 207 , 231 , 243 , 249 , 252 , 126 , 63
Data 127 , 254 , 252 , 251 , 247 , 239 , 223 , 191
Data 191 , 223 , 239 , 247 , 251 , 252 , 254 , 127
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
Data 17 , 34 , 68 , 136 , 17 , 34 , 68 , 136
Data 136 , 68 , 34 , 17 , 136 , 68 , 34 , 17
Data 238 , 221 , 187 , 119 , 238 , 221 , 187 , 119
Data 119 , 187 , 221 , 238 , 119 , 187 , 221 , 238
Data 85 , 170 , 85 , 170 , 85 , 170 , 85 , 170
Data 1 , 3 , 7 , 15 , 31 , 63 , 127 , 255
Data 255 , 127 , 63 , 31 , 15 , 7 , 3 , 1
Data 0 , 255 , 0 , 255 , 0 , 255 , 0 , 255


'ez itt a megszakítás

Lekerdez:
If Pind.6 = 0 Then Gomb = 1
If Pind.5 = 0 Then Sig = 1
Return


' ez még nincs kész ez lesz a beállító menü

Beallit:
Do
Portc.1 = 1
Waitms 50
Portc.1 = 0
If Pind.6 = 0 Then Goto Proba
Loop


tényleg valaki nem tudja hogy lehet progiból resetelni az ict?
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

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

hello!

Én így oldottam meg:

$asm
jmp 0
$end Asm
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 resetre nem jell holmi $asm:).

Megoldás:

Egyszerű

Goto _reset 'nem mindíg működik, a _reset értéke változó!
jmp _reset 'reset címre megy, lsd fenn.


jmp $0000 'chip 0000-s címére - azaz a prgmemória bekapcsolási címére ugrik
goto $0000 'ugyanaz


macera ha a chipben bootloader van, ekkor:
jmp $bootloadercime
goto $bootloader cime



Elegéns, legegyszerűbb a watchdog használata. Ez nullázás nélkül RESETeli a chipet!
config watchdog=2048 '2048 msec
stop watchdog


resetrutin:
start watchdog'2 sec múlva újraindul a chip.Nem kell foglalkozni, hogy hol a bootloader vagy a chipprg eleje....
stop
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

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

Nekem bootloader nélkül így jól múködik! 8)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Csak ha prg írás van, és _esetleg_ publikálódó firmware nem tudhatod, hogy ki milyenbe építi be....

Én ezért preferrálom a watchdog alapú megoldást.... Ott a chip kezeli ezeket, és nem nekem kell tudni, hogy 128-25-512-1024 word a bootloader....
Avatar
herc1234
Bitfaragó
Hozzászólások: 459
Csatlakozott: 2007. február 9. péntek, 7:00

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

én eddig azt hittem hogy a watchdog a compiler által lefordított
progiban már benne lesz automatikusan (értem itt a WDT nullázását)
mondjuk az sem rossz dolog ha az ember le tudja kezelni
tetszik a megoldás sőt akkor már be is építem a progiba megfelelő helyekre..és ahol reset kell oda nem teszek nullázást

Bascom simulatorba lehet breakpointot csinálni időre?
félek nem pedig milyen jó dolog volna
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

WatchDog 2 féleképp aktív:
1, programban config és start
2, a biztosítékbittel beállíthatóan automatikusan indulva


Ha a prg benne lenne, akkor nem tudnád mikor és hol fut. A lényege, hogyha végtelen ciklusba kerülsz valahol és fut a WD, akkor nem tud nullázódni 8mert abba a részben nincs benn a reset watchdog. Így a túlcsordulás, majd a RESET bekövetkezik.... És aprogramod fut, nem pedig "lefagy" a chipben....


Simben Időre breakponit? nem megy. alul látod az eltelt időt... Sajna csak sorra lehet breakpointot rakni:( illetve lépésenkénti futtatása van...
Avatar
herc1234
Bitfaragó
Hozzászólások: 459
Csatlakozott: 2007. február 9. péntek, 7:00

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

Ha a program végtelen ciklusba fut akkor az már bug.
és a WD csak egy nagyobb végtelen ciklust csinál a szoftware köré.
Ugyhogy szerintem inkább arra találták ki hogy ha netántán külső behatások miatt (pl ugrik a táp)a proc lefagy mivel a WD proctól független áramkörből áll ujra tudja indítani a rendszert (és nem veszítik el a müholdat,űrszondát,űrkompot....stb :D )
Szerintem az már alapbból gáz ha valaki olyan programot ír ami végtelen ciklusba futhat..(bár nem vagyok programozó de véleményem lehet)

Érdekes külöben hogy a Compiler nem fordít le olyan szöveget ahol
2x van degradálva ugyanaz az int pedig lehet olyan elágazást irni ahol
a másik ágra futás közben nem kerül sor..
Az is érdekes hogy a Demoban volt InteliSEnse funkció a full verzióban pedig nincs..vagy be lehet kapcsolni valahol?
Bár a Demoban csak inkább mint idegesítésként volt jelen dehát
javítgatni azért lehetett volna sem mint kitörölni ahogy van az egészet.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Persze a WD az a védelem miatt van. És azért ha bármilyen prg-t megnézek, lehet benne ilyen hiba, hogy ciklusra futok (stack és frame megadás elrontása....).
Az aranyszabály: minde program tartalmaz legalább:
- egy változót
- egy ciklust
- egy hibát....

Külső zavar szintén okozhat félrelépést...
Illetve lehet hogyha pl. INTre nem élet, hanem szintet adsz. Tutin beragad az INT körbe...
Válasz küldése