I2C Serviceeinheit mit 27x4 Display

Hallo!

Na super, dann wäre das doch schon mal erledigt!
Wenn dein Display nun auch funktioniert wenn du es waagerecht hinlegst, dann ist doch alles perfekt. :D
Weitere Bilder sind damit also erst mal nicht erforderlich.

Allerdings ersetzen die neuen Tastköpfe für das Speicher-Scope noch lange keinen LA.....
aber das wirst du mit der Zeit schon merken. :cool:

Dann zieh mit dem Geraffel man erst mal in die Garage um, bevor es noch richtig ärger gibt.
Schließlich bist du erst am Anfang und weitere zusätzliche Test- und Messaufbauten folgen bestimmt noch.
Da bleibt dann bestimmt nicht mehr viel Platz auf dem Schreibtisch über. :wink:


Dann mal gutes Gelingen weiterhin,
Cassio
 
Display funktioniert jetzt in jeder Lage ;)

Aaaaber Bascom ärgert mich. Vollversion ist installiert und registriert. Als ich dann Deinen Codeschnipsel compilieren wollte, wieder das alte Spiel:
Bildschirmfoto 2012-09-02 um 19.05.50.png

Bemaulte Datei:
Bildschirmfoto 2012-09-02 um 19.06.25.png

Irgendeine Idee woran es liegen könnte? Bascom hab ich frisch installiert. Danach hatte ich das Problem, dass ich in den Optionen keine Einstellungen speichern konnte, weil der OK-Button und die anderen nicht zu sehen waren. Löschen der Bascom-avr.xml brachte Erfolg bei DEM Problem.
 
Als ich dann Deinen Codeschnipsel compilieren wollte, wieder das alte Spiel:


Hallo Berfroid!

Stell doch bitte mal den Programm-Code hier ein..... genau so, wie du ihn verwendet hast.

Irgendwas kann da nicht stimmen. :hmmmm:


Danke und Grüße,
Cassio
 
Das Hauptprogramm

Code:
                           '
$regfile = "m16adef.dat"
$crystal = 8000000                                          'EXTERN !


$hwstack = 128
$swstack = 128
$framesize = 128



' --------------------ATmega16------------------------
'                    +---v---+
'       (XCK/T0) PB0 |1    40| PA0 (ADC0)------Taster
'           (T1) PB1 |2    39| PA1 (ADC1)------Taster2
'    (INT2/AIN0) PB2 |3    38| PA2 (ADC2)
'     (OC0/AIN1) PB3 |4    37| PA3 (ADC3)
'           (SS) PB4 |5    36| PA4 (ADC4)
'         (MOSI) PB5 |6    35| PA5 (ADC5)
'         (MISO) PB6 |7    34| PA6 (ADC6)
'          (SCK) PB7 |8    33| PA7 (ADC7)
'              RESET |9    32| AREF
'                VCC |10   31| GND
'                GND |11   30| AVCC
'              XTAL2 |12   29| PC7 (TOSC2)
'              XTAL1 |13   28| PC6 (TOSC1)
'          (RXD) PD0 |14   27| PC5 (TDI)
'          (TXD) PD1 |15   26| PC4 (TDO)
'         (INT0) PD2 |16   25| PC3 (TMS)
'         (INT1) PD3 |17   24| PC2 (TCK)
'         (OC1B) PD4 |18   23| PC1 (SDA)-------I2C
'         (OC1A) PD5 |19   22| PC0 (SCL)-------I2C
' DCF77---(ICP1) PD6 |20   21| PD7 (OC2)-------LED
'                    +-------+


' ================================================
' Bestimme die Ein- und Ausgänge
Ddra = &B_0000_0000                                         '1 ist Ausgang 0 ist Eingang
Porta = &B1111_1111

Ddrb = &B_0000_0000                                         '1 ist Ausgang 0 ist Eingang
Portb = &B1111_1111

Ddrc = &B_0011_1111                                         '1 ist Ausgang 0 ist Eingang
Portc = &B1100_0000

Ddrd = &B_1011_1111                                         '1 ist Ausgang 0 ist Eingang
Portd = &B0100_0000                                         'auf Hi oder Low setzen



