menü navigáció

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
doncarlos
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2007. október 14. vasárnap, 6:00

menü navigáció

HozzászólásSzerző: doncarlos » 2012. november 2. péntek, 1:08

Sziasztok!

Adott a következő elrendezésű menü:

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

xxxx|v1|v2|v3|v4
 x  |xx|xx|xx|xx


A fejléc és a második sor első x értéke kiíródik a képernyőre, utána a következő módon szeretném az értékeket (xx) megadni. Alapból az első XX első X-én áll a kurzor, a 4x4-es billről beírok egy számot utána ugrik a második X-re. Ez idáig működik is. Majd a második után szeretném ha a kurzor visszaugrana az első X-re és így felülírhatom az előbbi bevitelt. Ha megnyomom a #-gombot (R kód) akkor ugorjon át a második XX első karakterére és így tovább. Ez a rész viszont furcsán viselkedik. A két karaktert be tudom írni ám a kurzor nem követi a mozgást, egy hellyel mindig előrébb van. a #-lenyomása után nem ugrik át csak az első "új" karakter lenyomása után kerül a helyére (a XX második X-hez). Bárhogy variáltam az alábbi kis rutint nem sikerült a kurzort rendesen pakolgatni. Érdekes viszont hogy a 4. XX után ha #-t nyomok akkor rendesen odaugrik az első X-re. Tehát csak a kurzormozgatással van gond, az értékek rendesen bekerülnek a megfelelő tömbbe stb... Érdekesség, hogy variáltam a kezdő if feltételét és ha <> "?" akkor úgy néz ki hogy a kurzor jó mozog mégis megjelennek olyan karakterek az X-ek helyén amit fel kellett volna hogy dolgozzon a program (E, R).

Remélem sikerült érthetően leírnom a helyzetet. Van valakinek valamilyen ötlete erre, esetleg hogy lenne ezt optimálisan/jobban/egyszerűbben csinálni?

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

$regfile = "m32def.dat"
$crystal = 11059200
$baud = 115200
$lib "mcsbyteint.lbx"                                       'a kisebb kod miatt
$lib "LUC_lcd4busy_timeout.lbx"                             'Luciano's fast LCD lib
$hwstack = 100
$swstack = 200
$framesize = 100


Index = 1
   Locate 2 , 1 : Lcd " " ; Str(x) ; "  |"
Bevitel:

   Keychar = ""
   Temp_str = ""
   Do
   If Keychar <> "?" And Keychar <> "" Then
         If Keychar = "A" Then Exit Do
         If Keychar = "E" Then Goto Eleje
         If Keychar = "R" Then
            If Index = 4 Then
               Keychar = ""
               Index = 1
            Else
            Ido_bajt(index) = Val(temp_str)
            Incr Index
            Goto Bevitel
            End If
         End If
         If Len(temp_str) > 1 Then Temp_str = ""
         If Keychar = "?" Then Keychar = ""
         'Waitms 100
         Temp_str = Temp_str + Keychar
         Select Case Index
            Case 1 : Locate 2 , 6
            Case 2 : Locate 2 , 9
            Case 3 : Locate 2 , 12
            Case 4 : Locate 2 , 15
         End Select
         Lcd Temp_str
         Keychar = ""
      End If
   Loop

A billentyűzet egy 4x4 hagyományos bill megszakításból kezelve. A kezelése az oldalon található bascom leírásból van kiemelve. BASCOM 2.0.7.3

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9989
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. november 2. péntek, 7:45

Ez a program igaz csak részlet?

