változók konstansok meghatározások stb..

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

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

Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

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

Nem tudom, mért emlékeztem én arra, hogy a long lebegős... :D

Najó, nem magyarázkodok, hibáztam :P

Maradok a single vagy double-nál...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Most strukturált adatok létrehozáshoz, és kezeléséhez kérnék tanácsot!
Mondjuk ilyen formában:

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

Struct Nevsor:
Dim Sorszam As Byte
Dim Vez_nev As String * 10
Dim Ker_nev As String * 10
Dim Szul_ev As Word
Dim Szul_ho As Byte
Dim Szul_nap As Byte
Dim Lak_cim As String * 20
End Struct

Dim Nevsor(30) As Struct
Sajnos ilyet nem találtam a Bascomban! De, hogyan kellene megoldani?
És mindezt EEPROM-ban kellene létrehozni. Úgy, hogy lehessen új tagot hozzá tenni, és meglevőt törölni, vagy adatot módosítani.
:? :?:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Tipp:


Dim Sorszam(30) As Byte
Dim Vez_nev(30) As String * 10
Dim Ker_nev(30) As String * 10
Dim Szul_ev(30) As Word
Dim Szul_ho(30) As Byte
Dim Szul_nap(30) As Byte
Dim Lak_cim(30) As String * 20


és a tömb n-edik elemére hivatkozol mindegyik esetben....

Azért Linux nem fut a homin.... :P
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Bocs rosszul tettem fel a kérdést, a 30 csak példa volt nem fix érték!
Erre Én is gondoltam. De így nem tudom igény szerint dinamikusan változtatni a létszámot!
:?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Redim utasítással átszabható futás alatt. De azért nem egészséges....
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

REDIM??? Még ilyenről nem is hallottam! De nem is járható út!

Még meg kel oldani az adat törlést és utána a rendezést!
Erre még nincsen ötletem?
Egyébként itt tartok:

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

'Nevsor01.bas

$regfile = "m64def.dat"                                     ' specify the used micro
$crystal = 14745600                                         'Külsö Q
'$sim

$baud = 19200                                               ' use baud rate
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 32                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space

Declare Sub Nevwrite()                                      'Uj név bevitel
Declare Sub Nevsorread()                                    'Névsorlistázás
Declare Sub Nevdelete(dsorszam As Byte)                     '1 Név adatainak törlése

$eeprom
Eep_nul:
Data 0             'Itt lesz az aktuális Létszám nyilvántartva
'Switch back to normal data lines in case they are used
$data
'Adat struktura
Dim Flag As Byte        'Törléskor érvénytelenitjük az aktuális adatot
Dim Sorszam As Byte
Dim Vez_nev As String * 10
Dim Ker_nev As String * 10
Dim Szul_ev As Word
Dim Szul_ho As Byte
Dim Szul_nap As Byte
Dim Lak_cim As String * 30

Dim Letszam As Byte , I As Byte , Eepmutato As Word , Yes As String * 1
Dim Adathossz As Byte   'Aktuális sorszámú adat megkereséséhez
Adathossz = 56

Do
  Nevsorread
  Input " Veszel fel uj nevet? (I) " , Yes
  Yes = Ucase(yes)                                          'Nagy betüre vált, hogy a kis "i"-is elfogadja
  If Yes = "I" Then Nevwrite
  Print
  Nevsorread
  Input " Torolsz nevet? (I) " , Yes
  Yes = Ucase(yes)
  Input "Nev sorsama? " , I
  If Yes = "I" Then Nevdelete I
  Input " Folytatod? (I) " , Yes
  Yes = Ucase(yes)
Loop Until Yes <> I

End                                                         'end program
'Adat bevitele EEPROM-ba
Sub Nevwrite()
   Readeeprom Letszam , 0
   Readeeprom Flag , 1
   Eepmutato = Letszam * Adathossz
   Eepmutato = Eepmutato + 1                                'Itt kezdödik az adat
   Letszam = Letszam + 1
   Sorszam = Letszam
Ujadat:
    Print
    Print " Uj nev felvitele: "
    Print Sorszam ; " " ;
    Input " Vez nev: " , Vez_nev
    Input " Ker nev: " , Ker_nev
    Input " Szül ev: " , Szul_ev
    Input " Szül ho: " , Szul_ho
    Input " Szül nap: " , Szul_nap
    Input " Lak cim: (Max 30 kar!) " , Lak_cim
    Input " Rendben? (I) " , Yes
    Yes = Ucase(yes)
    If Yes <> "I" Then Goto Ujadat