Led Alias Portd.7
Taster Alias Pina.0
Taster2 Alias Pina.1



' ==============================================================================
Declare Sub Lcd_(byval X1 As Byte , Byval X2 As Byte , Byval Text1 As String * 27)
Declare Sub Lcd_cls
Declare Sub Lcd_init
Dim Text As String * 27                                     'LCD Ausgabe
Dim Lcd_text(27) As Byte At Text Overlay                    'ASCII-Werte der LCD Ausgabe
Dim Init(5) As Byte                                         'Byte-Array für LCD-Parameter

Const Pcx_lcd = &H74                                        'I2C-Adresse des PCx8574(A)

'          PCF8574A
'             __
'      A0  -o|1 |o-  Vdd
'      A1  -o|  |o-  SDA
'      A2  -o|  |o-  SCL
'      D4  -o|  |o-  n.c. (INT)
'      D5  -o|  |o-  E1
'      D6  -o|  |o-  E2
'      D7  -o|  |o-  RW
'     GND  -o|_9|o-  RS

' ==============================================================================
' I2C-Config
Config Scl = Portc.0                                        'I2C SCL
Config Sda = Portc.1                                        'I2C SDA

Config I2cdelay = 1

I2cinit
' ==============================================================================


' #############################################################################
Dim I As Byte , I2 As Byte                                  'Indexzähler


' #############################################################################
' Anfangswerte:

Lcd_init


' ################################################
' #                                              #
' #---------------Arbeitsschleife----------------#
' #                                              #
' ################################################
Do                                                          'Hauptschleife-Beginn

Lcd_ 1 , 1 , "Test der Zeile 1xxxxxxxxxxx"
Lcd_ 2 , 1 , "Test der Zeile 2xxxxxxxxxxx"
Lcd_ 3 , 1 , "Test der Zeile 3xxxxxxxxxxx"
Lcd_ 4 , 1 , "Test der Zeile 4xxxxxxxxxxx"

Wait 3
Lcd_cls
Waitms 500


Loop                                                        'Hauptschleife-Ende


End                                                         'end program


' #############################################################################
Sub Lcd_(x1 As Byte , X2 As Byte , Text1 As String * 27)    'Sub zur Zeichenausgabe am Display
$include "_2704_i2c.bas"

' #############################################################################
Sub Lcd_cls:                                                'Sub zum löschen beider Displayhälften
$include "_2704_CLS.bas"

' #############################################################################
Sub Lcd_init:                                               'Sub zum initialisieren beider Displayhälften
$include "_2704_init.bas"
 
Hallo Berfroid!

Ich muss gleich mal schauen warum das im Hauptprogramm bei dir so ist,
aber der Fehler liegt hier:

Code:
' ==============================================================================
Declare Sub Lcd_(byval X1 As Byte , Byval X2 As Byte , Byval Text1 As String * 27)
Declare Sub Lcd_cls
Declare Sub Lcd_init
Dim Text As String * 27                                     'LCD Ausgabe
Dim Lcd_text(27) As Byte At Text Overlay                    'ASCII-Werte der LCD Ausgabe
[COLOR="#FF0000"]Dim Init(5) As Byte                                         'Byte-Array für LCD-Parameter[/COLOR]

Const Pcx_lcd = &H74                                        'I2C-Adresse des PCx8574(A)

'          PCF8574A
'             __
'      A0  -o|1 |o-  Vdd
'      A1  -o|  |o-  SDA
'      A2  -o|  |o-  SCL
'      D4  -o|  |o-  n.c. (INT)
'      D5  -o|  |o-  E1
'      D6  -o|  |o-  E2
'      D7  -o|  |o-  RW
'     GND  -o|_9|o-  RS


Richtig ist in diesem Fall:
Code:
Dim Init[COLOR="#FF0000"](8)[/COLOR] As Byte                                         'Byte-Array für LCD-Parameter


Danach sollte sich das Problem bei dir erledigt haben! :wink:


Jetzt muss ich aber erst mal schauen, wie die Fünf da hinein gekommen ist. :hmmmm:

Grüße,
Cassio
 
Ok, die 8 ist eingetragen und das ganze funzt jetzt auch. JUHUUUU!!