A DIM-ek hiányából és a gombkezelés nemlátásából gondolom....
Így a logikai bukfenceidet nem lehet látni benne:(

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3321
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. november 2. péntek, 11:11

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

 Index = 1
    Locate 2 , 1 : Lcd " " ; Str(x) ; "  |"
 Bevitel:

    Keychar = ""
    Temp_str = ""
    Do
    If Keychar <> "?" Or Keychar <> "" Then                 ' ÉS helyet inkább VAGY ?
          If Keychar = "A" Then Exit Do
          If Keychar = "E" Then Goto Eleje
          If Keychar = "R" Then
             If Index > 4 Then                              ' Ha még a Select Index-nél kel a 4-es érték
                Keychar = ""
                Index = 1
             Else
             Ido_bajt(index) = Val(temp_str)
             Incr Index
             Goto Bevitel                                   'Itt mért ugraszki?
             End If
          End If
          If Len(temp_str) > 1 Then Temp_str = ""
  '        If Keychar = "?" Then Keychar = ""      ' Ez felesleges Mivel elötte van: If Keychar <> "?"
          'Waitms 100
          Temp_str = Temp_str + Keychar
          Select Case Index                                 'Hól változik az Index változód ?
             Case 1 : Locate 2 , 6
             Case 2 : Locate 2 , 9
             Case 3 : Locate 2 , 12
             Case 4 : Locate 2 , 15
          End Select
          Lcd Temp_str
          Keychar = ""
       End If
    Loop

Avatar
doncarlos
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2007. október 14. vasárnap, 6:00

HozzászólásSzerző: doncarlos » 2012. november 2. péntek, 15:35

Deklarációk konfigok:

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

Config Pind.2 = Input                                       'Megszakitás bemenet
Const Debouncetime = 150
Config Int0 = Falling                                       'Megszaktiás beállítása
Dim Keycoderow As Byte                                      'Gomb sor kód
Dim Keycodecol As Byte                                      'Gomb oszlop kód
Dim Keycode As Byte                                         'Gomb kód
Dim Keychar As String * 1                                   'Gomb érték (táblázatból)
Dim Index As Byte
Dim Ido_szoveg As String * 2 , Ido_bajt(4) As Byte
Dim Temp_str As String * 2

On Int0 Button

'billentyűzet beállítása
Ddra = &B11110000
Porta = &B00001111

Enable Interrupts
Enable Int0


Bill rutinn:

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

Button:
  Waitms Debouncetime
  'read portb pins to determine which row is zero
  Keycoderow = Pina
  'set portb upper nibble to input, lower to output
  Ddra = &B00001111
  Porta = &B11110000
  'give port time to settle
  Waitms 1
  'read portb pins to determine which col is zero
  Keycodecol = Pina
  'set portb back to original state
  Ddra = &B11110000
  Porta = &B00001111
  'make keycode from portb pins read
  Select Case Keycoderow
    Case 7 : Keycode = 0
    Case 11 : Keycode = 4
    Case 13 : Keycode = 8
    Case 14 : Keycode = 12
    Case Else : Keycode = 99
  End Select
  'shift upper nibble to lower nibble
  Shift Keycodecol , Right , 4
  'make final keycode from portb pins read
  Select Case Keycodecol
    Case 7 : Keycode = Keycode + 0
    Case 11 : Keycode = Keycode + 1
    Case 13 : Keycode = Keycode + 2
    Case 14 : Keycode = Keycode + 3
    Case Else : Keycode = Keycode + 99
  End Select
  'illegal keycode from bounce effects
  If Keycode > 15 Then Keycode = 16
'  Print Keycoderow ; " " ; Keycodecol ; " " ; Keycode
  Keychar = Lookupstr(keycode , Keycodes)
'  Cls
'  Locate 1 , 16 : Lcd Keychar
  Gifr = 64
Return

Keycodes:
Data "1" , "4" , "7" , "E" , "2" , "5" , "8" , "0" ,
Data "3" , "6" , "9" , "R" , "A" , "B" , "C" , "D" , "?"



És helyett vagy?
Azért írtam és mert úgy gondoltam hogy semmelyik nem lehet, és ha vagy van a feltételben akkor "felborul" a működés, az LCD-re kiíródnak a szöveges értékek, nehezen veszi az "entert (#)", viszont ha sikerül rendesen kezelnie a billentyűket akkor jól működik az ugrálás, mármint a 2. karakter után visszaugrik a kurzor az elsőre. Valami a ciklussal van mert ezt már korábban próbáltam (vagy-ra átírni) de még az if-ek helyett az egészet egy case-be is, de nem igazán működött.

Ha még a Select Index-nél kel a 4-es érték
Ha átírom a relációs jelet akkor kétszer kellett #-t nyomni az utolsó XX után hogy az elejére ugorjon.

'Itt mért ugrassz ki?
Arra gondoltam hogy a # lenyomása után lefuttatom újra az egész rutint mert ugyan azt kell vizságlni/kiírni csak más helyre, ezért van a case-es locate az lcd parancs előtt.

Ez felesleges Mivel elötte van: If Keychar <> "?"
Betettem mert ha VAGY a vizsgálat a ciklus elején akkor megjelenik a ?-jel... Gondoltam háta meg tudom fogni.

'Hol változik az Index változód ?
Az "incr index" -be a #-t lenyomását (R -kód) figyelő if-be.

A gombkezelést egy az egybe a BASCOM leírásból tettem bele a kódba, egyedül az adattáblát változtattam meg.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3321
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. november 2. péntek, 16:11

A kérdéseimre a magyarázataid sajnos nem helytállók!
Gondold át az egészet újra!

Lehet 1 változónak egyszerre kétféle értéke?
Mert az If And vizsgálat azt feltételezi.

Stb…

Avatar
doncarlos
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2007. október 14. vasárnap, 6:00

HozzászólásSzerző: doncarlos » 2012. november 2. péntek, 16:31

Értem hogy nem logikus egy változóra AND-et használni, azért csináltam mert or-ral írtam meg alapból nem működött és mondom hátha rosszul gondoltam és and-del "egész jól működik". És csak azért érdekes számomra ez mert elvileg nem lehet két értéke, mégis az if elvileg csak akkor hajtódna végre ha mindkét feltétel igaz, és hát végrehajtódott mert működik. :roll:

Újraírom az egészet... esetleg tanács a megközelítésre?

Köszi!

Avatar
doncarlos
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2007. október 14. vasárnap, 6:00

HozzászólásSzerző: doncarlos » 2012. november 2. péntek, 16:56

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

   Keychar = ""
   Do
   If Keychar <> "" Or Keychar <> "?" Then
      Locate 2 , 6 : Lcd Keychar
      Keychar = ""
   End If
   Loop


Ha ezt futtatom akkor hogy hogy megjelenik az lcd-n a kérdőjel?

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3321
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. november 2. péntek, 17:48

Ez jó kérdés!
Akkor gondoljuk át újra az egészet.

:?
Nem maradt bent a megszakításban ez:
' Locate 1 , 16 : Lcd Keychar <-
Gifr = 64
Return

Avatar
doncarlos
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2007. október 14. vasárnap, 6:00

HozzászólásSzerző: doncarlos » 2012. november 3. szombat, 2:28

kapu48 írta:Ez jó kérdés!
Akkor gondoljuk át újra az egészet.

:?
Nem maradt bent a megszakításban ez:
' Locate 1 , 16 : Lcd Keychar <-
Gifr = 64
Return


Benne van a locate meg az lcd de ki van kommentezve, már ha ezt kérdezted. Növelni kéne a debouncetime-ot esetleg?

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9989
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. november 3. szombat, 6:36

Csak tisztán a deklaráció és a INT gomkezelés + főprogiban kiírás?

A buttont hogyan hívod meg HWből? Hogy van az INT-re kötve?

M32 chipen vagy?

Avatar
doncarlos
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2007. október 14. vasárnap, 6:00

HozzászólásSzerző: doncarlos » 2012. november 3. szombat, 13:58

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

$regfile = "m32def.dat"
$crystal = 11059200
$baud = 115200
$hwstack=40
$swstack = 16
$framesize = 32
$lib "LUC_lcd4busy_timeout.lbx"                             'Luciano's fast LCD lib


Config Lcd = 16x2
'Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portd.7 , Rs = Portd.6

'#######################Lucaiano's LCD LIB konstansok###########################
Const _lcddb4_portx = Portc                                 'Valid values: PORTA, PORTB, PORTC, PORTD, PORTE.
Const _lcddb4_ddrx = Ddrc                                   'Valid values: DDRA, DDRB, DDRC, DDRD, DDRE.
Const _lcddb4_pinnumber = 2                                 'Valid values: 0, 1, 2, 3, 4, 5, 6, 7.

Const _lcddb5_portx = Portc                                 'Valid values: PORTA, PORTB, PORTC, PORTD, PORTE.
Const _lcddb5_ddrx = Ddrc                                   'Valid values: DDRA, DDRB, DDRC, DDRD, DDRE.
Const _lcddb5_pinnumber = 3                                 'Valid values: 0, 1, 2, 3, 4, 5, 6, 7.

Const _lcddb6_portx = Portc                                 'Valid values: PORTA, PORTB, PORTC, PORTD, PORTE.
Const _lcddb6_ddrx = Ddrc                                   'Valid values: DDRA, DDRB, DDRC, DDRD, DDRE.
Const _lcddb6_pinnumber = 4                                 'Valid values: 0, 1, 2, 3, 4, 5, 6, 7.

Const _lcddb7_portx = Portc                                 'Valid values: PORTA, PORTB, PORTC, PORTD, PORTE.
Const _lcddb7_ddrx = Ddrc                                   'Valid values: DDRA, DDRB, DDRC, DDRD, DDRE.
Const _lcddb7_pinx = Pinc                                   'Valid values: PINA, PINB, PINC, PIND, PINE.
Const _lcddb7_pinnumber = 5                                 'Valid values: 0, 1, 2, 3, 4, 5, 6, 7.

Const _lcde_portx = Portd                                   'Valid values: PORTA, PORTB, PORTC, PORTD, PORTE.
Const _lcde_ddrx = Ddrd                                     'Valid values: DDRA, DDRB, DDRC, DDRD, DDRE.
Const _lcde_pinnumber = 7                                   'Valid values: 0, 1, 2, 3, 4, 5, 6, 7.

Const _lcdrw_portx = Portc                                  'Valid values: PORTA, PORTB, PORTC, PORTD, PORTE.
Const _lcdrw_ddrx = Ddrc                                    'Valid values: DDRA, DDRB, DDRC, DDRD, DDRE.
Const _lcdrw_pinnumber = 6                                  'Valid values: 0, 1, 2, 3, 4, 5, 6, 7.

Const _lcdrs_portx = Portd                                  'Valid values: PORTA, PORTB, PORTC, PORTD, PORTE.
Const _lcdrs_ddrx = Ddrd                                    'Valid values: DDRA, DDRB, DDRC, DDRD, DDRE.
Const _lcdrs_pinnumber = 6                                  'Valid values: 0, 1, 2, 3, 4, 5, 6, 7.
'###############################################################################


Const Debouncetime = 150

Config Pind.5 = Output                                      'LED kimenet
Config Pind.2 = Input                                       'Megszakitás bemenet


Config Int0 = Falling                                       'Megszaktiás beállítása
Dim Keycoderow As Byte                                      'Gomb sor kód
Dim Keycodecol As Byte                                      'Gomb oszlop kód
Dim Keycode As Byte                                         'Gomb kód
Dim Keychar As String * 1                                   'Gomb érték (táblázatból)
On Int0 Button                                              'Megszakításkor a Button rutint hívja meg


'billentyűzet beállítása
Ddra = &B11110000
Porta = &B00001111

Cursor Off
Cls
Lcd "ready..."

Enable Interrupts
Enable Int0
Wait 1
Cls
Keychar = ""
Do
   Set Portd.5
   Waitms 250
   Reset Portd.5
   Waitms 250

   If Keychar <> "" Or Keychar <> "?" Then
      Locate 2 , 6 : Lcd Keychar
      Keychar = ""
   End If
Loop

Button:
  Waitms Debouncetime
  'read portb pins to determine which row is zero
  Keycoderow = Pina
  'set portb upper nibble to input, lower to output
  Ddra = &B00001111
  Porta = &B11110000
  'give port time to settle
  Waitms 1
  'read portb pins to determine which col is zero
  Keycodecol = Pina
  'set portb back to original state
  Ddra = &B11110000
  Porta = &B00001111
  'make keycode from portb pins read
  Select Case Keycoderow
    Case 7 : Keycode = 0
    Case 11 : Keycode = 4
    Case 13 : Keycode = 8
    Case 14 : Keycode = 12
    Case Else : Keycode = 99
  End Select
  'shift upper nibble to lower nibble
  Shift Keycodecol , Right , 4
  'make final keycode from portb pins read
  Select Case Keycodecol
    Case 7 : Keycode = Keycode + 0
    Case 11 : Keycode = Keycode + 1
    Case 13 : Keycode = Keycode + 2
    Case 14 : Keycode = Keycode + 3
    Case Else : Keycode = Keycode + 99
  End Select
  'illegal keycode from bounce effects
  If Keycode > 15 Then Keycode = 16
  Keychar = Lookupstr(keycode , Keycodes)
  Gifr = 64
Return


End                                                         'end program

Keycodes:
Data "1" , "4" , "7" , "E" , "2" , "5" , "8" , "0" ,
Data "3" , "6" , "9" , "R" , "A" , "B" , "C" , "D" , "?"


Ha ezt futtatom akkor is néha kijön a kérdőjel az LCD-re.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9989
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. november 3. szombat, 14:35

Forrasztóón maradék?
gumimenbrános a nyomógombod?
Hogyan keletkezik az INT a beolvasáshoz?

150 msec INTben - csúnya dolog!

Avatar
doncarlos
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2007. október 14. vasárnap, 6:00

HozzászólásSzerző: doncarlos » 2012. november 3. szombat, 14:53

Robert írta:Forrasztóón maradék?
gumimenbrános a nyomógombod?
Hogyan keletkezik az INT a beolvasáshoz?

150 msec INTben - csúnya dolog!


A bill. kezelés 1-1 egybe innen: http://avr.tavir.hu/modules.php?name=Content&pa=showpage&pid=20 van. A 150 ms-is meg az bill. mátrix bekötés is.

Billentyűzet: http://www.ebay.com/itm/4x4-Matrix-16-Key-Membrane-Switch-Keypad-Keyboard-NEW-for-Arduino-AVR-PIC-ARM-/251173103475?pt=LH_DefaultDomain_0&hash=item3a7b156773

Forrasztóón nem lehet mert dugaszolós panelen van. Egy dolog talán, hogy a linkelt billentyűzet egy kb. 1m-es árnyékolt riasztókábellel van bekötve a dugaszpanelra (a kábel két végére tüskesor forrasztottam).

Edit.: Csökkentettem a debouncetime-ot 50ms-re így is van még kérdőjel (de talán ritkábban).

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9989
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. november 3. szombat, 16:14

A linkelt billentyűzet eléggé "gázos". Több helyen is írték, hogy INT alapon nem használható.
Tipp:
- Timerx-re rakod és debounce nélkül 10x beolvasod 1 sec alatt. Az utolsó 3 eredményt nézed, és azoknak ha egyenlő az értéke: az a gomb nyomott.. Ha hiba van, az eredmény: "?"

Nos, hogy tetszik a javaslat?
INT-ben késleltetést rakni (lsd fejezet vége) azonos a SW-es harakirivel....

Avatar
doncarlos
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2007. október 14. vasárnap, 6:00

HozzászólásSzerző: doncarlos » 2012. november 3. szombat, 20:05

Robert írta:A linkelt billentyűzet eléggé "gázos". Több helyen is írték, hogy INT alapon nem használható.
Tipp:
- Timerx-re rakod és debounce nélkül 10x beolvasod 1 sec alatt. Az utolsó 3 eredményt nézed, és azoknak ha egyenlő az értéke: az a gomb nyomott.. Ha hiba van, az eredmény: "?"

Nos, hogy tetszik a javaslat?
INT-ben késleltetést rakni (lsd fejezet vége) azonos a SW-es harakirivel....


Hát sejtettem hogy nem a legjobb billentyűzet de sajnos csak ez van... kár hogy nem fog menni INT alapon. megpróbálom a timer-es megközelítést is.

Ha harakiri az INT-ben az késleltetés akkor miért szerepel olyan több helyen is a példák között (vagy én értek félre valamit)?


Vissza: “Bascom-AVR nyelvű programozás (AVR programozásának lehetőségei)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég