Autor
|
Thema: USB-LCD Lowcost Edition (Gelesen 469388 mal)
|
conradfreak
Lötkolbenfreak

Karma: +0/-0
Offline
Geschlecht: 
Beiträge: 157

|
OH
Das is schlecht 
Hab mir schon 3 LCD`s geholt 
Könnt ich evt. einen an USB und die beiden anderen parallel an den LPT?
|
|
|
Gespeichert
|
|
|
|
|
christian
Modding-Noob

Karma: +0/-0
Offline
Beiträge: 6
Ich liebe dieses Forum!
|
Hallo zusammen, ich habe ein 40x4 Zeichen LCD erfolgreich in Betrieb genommen. Alles wunderbar. Ich würde nun gerne versuchen, die Hintergrundbeleuchtung per PWM zu dimmen. Ich meine im Sourcecode entdeckt zu haben, dass der Wert aus dem Befehl "short _stdcall USB_LCD_BL (short value)" irgendann auf dem TINY als data[2] ankommt:
case cmdLCD_BG: if(data[2] != 0) PORTD |= (1 << 5); else PORTD &= ~(1 << 5); len = 1; break;
Meine erste Frage nun: Warum heisst es hier (1<<5) Das hieße doch, dass das Bit 5 des Ports D beeinflusst wird... Und das wäre doch eigentlich der Pin für das Signal E2? Hmmm. Nunja, wenn ich nun PD5 und PD3 tauschen würde (E2/BL), dann könnte ich die PWM-Funktion vom PD5 aktivieren (OC1B). Dann müsste ich nur den Wert in die PWM schreiben und schwups müsste meine Hintergrundbeleuchtung dimmbar sein. Problem: Ich habe versucht, die Firmware mit dem ATMEL AVR Studio und WinAVR (beides neueste Versionen) zu compilieren. Nachdem ich einige Optimierungen eingeschaltet habe, passt es zumindest in den Speicher (Flash 96.8%/Data 39.8%) und ich bekomme keine Fehlermeldung. Aber wenn ich das erzeugte HEX-File flashe, wird meine Schaltung nicht mehr erkannt -> "Unbekanntes Gerät". Gibt es da irgendwie eine Anleitung, wie ich die Firmware selber compilieren und modifizieren kann? Oder kann mit das einer machen und mir das HEX-File schicken? Das wären ja nur ein paar Zeilen mehr:
[...] case cmdLCD_BG: OCR1B = data[2]; len = 1; break; [...] int main(void){ PORTB = 0xFF; DDRB = 0xFF; PORTD = 0; DDRD = 0b01111000; TCCR0A = (1<<COM0B1) | (1<<WGM00) | (1<<WGM01) TCCR0B = (1<<WGM02) | (1<<CS00) usbInit(); sei(); for(; { /* main event loop */ usbPoll(); } return 0;
Dann habe ich noch ein ganz anderes Problem: Wenn ich mein Display verbunden habe und alle wunderpar funktioniert, möchte ich meinen Rechner in den Hibernate-Zustand (Susbend to disk) versetzen. Das geht natürlich auch. ABER wenn ich dann wieder aufwache (Resume), dann ist das Display nicht initialisiert und ich bekommen auch bei einem Neustart meiner Software auf dem PC keine Verbindung mehr. Im Gerätemanager steht das Display ordentlich angemeldet drin. Erst nachdem ich das Display im Gerätemanager deaktiviert und aktiviert habe kann ich mich mit meiner Software wieder verbinden... Ist das ein bekanntes und im Idealfall gelöstes Problem? Habt ihr damit auch Probleme?
Grüße an alle Christian
|
|
« Letzte Änderung: Dezember 3, 2008, 19:10:18 von christian »
|
Gespeichert
|
|
|
|
Ast
Case-Konstrukteur

Karma: +8/-0
Offline
Geschlecht: 
Beiträge: 589

Astpirin, die Medizin deines Lebens
|
Also der Sourcecode, den ich hier habe lautet:
case cmdLCD_BG: if(data[2] != 0) PORTD |= (1 << 3); else PORTD &= ~(1 << 3); len = 1; break; Keine Ahnung, ob der vielleicht in der Datei auf Modding-FAQ.de fehlerhaft ist, oder wo hast du den her?
Mit irgendwelchen Stromsparmodi habe ich noch keine Erfahrungen gemacht und kann dir deshalb leider nicht sagen, ob das "normal" ist.
Was das Kompilieren der Firmware angeht:
Hast du die CPU-Frequenz auch auf 12 MHz gestellt? Ansonsten fällt mir gerade nichts ein, weshalb der Code bei dir anders kompilieren sollte als bei mir.
Ich hänge trotzdem einfach mal die Makefile, mit der die Firmware kompiliert wurde, an.
############################################################################### # Makefile for the project USB-LCD ###############################################################################
## General Flags PROJECT = USB-LCD MCU = attiny2313 TARGET = USB-LCD.elf CC = avr-gcc.exe
## Options common to compile, link and assembly rules COMMON = -mmcu=$(MCU)
## Compile options common for all C compilation units. CFLAGS = $(COMMON) CFLAGS += -Wall -gdwarf-2            -DF_CPU=12000000 -Os -fsigned-char CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d
## Assembly specific flags ASMFLAGS = $(COMMON) ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2
## Linker flags LDFLAGS = $(COMMON) LDFLAGS +=
## Intel Hex file production flags HEX_FLASH_FLAGS = -R .eeprom
HEX_EEPROM_FLAGS = -j .eeprom HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load" HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0
## Objects that must be built in order to link OBJECTS = main.o oddebug.o usbdrv.o usbdrvasm.o
## Objects explicitly added by the user LINKONLYOBJECTS =
## Build all: $(TARGET) USB-LCD.hex USB-LCD.eep size
## Compile usbdrvasm.o: ../usbdrvasm.S $(CC) $(INCLUDES) $(ASMFLAGS) -c $<
main.o: ../main.c $(CC) $(INCLUDES) $(CFLAGS) -c $<
oddebug.o: ../oddebug.c $(CC) $(INCLUDES) $(CFLAGS) -c $<
usbdrv.o: ../usbdrv.c $(CC) $(INCLUDES) $(CFLAGS) -c $<
##Link $(TARGET): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)
%.hex: $(TARGET) avr-objcopy -O ihex $(HEX_FLASH_FLAGS)Â $< $@
%.eep: $(TARGET) avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@
%.lss: $(TARGET) avr-objdump -h -S $< > $@
size: ${TARGET} @echo @avr-size -C --mcu=${MCU} ${TARGET}
## Clean target .PHONY: clean clean: -rm -rf $(OBJECTS) USB-LCD.elf dep/* USB-LCD.hex USB-LCD.eep
## Other dependencies -include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)
|
|
|
Gespeichert
|
There are only 10 types of people in the world: Those who understand binary, and those who don't. -------- How many people can read hex if only you and dead people can read hex?
|
|
|
christian
Modding-Noob

Karma: +0/-0
Offline
Beiträge: 6
Ich liebe dieses Forum!
|
Hallo Ast, danke schonmal für das makefile. Ich hab das jetzt mal damit ausprobiert, irgendwie läuft der zwar durch, aber wenn ich das hex-File flashe, dann ist das wohl etwas zu gross. Keine Ahnung, schade... Wegen den Pins, ich hab das nochmal neu heruntergeladen und da steht richtigerweise 3 drin statt 5. Evtl. hatte ich das schon geändert... Ich hab dann jetzt alles nochmal mit dem aktuellen Sourcen probiert, aber das geht auch nicht, ich bekomm das nicht richtig kompiliert scheinbar... Christian
|
|
« Letzte Änderung: Dezember 4, 2008, 13:47:02 von christian »
|
Gespeichert
|
|
|
|
Ast
Case-Konstrukteur

Karma: +8/-0
Offline
Geschlecht: 
Beiträge: 589

Astpirin, die Medizin deines Lebens
|
Das ist wirklich seltsam.
Anscheinend hat sich mit einer neueren Version irgendwas im avr-gcc geändert, denn wenn ich meinen code kompiliere komme ich auch auf über 2048 Byte.
Du kannst einige Byte einsparen, indem du in der usbconfig.h den DEVICE_NAME entfernst:
//#define USB_CFG_DEVICE_NAME 'U', 'S', 'B', 'L', 'C', 'D' //#define USB_CFG_DEVICE_NAME_LEN 6 /* Same as above for the device name. If you don't want a device name, undefine * the macros. */ Außerdem kannst du den VENDOR_NAME kürzen.
Und zu guter Letzt könntest du noch in der LCD_Init Funktion in main.c die doppelten _delay_us(50) durch ein _delay_ms(1) ersetzen, was zwar die Initialisierung des LCD minimal verlangsamen sollte, aber das macht ja wohl nichts.
|
|
|
Gespeichert
|
There are only 10 types of people in the world: Those who understand binary, and those who don't. -------- How many people can read hex if only you and dead people can read hex?
|
|
|
christian
Modding-Noob

Karma: +0/-0
Offline
Beiträge: 6
Ich liebe dieses Forum!
|
Hallo, ich habe es mittlerweile geschafft, die Sourcen zu kompilieren, allerdings wird das "USB-LCD" dann nicht erkannt sondern bleibt als "Unbekantes Gerät" im Gerätemanager stehen... Welche Kombination aus Sourcen und Compiler benutzt ihr? Christian
|
|
|
Gespeichert
|
|
|
|
|
christian
Modding-Noob

Karma: +0/-0
Offline
Beiträge: 6
Ich liebe dieses Forum!
|
Hallo Ast, also, ich habe das jetzt mal mit WinAVR 071221, 080610 und 081205 ausprobiert und nix hat geklappt. Wenn ich unter Windows XP SP3 in der Kommandozeile aus dem Verzeichnis /firmware/default den befehl "make" eingebe, erscheint folgende zusammenfassung:
AVR Memory Usage ---------------- Device: attiny2313
Program: 2064 bytes (100.8% Full) (.text + .data + .bootloader)
Data: 51 bytes (39.8% Full) (.data + .bss + .noinit)
100.8% ist ja wohl etwas zu viel. Woran kann das liegen?
Hat IRGENDWER die original Sourcen mit oder ohne AVR Studio und WinAVR kompiliert bekommen, so dass das LCD sich dann richtig anmeldet? Vielleicht liegt das irgendwie am WinAVR? Das ist ja fast verhext... Gruß Christian
|
|
|
Gespeichert
|
|
|
|
|
christian
Modding-Noob

Karma: +0/-0
Offline
Beiträge: 6
Ich liebe dieses Forum!
|
Hallo Ast, es ist vollbracht!!! Ich habe eine WinAVR Version 20060125 gefunden. Die habe ich installiert und den Sourcecode per Kommandozeile kompiliert und siehe da - es hat geklappt. Nun hat es mit ein paar kleinen Veränderungen wirklich geklappt, die Hintergrundbeleuchtung dimmbar zu machen. Dazu habe ich die Leitungen zu den Pins PD3 und PD5 getauscht. Im Code habe ich folgende Zeilen geändert (nur in der main.c):
... case cmdLCD_BG: OCR0B = data[2]; len = 1; break; ...
int main(void){
static LCD_Options_t LCD_Options; static char text[16]={66,66,105,116,116,101,32,119,97,114,116,101,110,46,46,46}; Â Â Â Â PORTB = 0xFF DDRB = 0xFF; PORTD = 0x00; DDRD = 0b01111000; TCCR0A = (1<<COM0B1) | (1<<COM0B0) | (1<<WGM00) | (1<<WGM01); TCCR0B = (1<<CS01) | (1<<CS00); OCR0B = 128; //Inital value for background LED
usbInit();
//my values for init the LCD automatically LCD_Options.lines = 1; LCD_Init(&LCD_Options, 1); LCD_Init(&LCD_Options, 2);
//Printing a welcome message LCD_Command(192+12,1); usbFunctionWrite(&text, 16);
sei(); for(; { /* main event loop */ usbPoll(); } return 0; }
Nun kann man mit dem Befehl USB_LCD_BL(value) einen Wert von 0-255 angeben, wobei 0=an , 255=aus ist. Diese Invertierung kommt durch den PWM mode. In der usbconfig.h musste ich die Zeilen //#define USB_CFG_VENDOR_NAME 'w', 'w', 'w', '.', 'm', 'o', 'd', 'd', 'i', 'n', 'g', '-', 'f', 'a', 'q', '.', 'd', 'e' //#define USB_CFG_VENDOR_NAME_LEN 18 ... //#define USB_CFG_DEVICE_NAME 'U', 'S', 'B', '-', 'c', 'L', 'C', 'D' //#define USB_CFG_DEVICE_NAME_LEN 7 auskommentieren, um Platz im Tiny zu bekommen. Vielen Dank für die Hilfen. Gruß Christian
|
|
|
Gespeichert
|
|
|
|
christian
Modding-Noob

Karma: +0/-0
Offline
Beiträge: 6
Ich liebe dieses Forum!
|
Hallo zusammen, ich bins nochmal. Ich habe eine weitere Frage/Problem: Wenn ich meinen Rechner in den Hibernate- oder Standby-Zustand versetze und ihn danach wieder aufwecke, bekomme ich mit der USB-LCD-Dll keine Verbindung mehr. Ich bekomme dann als result immer nur eine 0 zurück... Ich habe mir mal die Sources der DLL und des libusb-Treibers angesehen, muss aber gestehen, das ist mir dann doch etwas zu kompliziert. Hat vielleicht irgendwer ähnliche Probleme? Da sich mein LCD ja jetzt nach einem Powerdown (Hibernate) selber initialisiert, bräuchte ich eigentlich nur wieder eine Verbindung zum libusb-Treiber zu bekommen, damit ich dann wieder Befehle an den Tiny schicken kann. Oder sehe ich das falsch? Kann ich da was debuggen oder "von Hand" testen? Hat irgendwer eine Idee? Wen könnte ich kontaktieren? Grüße Christian
|
|
|
Gespeichert
|
|
|
|
|
Router
Gast
|
Hi all!
Ich bin Ungarn. Ich spreche nur ein kleines bisschen auf Deutsch. (Entschuldigung!) 
Ich habe USB-LCD lowcost edition gebaut. Der Apparat ist sehr toll mit 4*20 LCD und LCD Smartie mit HD44780usb.dll+ USB_LCD.dll.
Ich würde es gern verwenden mit 4*40 LCD.
Was ist es notwendig zu modifizieren in USB_LCD.dll? ---> Ich verstehe es nicht. 
Ich hoffe darauf ich war verständlich...
|
|
|
Gespeichert
|
|
|
|
|
|