- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: LCD von Reichelt EA DIPS082

  1. #11
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    55
    Beiträge
    1.258
    Anzeige

    E-Bike
    Hallo Marco78,
    Nur für RW oder gilt das für E und RS auch?
    schau dir halt selbst die lcd4busy.lib an.
    Ich stimme aber mit Bernd (Gandalf) überein, sein Programm und Pinbelegung funktioniert.
    Gruß, Michael

  2. #12
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Zitat Zitat von Michael
    Hallo Marco78,
    Nur für RW oder gilt das für E und RS auch?
    schau dir halt selbst die lcd4busy.lib an.
    Ich stimme aber mit Bernd (Gandalf) überein, sein Programm und Pinbelegung funktioniert.
    Gruß, Michael
    Habe ich schon! Aber wenn ich Assembler zu 100% verstehen und schreiben könnte, bräuchte ich ja kein Bascom sondern würde AVR-Studio oder so nehmen

    Mein Problem ist auch nicht die Ansteuerung eines LCDs, das klappte schon mehrfach. Aber das auslesen, bzw reagieren, auf das Busyflag vermisse ich.

    Ich weiss auch, das Mark bei der Programmierung immer genug Zeiten mit eingeplant hat und diese auf die Taktfrequenz des AVR angepasst werden, die es eigentlich nicht notwendig machen das Busyflag mit auszulesen.
    Aber ich möchte es trotzdem machen, was er selbst in einer Mailinglist auch empfohlen hat. (Um Code zu sparen und die Geschwindigkeit zu steigern. Das waren seine Worte.)

    Mein Problem ist aber, das ich eigentlich keine Pins unter 4 mehr frei habe. Sondern nur noch welche, die mit 4 oder mehr enden.

  3. #13
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    55
    Beiträge
    1.258
    Hallo Marco78,
    Aber wenn ich Assembler zu 100% verstehen und schreiben könnte, bräuchte ich ja kein Bascom sondern würde AVR-Studio oder so nehmen
    Ja, aus diesem Grunde nehme ich auch eine Hochsprache!
    Da gibt es zig fertige Routinen. Daß dadurch das Programm größer/langsamer wird, nehme ich halt in Kauf.
    Das ist der Preis der Vereinfachung.
    Gruß, Michael

  4. #14
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Aber warum empfiehlst du mir dann, die .lib anzuschauen?
    Es hört sich so an als ob du Assembler auch nicht 100%ig verstehst. (Schreiben mal außen vor).

    Größere und langsamere Programme nehme ichjaauch in Kauf. Aber 1. gibt es die möglichkeit die Porgramme kleiner und schneller zu machen. Siehe MCSBytes.LBX. Und grade das kleiner kann bei nur 2kb Flash schon einiges bewirken.
    Es geht mir in diesem Fall aber um die Zeit, die gewartet wird, bis der nächste Befehl ausgeführt wird, nachdem das LCD beschrieben wurde. Dadurch geht mir jede Minute die Anzeige einer Sekunde verloren.
    Auch im 8bit-Modus.
    Und das reagieren auf busy, würde evtl den nächsten Befehl schneller ausführen.

  5. #15
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    55
    Beiträge
    1.258
    Hallo Marco78,
    Aber warum empfiehlst du mir dann, die .lib anzuschauen?
    Lies halt meinen Post vom 29.11.04 01:55 und den davor!
    Es hört sich so an als ob du Assembler auch nicht 100%ig verstehst.
    Wozu auch? Mein Display funktioniert.
    Gruß, Michael

  6. #16
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Den Post habe ich gelesen, den habe ich ja zitiert! Und alle Posts davor habe ich auch gelesen.
    Was hat dir das Verständnis vermittelt?
    Und ich habe ja nicht nach RW, sondern nach "und E und RS" gefragt.
    Und in der LIB ist das nicht weiter kommentiert.

    Das freut mich, das dein LCD geht.
    Aber ein:
    DO
    LCD "Hallo Welt"
    LOOP
    war mir auf die Dauer zu langweilig.
    Und Sinn eines Forums sollte es ja sein, anderen zu helfen, oder nicht?

  7. #17
    Gast
    Hatte mit dem Controller KS0073 auch so meine Probleme. Ursache hier ist, daß bei der Initialisierung erst noch ein "Extension bit" gesetzt werden muß

    hier meine angepasste LCD.lib:
    Code:
    ;----------------------------------------------------------
    ;Anschlussbelegung mein LCD
    ;----------------------------------------------------------
    ;DB4 = PB3 = PIN11
    ;DB5 = PB2 = PIN12
    ;DB6 = PB1 = PIN13
    :DB7 = PB0 = Pin14
    ;E   = PD4 = PIN6
    ;RS  = PD5 = PIN4
    ;R/W = GND = Pin5
    ;----------------------------------------------------------
    [_Init_LCD]
    ;----------------------------------------------------------
    ; 
    ; RW               liegt auf GND da nur geschrieben wird 
    ; D3, D2, D1, D0   liegen auf GND da nur 4 Bit-Datenlänge
    ; RS               Low für Befehlsübertragung, High für Datenübertragung
    ; E                Low-High-Low für Übertragungsaktivierung
    ;
    ;Anschlussbelegung LCD
    ; PD4 | PD5 | PB0 PB1 PB2 PB3 | PB0 PB1 PB2 PB3
    ; E   | RS  | D7  D6  D5  D4  | D3  D2  D1  D0
    ;     | 0   | 0   0   1   0   | 0   1   0   0   |  4 Bit-Datenlänge, extension Bit RE=1
    ;     | 0   | 0   0   0   0   | 1   0   0   1   |  4 Zeilen Modus
    ;     | 0   | 0   0   1   0   | 0   0   0   0   |  4 Bit-Datenlänge, extension Bit RE=0
    ;     | 0   | 0   0   0   0   | 0   1   1   0   |  Entry Mode Set Cursor Auto-Increment
    ;     | 0   | 0   0   0   0   | 0   0   0   1   |  LCD Inhalt löschen und Cursor auf Home
    ;     | 0   | 0   0   0   0   | 1   1   0   0   |  Display ein, Cursor aus, Blinken aus
    
    _Init_LCD:
                       rcall LCD_Delay_5ms     ; 5ms LCD-Verarbeitungspause einplanen
                       rcall LCD_Delay_5ms     ; 5ms LCD-Verarbeitungspause einplanen
                       rcall LCD_Delay_5ms     ; 5ms LCD-Verarbeitungspause einplanen
                       rcall LCD_Delay_5ms     ; 5ms LCD-Verarbeitungspause einplanen
                       sbi   DDRB, 0           ; PB3 (D3/D7) als Ausgang konfigurieren
                       sbi   DDRB, 1           ; PB2 (D2/D6) als Ausgang konfigurieren
                       sbi   DDRB, 2           ; PB1 (D1/D5) als Ausgang konfigurieren
                       sbi   DDRB, 3           ; PB0 (D0/D4) als Ausgang konfigurieren
                       sbi   DDRD, 4           ; PD4 (E) als Ausgang konfigurieren
                       sbi   DDRD, 5           ; PD5 (RS) als Ausgang konfigurieren
                       ldi   r24, &B00100100   ; 4 Bit-Datenlänge, extension Bit
                       rcall _Lcd_control
                       ldi   r24, &B00001001   ; 4 Zeilen Modus
                       rcall _Lcd_control
                       ldi   r24, &B00100000   ; 4 Bit-Datenlänge, extension Bit RE=0
                       rcall _Lcd_control
                       ldi   r24, &B00000110   ; Entry Mode Set Cursor Auto-Increment
                       rcall _Lcd_control
                       ldi   r24, &B00001100   ; Display ein, Cursor aus, Blinken aus
                       rcall _Lcd_control
    [END]
    
    ;----------------------------------------------------------
    [_Write_lcd]
    ;----------------------------------------------------------
    _Write_lcd:
                       sbi   PortD, 5          ; RS High für Datenübertragung
                       rjmp  _Write_lcd_Byte   ; weiter zur Datenübertragung
    _Lcd_control:
                       cbi   PortD, 5          ; RS Low für Befehlsübertragung
    _Write_lcd_Byte:
                       ldi r17, 8                   ;Für Schleife 8 x
    loop:              mov r26, R24                 ;Zu übertragendes Byte wird in R24 bereitgestellt und in R26 
                                                    ;für Bitmanipulation 
                       andi  r26, &B00000001        ;nur LSB wird ausgewertet
                       ror r24                      ;R24 wird nach rechts verschoben
                       rol r25                      ;R25 wird nach links verschoben
                       or   r25,  r26               ;R25 und R26 in Register R25 vereinen
                       Dec r17                      ;-1
                       Brne loop                    ;springe zu Schleife wenn R16 > 0
                       mov   r24, r25		;R25 wird in R24 bereitgestellt
                       swap  r24			;Nibble tauschen die Daten stehen jetzt gespiegelt an PB0 - PB3!!
                       mov   r25, r24          ; Zu übertragendes Byte wird in R24 bereitgestellt und in R25 
                                               ;für die Übertragung des 2. Nibble gesichert 
                                               ; H i g h  Nibble muss zuerst übertragen werden
                       swap  R24               ; Nibble tauschen
                       andi  R24, &B00001111   ; nur die unteren 4 Bit (unteres Nibble) berücksichtigen, obere 4 Bit 
                                                 ;(oberes Nibble) auf Null setzen 
                       in    R23, PinB         ; PortB in Register R23 einlesen (wegen PC7, PC6, PC5, PC4) diese sollen ja 
                                                 ;nicht überschrieben werden
                       andi  R23, &B11110000   ; nur die oberen 4 Bit (PC7, PC6, PC5, PC4) berücksichtigen, untere 4 Bit 
                                                ;(PC3, PC2, PC1, PC0) auf Null setzen 
                       or    R24, R23          ; PortB (PC7, PC6, PC5, PC4) mit LCD (PC3, PC2, PC1, PC0) in Register R24 
                                                ;vereinen 
                       out   PortB, R24        ; PortB aus Register R24 setzen
                       rcall LCD_Write_Enable  ; Übertragungsaktivierung
                                               ; L o w  Nibble muss noch übertragen werden
                       andi  R25, &B00001111   ; nur die unteren 4 Bit (unteres Nibble) berücksichtigen, obere 4 Bit 
                                                  ;(oberes Nibble) auf Null setzen 
                       or    R25, R23          ; PortB (PC7, PC6, PC5, PC4) mit LCD 
                                                  ;(PC3, PC2, PC1, PC0) in Register R25 
                                                ;vereinen 
                       out   PortB, R25        ; PortB aus Register R25 setzen
                       rcall LCD_Write_Enable  ; Übertragungsaktivierung
                       rcall LCD_Delay_50us    ; 50us LCD-Verarbeitungspause einplanen
                       ret
     
    LCD_Write_Enable:
                       sbi   PortD, 4          ; E High Übertragungsaktivierung gestartet
                       nop                     ; 3 Taktzyklen warten
                       nop
                       nop
                       cbi   PortD, 4          ; E Low Übertragungsaktivierung beendet
                       ret                     ; Funktionsende
    
    LCD_Delay_5ms:   
                       ldi   R24, 255          ; R24 Register mit Delaywert 100 * 50us vorbelegen
    LCD_Delay_5ms2:   
                       rcall LCD_Delay_50us    ; 50us Pause
                       dec   R24               ; R24 Registerinhalt um 1 runterzählen
                       brne  LCD_Delay_5ms2    ; Springe bei ungleich zurück zu LCD_Delay_5ms2
                       ret                     ; Funktionsende
    
    LCD_Delay_50us:
                       ldi   R25, 165          ; R25 Register mit Delaywert vorbelegen
    LCD_Delay_50us2:   
                       dec   R25               ; R25 Registerinhalt um 1 runterzählen
                       brne  LCD_Delay_50us2   ; Springe bei ungleich zurück zu LCD_Delay_50us2
                       ret                     ; 1 Takt (Befehlszyklus) bei 3,6864Mhz dauert ca. 271ns
                                               ; 50us / 271ns * 3 Takte in der Schleife = 61,5
    [END]
    
    ;----------------------------------------------------------
    [_CLS]
    ;----------------------------------------------------------
    _Cls:
                       ldi   R24, &B00000001   ; LCD Inhalt löschen und Cursor auf Home                  
                       rcall _Lcd_control      ; Befehl an LCD senden
                       rcall LCD_Delay_5ms     ; 5ms LCD-Verarbeitungspause einplanen
                       ret
    [END]
    Das ganze sieht dann als Beispiel so aus:
    Code:
    $regfile = "2313def.dat"                                    'für ATMEL AT90S2313
    $crystal = 4000000                                          'Quarz: 4 MHz
    $lib "LCD.lib"
    Ddrd = &B0110000                                            'Pin PD5 und PD4  auf Out
    Ddrb = &B00001111                                           'Pin PB0-PB3 auf Out
    Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portd.4 , Rs = Portd.5
    Config Lcd = 20 * 4a                                         ' "a" für spezielles Display 
    Initlcd                                                     'Initlcd
    Cls
    Locate 1 , 1
    Lcd "erste Zeile"
    Locate 2 , 1
    Lcd "zweite Zeile"
    End
    Ich hoffe, damit geholfen zu haben...
    Gruß Ronny
    www.ronny-net.de

  8. #18
    Gast
    8x2 displays kann man doch garnicht auswählen in Bascom
    vielleicht gehts deshalb nicht

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

12V Akku bauen