Die Frage die ich mir stelle: Wie komme ich anhand der Fehlermeldung darauf, das der Fehler genau da ist? Kannst Du das bitte kurz erläutern, oder ist das zu aufwendig?
 
Hallo!

Nun ja, aus der Fehlermeldung kannst du das nicht direkt ersehen. :wink:

Wenn man aber das Programm und die Routinen kennt, dann ist die Fehlersuche natürlich auch etwas einfacher. :cool:
Die Sache ist aber auch so nicht ganz so schwer....

In der Sub für das CLS wird ein 8-Byte Array zum Senden der Daten verwendet!
Im Hauptprogramm wurde aber nur ein Array mit fünf Bytes dimensioniert.
Das ist auch schon alles. :wink:


Grüße,
Cassio
 
Hallo,

also die Meldung "Index out of range" heißt soviel wie das der Zeiger (Index) der auf einen Eintrag in dem Array zeigen soll außerhalb des erlaubten Bereiches ist. Entweder wird der Index also falsch im Programm berechnet und verläßt darum nach oben oder unten den erlaubten Bereich oder er wird richtig berechnet und der Bereich ist zu klein (Array zu klein).

Gruß
Dino
 
Hallo zusammen,

ich musste mal ne Woche pausieren, in der ich mir etwas überlegt hatte: Ich versuche jetzt doch erstmal die Serviceeinheit mit einem normalen 16x2 Display, welches mit der KentAnderson Lib funktioniert nachzubauen. Und prompt hab ich Probleme. Wieder mit einer Fehlermeldung, die mir nicht weiterhilft.

Code:
Error:5 Line 127 No more space for BIT [_BKEY_SCAN] , in File ...
Error:320 Line 127 [syntax error, token ='{'], in File ...

key_i2c.lib wurde geändert.

Code:
$regfile = "m16adef.dat"


$crystal = 8000000

$hwstack = 128
$swstack = 128
$framesize = 128

$lib "Lcd_i2c.lib"                                          'My i2c driver for the LCD
$lib "Key_i2c.lib"                                          'My i2c Keyboard driver
$external _Key_Code                                        'Enable the routine

Config I2cdelay = 1
I2cinit


Const Pcf8574_lcd = &H74                                    'Defines the address of the I/O expander for LCD
Const Pcf8574_kbd = &H72                                    'Defines the address of the I/O expander for KBD
!rcall _Key_Init                                            'Call initialization routine (needed if int. driven)

Config Scl = Portc.0                                        'Configure i2c SCL
Config Sda = Portc.1                                        'Configure i2c SDA
Dim _lcd_e As Byte                                          'Needed to control 4 line LCD
Dim _key_scan As Byte                                       'Returned Key from _Key_scan

Enable Interrupts
Config Int0 = Falling                                       'Int signal from PCF8574_KBD is connected to INT0
'Enable Int0                                                 'Don't enable until it should be used (after LCD-test)
On Int0 _int0_label                                         'Procedure to call upon interrupt

'_lcd_e = 128 select E1, 64 select E2, 192 select both (for CLS or DefLCDChar etc.)
_lcd_e = 128                                                'Upper half of 4-line display is selected

'Here the LCD test program that is included in BASCOM follows
'and at the end there is a demo of the keyboard scan routine

Dim A As Byte
'Config Lcd = 16 * 2                                         'configure lcd screen
'other options are 16 * 4 and 20 * 4, 20 * 2 , 16 * 1a
'When you dont include this option 16 * 2 is assumed
'16 * 1a is intended for 16 character displays with split addresses over 2 lines

'$LCD = address will turn LCD into 8-bit databus mode
'       use this with uP with external RAM and/or ROM
'       because it aint need the port pins !
' Put your own strings here

Cls                                                         'clear the LCD display
Lcd "Hello world."                                          'display this at the top line
Wait 1
Lowerline                                                   'select the lower line
Wait 1
Lcd "Shift this."                                           'display this at the lower line
Wait 1
For A = 1 To 10
   Shiftlcd Right                                           'shift the text to the right
   Waitms 500                                               'wait a moment
Next

For A = 1 To 10
   Shiftlcd Left                                            'shift the text to the left
   Waitms 500                                               'wait a moment
Next


Locate 2 , 1                                                'set cursor position
Lcd "*"                                                     'display this
Wait 1                                                      'wait a moment

Shiftcursor Right                                           'shift the cursor
Lcd "@"                                                     'display this
Wait 1                                                      'wait a moment

Home Upper                                                  'select line 1 and return home
Lcd "Replaced.       "                                             'replace the text
Wait 1                                                      'wait a moment

Cursor Off Noblink                                          'hide cursor
Wait 1                                                      'wait a moment
Cursor On Blink                                             'show cursor
Wait 1                                                      'wait a moment
Display Off                                                 'turn display off
Wait 1                                                      'wait a moment
Display On                                                  'turn display on
'-----------------Support for line 3 and 4 is controlled via _lcd_e
_lcd_e = 64
Lcd "Line 3"
Lowerline
Lcd "Line 4"
Wait 1
_lcd_e = 128                                                'select both halfs for defining characters
'Now lets build a special character
'the first number is the characternumber (0-7)
'The other numbers are the rowvalues
'Use the LCD tool to insert this line
Deflcdchar 2 , 32 , 10 , 32 , 14 , 17 , 17 , 17 , 14        ' replace ? with number (0-7)
Deflcdchar 0 , 32 , 4 , 32 , 14 , 18 , 18 , 18 , 13         ' replace ? with number (0-7)
Deflcdchar 1 , 32 , 10 , 32 , 14 , 18 , 18 , 18 , 13        ' replace ? with number (0-7)
_lcd_e = 128
Cls                                                         'select data RAM
Rem it is important that a CLS is following the deflcdchar statements because it will set the controller back in datamode
Lcd Chr(0) ; Chr(1)                                         'print the special character

'----------------- Now use an internal routine ------------
_temp1 = 2                                                  'value into ACC
!rCall _write_lcd                                           'put it on LCD


'Display pressed key value on LCD

Do

Enable Int0                                                 'Now I could accept input from Keyboard
If _key_scan > 0 Then                                       'As the keyboard is interupt driven I could do like this!
   Disable Int0                                             'Disable Int0 during LCD output due to the fact
   Locate 2 , 10                                            'that _Key_Scan also uses i2c (garbled output is likely)
   Lcd _key_scan ; " "
   Enable Int0
End If

Loop
End

_int0_label:
!rcall _Key_Code
Return

Code:
copyright = Kent Andersson
www       = none
email     = kent@smmab.se
comment   = I2C Keyboard scanner
libversion   = 1.00
date         = 31 march 2002
statement    = You are free to use this code any way you like, if you are able to optimize
statement    = it better, please send me an update on my e-mail.
history      = No known bugs.

;define a constant named PCF8574_KBD pointing to the i2c address
;dimension a byte named _Key_Scan that will return a value depending on
;the key pressed (0 if none) returncode as follows:
;   C1 C2 C3 C4
;R1  1  2  3  4
;R2  5  6  7  8
;R3  9 10 11 12
;R4 13 14 15 16
;
;Connect the following pins from PCF8574 to your keyboard matrix
;
;P0 - Column 1
;P1 - Column 2
;P2 - Column 3
;P3 - Column 4
;P4 - Row 1
;P5 - Row 2
;P6 - Row 3
;P7 - Row 4
;
;If you want a interruptdriven keyboard connect INT to INT0 (or other)
;and call Key_init during the beginning of your program.
;Disable the interrupt during I/O intensive commands (like LCD, Locate etc.)
;Now you could build your own Keyboard interrupt routine, with keyboard buffer
;and anything you want.


[_Key_Code]
_Key_Code:
 *BASIC: waitms 50
 *BASIC: i2creceive pcf8574_Kbd, _Temp1
 Ldi R16,0
* sts {_bKey_Scan},R16
 CPI _Temp1, &H0F
 Breq No_Key_Pressed
 sbrs _temp1, 1
 Ldi R16,1
 sbrs _temp1, 2
 Ldi R16,2
 sbrs _temp1, 3
 Ldi R16,3
 push R16
 *BASIC: i2csend pcf8574_Kbd, &HF0
 *BASIC: i2creceive pcf8574_Kbd, _Temp1
 pop R16
 sbrs _temp1, 5
 Sbr R16,&h04
 sbrs _temp1, 6
 Sbr R16,&H08
 sbrs _temp1, 7
 Sbr R16,&h0c
 inc R16
* sts {_bKey_Scan},R16
_Key_Init:
 *BASIC: i2csend pcf8574_Kbd, &H0F
No_Key_Pressed:

Ret
[END]

Übrigens: Wenn ich das Keyboard auskommentiere funktioniert das LCD einwandfrei
 
Hallo!

Wo hast du das Programm und die LIB denn eigentlich her? :hmmmm:


Deine Fehlermeldung besagt, dass es die Variable _BKEY_SCAN nicht gibt, oder er nicht alle Bits davon speichern kann (zu klein dimensionierter Bereich).

Wenn du mal genau hinschaust wirst du auch sehen, dass du im Programm die Variable _key_scan benutzt!
In der LIB wird aber _BKEY_SCAN verwendet! :wink:


Ändere doch mal die beiden Angaben in der LIB von _bkey_scan auf _key_scan !
Es gibt zwei dieser Stellen in der LIB:
Code:
* sts {_bKey_Scan},R16

Dann sollte es funktionieren.....
und du hast später auch keine Probleme mehr mit meinen oder anderen Beispielprogrammen. :cool:


Grüße,
Cassio
 
Guten Morgen Cassio.

Wo hast du das Programm und die LIB denn eigentlich her? :hmmmm:

Von hier: http://www.mcselec.com/index.php?option=com_content&task=view&id=82&Itemid=57

Deine Fehlermeldung besagt, dass es die Variable _BKEY_SCAN nicht gibt, oder er nicht alles Bits davon speichern kann (zu klein dimensionierter Bereich).

Geht doch nix über Klartext-Fehlermeldungen ;)

Ändere doch mal die beiden Angaben in der LIB von _bkey_scan auf _key_scan !
Es gibt zwei dieser Stellen in der LIB: (...)

Hab ich getan. Compilieren geht. Nun zeigt das Display aber nur Müll an, auch mit abgezogenen Keys und Neustart danach. :banghead:
Auf Fehlersuche gehe ich aber erst heute Abend wenns hier etwas ruhiger ist.
 
Hallo!

Na fein, dann hätten wir das eine Problem gelöst....
kommen wir zum Nächsten. :D


Momentan weiß ich nicht, was dein LCD durcheinander bringt.
Schraub doch erst mal die I2C-BUS Geschwindigkeit herunter.
Zum Beispiel:
Code:
Config I2cdelay = 10

Mit der maximalen BUS-Geschwindigkeit hatte ich beim LCD auch immer wieder Probleme.


Grüße,
Cassio
 
Hallo,

Ok, Geschwindigkeit runter ist immer gut ;)
Jetzt zeigt das Display wieder an was es soll.

Aber die Tasten bewirken immer noch nichts. INT0 in Zeile 27 ist aktiviert, Adresse ist &H72.
Meine Tastatur hat 12 Tasten, 3 Spalten und 4 Reihen.
Spalten 1, 2, und 3 liegen an P0, P1 und P2. P3 ist offen.
Reihe 1 bis 4 liegen auf P4 bis P7.

Nur mal um es gefragt zu haben: Beim Matrixkeyboard am PCF8574 brauche ich keine Pulldown, -up-Widerstände, richtig?
 
Hallo !

OK, wieder ein Problem weniger....
und dafür ein Neues. :wink:

Nein, du benötigst keine Widerstände für die Matrix.
Daran kann es also nicht liegen.

Die INT-Verbindung vom PCF zum AVR ist aber OK?