'uj név bevitele EEPROM-ba
    Flag = 1                                                'Az adat érvényes
    Writeeeprom Letszam , 0
    Writeeeprom Flag , Eepmutato
    Eepmutato = Eepmutato + 1
    Writeeeprom Sorszam , Eepmutato
    Eepmutato = Eepmutato + 1
    Writeeeprom Vez_nev , Eepmutato
    Eepmutato = Eepmutato + 10
    Writeeeprom Ker_nev , Eepmutato
    Eepmutato = Eepmutato + 10
    Writeeeprom Szul_ev , Eepmutato
    Eepmutato = Eepmutato + 2
    Writeeeprom Szul_ho , Eepmutato
    Eepmutato = Eepmutato + 1
    Writeeeprom Szul_nap , Eepmutato
    Eepmutato = Eepmutato + 1
    Writeeeprom Lak_cim , Eepmutato
'    Eepmutato = Eepmutato + 30
End Sub
'Adat ok kiolvasása EEPROM-bol
Sub Nevsorread()
   Readeeprom Letszam , 0
   Eepmutato = 1                                            'Itt kezdödik az adat
   For I = 1 To Letszam                                     
      Readeeprom Flag , Eepmutato
      If Flag = 1 Then                                      'Adat érvényes?
         Eepmutato = Eepmutato + 1
         Readeeprom Sorszam , Eepmutato                    
         Eepmutato = Eepmutato + 1
         Readeeprom Vez_nev , Eepmutato
         Eepmutato = Eepmutato + 10
         Readeeprom Ker_nev , Eepmutato
         Eepmutato = Eepmutato + 10
         Readeeprom Szul_ev , Eepmutato
         Eepmutato = Eepmutato + 2
         Readeeprom Szul_ho , Eepmutato
         Eepmutato = Eepmutato + 1
         Readeeprom Szul_nap , Eepmutato
         Eepmutato = Eepmutato + 1
         Readeeprom Lak_cim , Eepmutato
         Eepmutato = Eepmutato + 30

         Print Sorszam ; " Nev: " ; Vez_nev ; " " ; Ker_nev ; " Szuletett: " ; Szul_ev ; " " ; Szul_ho ; " " ; Szul_nap
         Print " Lak cim: " ; Lak_cim
      Else
         Eepmutato = Eepmutato + Adathossz
      End If
   Next I
End Sub
'Adat Törlése
Sub Nevdelete(dsorszam As Byte)
'?????????*****************
End Sub
End                                                         'end program
Ez így folyamatosan növekedhet. Illetve a csökkentést meg kellene még oldani!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Adatbáziskezelőt még nem láttam AVR-re. :P

Nálam ami hasonló volt még régebben:
1-1 szekvencia 1-1 adat.
Ugye nem érdekes a sorrendbe rakása, viszont tudom, hogy max mennyi adat lehet (legalább a full eeprom mérete határozza meg :P).

És ha a név &HFF-l kezdődik (vagy stilszerűen szigmával,) akkor az szabadon felülírható. Mondjuk mint a DOS alatt volt a file törlése. csak az első karakter volt átírva, és innen tudta a rendszer, hogy szabadon felülírható.

Listázáskor meg beolvasod a teljes szekvenciát és ha az első karaktere &HFF, akkor az törölt/üres adat és nem dolgozod fel. Így az általad feldolgozni akart tömb a SRAMba már jól kerül be...
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 SQLlite nem jó? ARMra megvan és file alapú SQL kezelő :)
Egy routerben elmegy :P bár az AVR még kevés neki....

Off:
Az EEPROM 0. címét NE használd, mert hibás lehet! Lsd súgó!
Az AVR kikapcsoláskor, ha a BOD nem aktív, akkor az utoljára írt EEPROM tartalom korrupt lehet. Az AVRek datasheetje külön kitér rá. Bascom alatt minden EEPROM írás után a pointer a 0. címre mutat, így ha adatsérülés van, akkor az itt következik be.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

