-         

Ergebnis 1 bis 5 von 5

Thema: c-controll I2C lcd treiber in bascom uebersetzen

  1. #1

    c-controll I2C lcd treiber in bascom uebersetzen

    Anzeige

    hallo
    ich hab ein I2C lcd fuer die c-control I m-unit 2 conrad Artikel-Nr.: 198330 - 62 das ich gerne an einem RN-Control 1.4 verwenden wuerde.

    dazu wollte ich die basic++ ansteuerung in Bascom uebersetzen, was mir nicht gelang.

    hier der orginal basic++ code:

    Code:
    'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
    'III      BASIC++  DEMO ZUM BASIC-COMPUTER UNIT M 1.2/2.0       IIIII
    'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
    '--------------------------------------------------------------------
    ' Beispiel zum BASIC-COMPUTER    mit dem Programmer/Application-Board
    '--------------------------------------------------------------------
    ' LIBRARY: LCD_INIT()          INIT LCD AT IICBUS (PCF8574)
    '          L1(position)        SET CURSOR TO LINE1 POSITION position
    '          L2(position)        SET CURSOR TO LINE2 POSITION position
    '          LCD_CLR             CLEAR DISPLAY
    '          LCDWRITE(CMD,DATA)  CMD=0/20h for WRITE COMMAND/WRITE DATA
    '-------------------------------------------------------------------
    
    '-------------------------------------------------------
    '--- PCF 8574 LCD DRIVER AT ADDR 7 / EXT BYTEPORT 10 ---
    '-------------------------------------------------------
    
    Function Lcd_write(buf As Byte , Lcddata As Byte)
     Define Extport Byteport[10]
     Define Outbyte As Byte
     '--------- ------WRITE HI NIBBLE ------------------------
     Outbyte = Buf Or(lcddata Shr 4)
     Extport = Outbyte Or 01000000b
     Extport = Outbyte And 10111111b
     '--------------- WRITE LO NIBBLE ------------------------
     Outbyte = Buf Or(lcddata And 0fh)
     Extport = Outbyte Or 01000000b
     Extport = Outbyte And 10111111b
    End Function
    
    '-----------------------------------------------------
    
    Function Lcd_clr()
    Lcd_write(0 , 02h)
    Lcd_write(0 , 01h)
    Pause 2
    End Function
    '----------------------------------------------------
    Function Lcd_init()
    Define Extport Byteport[10]
    Extport = 0
    Lcd_write(0 , 38h)                     '0=WRITE CMD
    Extport = 00000010b
    Extport = 01000010b
    Extport = 00000010b
    Lcd_write(0 , 28h)
    Lcd_write(0 , 0ch)
    Lcd_clr()
    End Function
    '----------------------------------------------------
    Function Line1(pos As Byte)
    Lcd_write(0 , 7fh + Pos)
    End Function
    '----------------------------------------------------
    Function Line2(pos As Byte)
    Lcd_write(0 , Bfh + Pos)
    End Function
    '----------------------------------------------------
    und hier soweit ich kam in bascom:

    Code:
    '--------------------------------------------------------------------
    ' LIBRARY: LCD_INIT()          INIT LCD AT IICBUS (PCF8574)
    '          L1(position)        SET CURSOR TO LINE1 POSITION position
    '          L2(position)        SET CURSOR TO LINE2 POSITION position
    '          LCD_CLR             CLEAR DISPLAY
    '          LCDWRITE(CMD,DATA)  CMD=0/20h for WRITE COMMAND/WRITE DATA
    '-------------------------------------------------------------------
    '--- PCF 8574 LCD DRIVER AT ADDR 7 / EXT BYTEPORT 10 ---
    '-------------------------------------------------------
    
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    
    $crystal = 16000000
    $baud = 19200
    
    Declare Sub Lcd_write(byval Buf As Byte , Byval Lcddata As Byte)
    Declare Sub Lcd_clr()
    Declare Sub Lcd_init()
    Declare Sub Line1(byval pos As Byte)
    Declare Sub Line2(byval Pos As Byte)
    Config Scl = Portc.0
    Config Sda = Portc.1
    
    I2cinit
    
    Dim X As Byte
    Dim Y As Byte
    Dim Outbyte As Byte
    
    '-------------------------------------------------------
    
    
    Sub Lcd_write(buf As Byte , Lcddata As Byte)
     I2cstart
     '--------- ------WRITE HI NIBBLE ------------------------
     Outbyte = &H20 Or(shift Lcddata , Right , 4)
     X = Outbyte Or &B01000000
     I2cwbyte X
     X = Outbyte And &B10111111
     I2cwbyte X
     '--------------- WRITE LO NIBBLE ------------------------
     Y = lcddata And &H0F
     Outbyte = Buf Or Y
     X = Outbyte Or &B01000000
     I2cwbyte X
     X = Outbyte And &B10111111
     I2cwbyte X
     I2cstop
    End Sub
    
    '-----------------------------------------------------
    
    Sub Lcd_clr()
     Lcd_write 0 , &H02
     Lcd_write 0 , &H01
     Waitms 2
    End Sub
    '----------------------------------------------------
    Sub Lcd_init()
     I2cstart
     I2cwbyte 0
     I2cstop
     Lcd_write 0 , &H38                                         '0=WRITE CMD
     I2cstart
     I2cwbyte &B00000010
     I2cwbyte &B01000010
     I2cwbyte &B00000010
     I2cstop
     Lcd_write 0 , &H28
     Lcd_write 0 , &H0C
     Lcd_clr
    End Sub
    '----------------------------------------------------
    Sub Line1(pos As Byte)
     Lcd_write 0 , &H7F + Pos
    End Sub
    '----------------------------------------------------
    Sub Line2(pos As Byte)
     Lcd_write 0 , &HBF + Pos
    End Sub
    '----------------------------------------------------
    
    Lcd_init
    ' wuerde 'DA' schreiben
    Lcd_write &H20 , &H44
    Lcd_write &H20 , &H41
    hauptproblem ist bei diesem high/low nibble.
    in der zeile 39 mit dem bitshift hat mir der compiler immer ne fehlermeldung von wegen wert passt nicht in die variable gegeben. jetzt sagt er es grad nicht.
    aber funktionieren tuts jedenfalls nicht.
    gefunden hab ich nichts dazu.
    danke

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    16.11.2003
    Beiträge
    355
    Das mit dem Shift funktioniert ein bisschen anders:

    shift Lcddata , Right , 4
    Outbyte = &H20 Or Lcddata
    X = Outbyte Or &B01000000

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,
    und nach dem I2Cstart muss als erstes die Slaveadresse des PCF8574 kommen, mit zB. &H40, wenn der auf &H40 hört.
    I2cwbyte &H40
    Danach können die anderen Bytes kommen.

  4. #4
    danke
    hab beides geaendert
    leider ohne erfolg

    die slaveadresse kaeme ja vor (im orginalcode) in der lcd_write routine bei:
    Outbyte Or &B01000000 (&H40)

    nur verstehe ich das ganze 'shift' 'or' und 'and' getue hier nicht.
    das aber in allen relevanten beispielen die ich gefunden habe vorkommt.

  5. #5
    habs jetzt mit der Bascom 'I2C LCD and Keboard library' versucht

    http://www.roboternetz.de/wissen/ind...BCber_I.C2.B2C
    http://www.mcselec.com/index.php?opt...d=82&Itemid=57

    auch ohne erfolg
    das lcd sollte aber passen
    http://www.everbouquet.com.tw/Gener.htm

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •