Hallo Marco78,
schau dir halt selbst die lcd4busy.lib an.Zitat:
Nur für RW oder gilt das für E und RS auch?
Ich stimme aber mit Bernd (Gandalf) überein, sein Programm und Pinbelegung funktioniert.
Gruß, Michael
Druckbare Version
Hallo Marco78,
schau dir halt selbst die lcd4busy.lib an.Zitat:
Nur für RW oder gilt das für E und RS auch?
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 ;)Zitat:
Zitat von Michael
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.
Hallo Marco78,
Ja, aus diesem Grunde nehme ich auch eine Hochsprache!Zitat:
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
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
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.
Hallo Marco78,
Lies halt meinen Post vom 29.11.04 01:55 und den davor!Zitat:
Aber warum empfiehlst du mir dann, die .lib anzuschauen?
Wozu auch? Mein Display funktioniert.Zitat:
Es hört sich so an als ob du Assembler auch nicht 100%ig verstehst.
Gruß, Michael
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?
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:
Das ganze sieht dann als Beispiel so aus: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]
Ich hoffe, damit geholfen zu haben...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
Gruß Ronny
www.ronny-net.de
8x2 displays kann man doch garnicht auswählen in bascom :-k
vielleicht gehts deshalb nicht