„Egy routerben elmegy bár az AVR még kevés neki...”
CompactFlas kártyakezelés folyamatban van. Csak ott is hibakereséssel bajlódok! :cry:
Sorba rendezés nem lesz, egyelőre. Inkább a törléskor keletkező fog híjakat tömőmbe az új adattal.
„Az EEPROM 0. címét NE használd, mert hibás lehet! Lsd súgó!”
Ezt mindég elfelejtem, progi javítva! :)
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00

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

Sikerült belefutnom nekem is a stack-ek és framesize okozta káoszba. :roll:

Egy M128-cal kűzdök, a program alig 13%-ot használ a prociból jelenleg, de a két hw uart és a nagy sram méret miatt ide ez kell.
Van egy csomó olyan számítás, ahol tizedestörtekkel, long, single, word, string, stb. változókkal kell dolgozni. Szóval, dolgozik rendesen a proci! :D

Eddig következetesen azt a módszert alkalmaztam, hogy a konstansokat nem definiáltam előre, hanem az adott műveletnél így írtam be az adott utasítást:

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

var1 = var2 - 0.0000325
var2 = var3 * 91.725
var1 = mem1 + var2
Ahogy bővült a program, úgy jöttek elő a "vad" számítási értékek.

Most ott tartok, hogy ekkorára növeltem az értékeket:

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

$hwstack = 500
$swstack = 500
$framesize = 300
A jelek szerint nem elég már ez sem, vagy nem a fentiek szerint kell eljárnom, hanem a konstansokat előre kell megadni, és a konstansnévvel hivatkozni rájuk az adott képletben? A fordító szempontjából melyik a jobb megoldás?
A szubrutinok, goto és gosub okozta izgalmakra még ezután próbálok rájönni, talán az stcheck-kel próbálkozom, mert az még használhatónak tűnik hibakeresés szempontjából. Tényleg, azt a szubrutin elejére, vagy inkább a végére "illik" tenni? (Nekem a vége tűnik logikusnak, de ennyi erővel bárhol lehetne a szubrutinon belül).

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

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

stcheck utasítást lesd meg. Sokat segít :)
Ill a hibakeresés bascom fejezet.....
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00

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

(Értelmesebben leírtam alább azt, amit először ide írtam...)
A hozzászólást 1 alkalommal szerkesztették, utoljára dummy 2009. december 18. péntek, 11:27-kor.
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00

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

Szimulátorban futtatható:

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

$sim
$regfile = "m88def.dat"
$crystal = 7372800
$baud = 115200

Dim Dis As String * 1
Dim Szam As Single
Dim Tv As Byte
Dim Tk As Byte
Dim Tort As Single

Const Tempc = - 33.698666472

Szam = Tempc

Print "szam => tempc = " ; Szam

Tort = Frac(szam)                                           'a törtrész változóba helyezése
Tort = Abs(tort)                                            'abszolút értékre váltás

Print "tort = " ; Tort

Dis = Str(tort)                                             'számból sztring
Dis = Mid(dis , 3 , 1)                                      'csak az első tizedes
Print "dis = " ; Dis
Print

Szam = Tempc
Szam = Int(szam)
Print "szam=" ; Szam
Tv = Val(dis)
Print "tv=" ; Tv

End
Odáig megy, hogy az első tizedesjegyet szépen elhelyezi a Tv változóba.

A help alapján egy tizedestört egész értékét az INT(var) parancs választja le (a tizedeseket a FRAC(var)). A baj az, hogy ez nem igaz, mert ez a parancs kerekít! A helpben viszont nem egészen ezt írják.

Tehát, az egészérték abszolútértékét szeretném a Tk változóba helyezni, de kerekítés nélkül! Ez viszont így nem megy. Ha tudtok, segítsetek! Köszönöm!
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00

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

Közben találtam megoldást:

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

Tort = Frac(szam)                                           'a törtrész változóba helyezése
Tort = Abs(tort)                                            'abszolút értékre váltás

Dis = Str(tort)                                             'számból sztring
Dis = Mid(dis , 3 , 1)                                      'csak az első tizedes
Tv = Val(dis)
Szam = Tempc
Szam = Szam - Tort
Szam = Abs(szam)
                           Print "szam = " ; Szam

Tk = Int(szam)

Print "tk=" ; Tk
Print "tv=" ; Tv

End
Csak egy baja van: az M88 programmemóriájából 23%-ot foglal el. :cry:
Ez így meg nem igazán nyerő...
Válasz küldése