Im Zweifel musst du mal eines von deinen Scope`s anwerfen und schauen ob wirklich etwas passiert.
Softwaretechnisch wüsste ich jetzt gerade nicht, woran das liegen könnte.
Das ist auch der Grund, warum nun gleich an die Hardware gedacht habe.

Falls du dir nicht sicher bist, ob die &H72 Adresse für das Keyboard stimmt, kannst du das ganz einfach prüfen:
Code:
Const Pcf8574_kbd = &H72


I2cstart
I2cwbyte Pcf8574_kbd
I2cstop

If Err = 0 Then
   Locate 1 , 1 : Lcd "KBD OK"
Else
   Locate 1 , 1 : Lcd "KBD FEHLER"
End If

Die BUS-Geschwindigkeit kannst du ggf. ja auch von 10 auf 5 herauf setzen.
Vielleicht klappt es dann mit dem LCD ja immer noch.


Grüße,
Cassio
 
Hallo,

sorry, dass Antworten bei mir derzeit etwas länger dauern.

Deinen Codeschnipsel hab ich probiert. KDB OK. Wenn ich den Adressjumper abziehe kommt Fehler. Adresse stimmt also.

Wenn ich im Demoprogramm den Interrupt aktiviere

Code:
'Enable Int0                                                 'Don't enable until it should be used (after LCD-test)
kommt auf dem Display nur Müll. Solange Int0 auskommentiert ist, funzt das Display prima.

Frage: Ist das Interrupsignal ein einfacher 0-1 bzw 1-0 wechsel? Mein Oszi zeigt auf der Int-Leitung nur ein "Rauschen", von dem ich kein klares Bild bekomme. Es verändert sich zwar irgendwas, aber was passiert, kann ich nicht erkennen.
 
Hallo!

Puh.... keine Ahnung, warum das nun wieder Probleme gibt. :hmmmm:

Ich muss aber auch ehrlich sagen, dass ich mit dem Demo-Programm etwas auf Kriegsfuß stehe.

Die Aufteilung und systematische Abarbeitung diverser Konfigs entspricht nicht meiner Denkweise.
Ich weiß aber nicht, ob es dadurch wirklich Probleme gibt.

Nach meinem Dafürhalten würde ich erst den INT und die I2C-Hardware konfigurieren, bevor ich die LIB`s einbinde und das Key_init ausführe.

Dann wird oben der INT0 nicht eingeschaltet.... dann aber kurz vor der Do-Loop Schleife dann doch wieder!
Beim Abfragen der Matrix wird der INT zwischendurch wieder abgeschaltet..... damit vermutlich kein neuer INT ausgelöst und vermekt wird.

Mit dem "echten" externen INT für die Matrix ist das sowieso nicht ganz so einfach.
Es kann einem immer wieder passieren, dass der INT die Signalübertragung zum LCD plötzlich unterbricht...... und dann zeigt es natürlich nur noch Mist an.


Vielleicht solltest du mal damit beginnen, ein erstes Beispielprogramm selbst zu schreiben.
Also nur erst mal das LCD, dann die Matrix ohne INT dazu, dann vielleicht mit INT usw.

Auf diese Weise kannst du dich mit allem Vertraut machen und merkst auch gleich, wenn pötzlich etwas schief geht..... oder nicht mehr richtig läuft. :wink:


Grüße,
Cassio
 
Frage: Ist das Interrupsignal ein einfacher 0-1 bzw 1-0 wechsel? Mein Oszi zeigt auf der Int-Leitung nur ein "Rauschen", von dem ich kein klares Bild bekomme.


Hallo!

Ups.... vergessen zu beantworten.

Der externe INT-Pin ist ein Eingang und der interne PullUp am AVR sollte aktiviert sein!
Demnach MUSS das Signal im Ruhezustand am Eingang auch immer HIGH sein.
Wenn der INT am PCF auslöst (drücken oder loslassen einer Taste), wird das Signal (sehr) kurzzeitig auf GND gezogen.

Mit dem Scope kannst du das am Besten sehen, wenn du beim Trigger nicht Auto sondern "Normal" oder "Einzeln" verwendest.
Wie lange das Signal vom PCF auf GND gehalten wird, kann ich dir jetzt leider aus dem Kopf heraus nicht sagen.


Grüße,
Cassio
 
Wird langsam mal Zeit, dass es hier wieder weiter geht ;)
Ich war leider massiv verhindert, mich hierum zu kümmern.

Inzwischen habe ich rausgefunden, dass ein mein Matrixkeyboard defekt war. Das besagte Demoprogramm hab ich jetzt nicht mehr getestet, sondern das hier:

Code:
$regfile = "m8adef.dat"
$crystal = 8000000

$hwstack = 128
$swstack = 128
$framesize = 128

'Ein- Ausgänge definieren
(...)

'--I2C-Config
Config Scl = Portc.5
Config Sda = Portc.4
I2cinit

Config I2cdelay = 10


'--I2C Matrixtastaur
$lib "key_i2c.lib"
$external _key_code

Const Pcf8574_kbd = &H72
!rcall _Key_Init


'--Interrupts einschalten
Enable Interrupts
On Int0 Keyb_lesen


'--I2C LCD
$lib "Lcd_i2c.lib"

Const Pcf8574_lcd = &H74


'--_lcd_e Variable
Dim _lcd_e As Byte
_lcd_e = 128
!rcall _init_lcd
Waitms 100

Dim _key_scan As Byte
Dim Keyb As String * 1                                     


'--Hauptschleife

Do

Disable Int0
   Locate 1 , 1 : Lcd "Taste " ; Keyb ; " gedruckt"
   Locate 2 , 1 : Lcd "_key_scan = " ; _key_scan ; "  "
   Waitms 100
Enable Int0

Loop


'--Matrix lesen
Keyb_lesen:

!rcall _key_code
If _key_scan > 0 Then
   Keyb = Lookupstr(_key_scan , Wert)
Else
End If

Return


Wert:
Data "Z" , "1" , "2" , "3" , "A" , "4" , "5" , "6" , "B" , "7" , "8" , "9" , "C" , "*" , "0" , "#" , "D"

Return

Das Ergebnis:
2012-10-20_16-37-26_209.jpg 2012-10-20_16-37-14_156.jpg

Du, Cassio sprachst davon, das Du von der Interrupt Ein- und Ausschalterei nix hältst. Wenn ich das nicht mache, bekomme ich wieder nur Mist auf dem Display. Spielen mit dem i2c delay bringt auch nix. Wie würdest Du es machen?
 
Hallo,

Du, Cassio sprachst davon, das Du von der Interrupt Ein- und Ausschalterei nix hältst. Wenn ich das nicht mache, bekomme ich wieder nur Mist auf dem Display. Spielen mit dem i2c delay bringt auch nix. Wie würdest Du es machen?
also ich arbeite normalerweise gerne mit Interrupts. Man muß nur sehr genau planen damit sich die Interrupts nicht mit anderen zeitkritischen Routinen beharken. Manche Sachen sind allerdings ohne Interrupts einfacher zu lösen. Man muß eben ein wenig abwägen was im Einzelfall das Bessere ist.

Interrupts entlasten das System weil man nicht dauernd auf einen bestimmten Zustand prüfen muß. Die Hardware kümmert sich ohne Programmbelastung selber darum. Darum mag ich Interrupts.

Gruß
Dino
 
Hallo Berfroid!

Na, dann geht es bei dir ja doch noch weiter.
Ich hatte schon vermutet, dass du dich nach einer fertigen Lösung umgesehen hast. :wink:

Um so erfreuter bin ich nun über deinen Fortschritt! :wavey:

Deine Serviceeinheit sieht auch richtig gut aus.
Gerade die Folientastatur hebt den optischen Eindruck unheimlich. :wink:

Damit wären die Vorbereitungen ja eigentlich abgeschlossen und es kann mit den Controllereinheiten für die RFID-Öffner weitergehen.


Du, Cassio sprachst davon, das Du von der Interrupt Ein- und Ausschalterei nix hältst.

Generell sehe ich es so wie Dino.....
Ich verwende die externen INT`s recht gern und häufig!

Das Problem ist hier aber die Kombi aus Matrixkyboard und LCD.
Denn wenn du gerade Daten zum LCD sendest und diese werden durch einen INT der Matrix unterbrochen, dann hast du sehr schnell unleserliche Zeichen auf dem LCD.
Ärgerlich ist das natürlich dann, wenn du gerade dabei bist einen RFID-Tag zu speichern, oder zu löschen.

Eigentlich ist die Verwendung des INT`s auch gar nicht notwendig. Es reicht bei der Einheit auch das Abfragen eines Pins.
Du kannst es aber natürlich machen wie du möchtest. :wink:

Wenn ich ehrlich bin, habe ich ja selber den externen Interrupt für die Matrixtastatur in meinen Programmen verwendet. :cool:


Grüße,
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)