Sida 1 av 1

Enkel USB-ansluten display #2

Postat: 22 mars 2008, 16:35:26
av thepirateboy
För att visa att det finns fler sätt att styra en standard LCD via USB än detta så är det här ett litet projekt med en billig AVR.

Syftet med detta projekt var att se hur mycket jobb det var att kunna styra nånting via USB
utan att använda en FT232R eller liknande. Lämpligt testobjekt blev en 4x20 standard LCD.
Kan man styra den kan man förstås kontrollera något annat t ex reläer eller vad det nu är man vill styra.

Atmel har en liten krets, AT90USB162 som kostar 4,19 USD/styck på Digikey.
Datablad AT90USB162

Lawicel har ett kort som kostar 250 + moms med denna krets och kortet är tillverkat av Olimex http://www.olimex.com/dev/avr-usb-162.html

Kretsen kommer förprogrammerad med en bootloader vilket gör att man inte behöver någon programmerare,
mycket smidigt! Bootloader aktiveras genom att man håller ner en knapp vid uppstart. När detta är gjort
måste en drivrutin installeras på PC:n. Efter detta använder man FLIP från Atmel för att progga kretsen
med sin applikation.

Bild

Programmering tar ca 1,5 sekunder vid 5kB. Det gör förstås att progga kretsen på
vanligt vis med ISP. Det finns även stöd för bugwire.

Atmel har exempelkod till sitt utvecklingskort STK526 som till vissa delar även fungerar med Olimex-kortet.STK526

Jag har använt koden CDC Virtual Com Port Project, den skapar precis som FT232R en virtuell comport.
Programexempel

Koden från Atmel en riktig griskod enligt mitt tycke. Onödigt många defines gör koden
onödigt svåröverskådlig. Efter att ha rensat bland filerna och skapat ett nytt projekt i Eclipse
lyckades jag se var saker och ting initialiserades. Jag la till två filer som jag själv gjort,
rutiner för lcd-utskrifter.

Displayen kopplades in på PORTB. När initieringen fungerade var det bara att "redirecta" data som skickades
från den virtuella comporten i PC:n till LCD-displayen istället för till uarten på AT90USB192 som den normalt
skickas till.

Simpel förändring av befintlig kod:

Kod: Markera allt

if (Uart_tx_ready())    //USART free ?
      {
         if (uart_usb_test_hit())   // Something received from the USB ?
	      {
	 	      while (rx_counter)
		      {
			      //uart_putchar(uart_usb_getchar());   // loop back USB to USART
			      lcd_put_char(uart_usb_getchar());
			      //Led3_toggle();
		      }
	      }
      }
uart_putchar är bortkommenterad och ersatt av min egen rutin lcd_put_char

Det återstår förstås mycket för att kunna välja rad, rensa display och såna saker,
men syftet med detta projekt var att se hur mycket jobb det var att få igång
någon form av USB-kommunikation. Efter ytterliggare några små programförändringar
och ett litet testprogram i Microsoft VS C# blev resultatet detta.


Bild


Bild

Ett par dagar tog det att få detta att fungera och då har jag "fuskat" och inte läst
en enda rad datablad och inte läst speciellt mycket om kodstrukturen hos programexemplen.

Postat: 22 mars 2008, 18:18:25
av peter555
Intressant, det verkar vara dags att man ger sig på något sånt här och provar. :tumupp:

Postat: 23 mars 2008, 02:48:58
av cykze
Tack för infon! Jag ska väl också ta och kolla på det här någon gång. :)

Postat: 23 mars 2008, 11:29:18
av $tiff
Funderat på att använda ful-varianten av USB-stöd för AVR, för att slippa specialkretsarna?
http://www.obdev.at/products/avrusb/index.html
Hastighetskravet är ju inte direkt substantiellt.

Postat: 23 mars 2008, 11:52:54
av thepirateboy
Jo, men samtidigt känns det lite mer seriöst att använda en krets som är avsedd för USB. Nackdelen med AT90USB162 är att den saknar en del finesser såsom AD-omvandlare.
Det kommer dock nya USB-kretsar från Atmel med AD och lite annat lull-lull.

Postat: 23 mars 2008, 13:38:49
av cykze
Obdev är väldigt enkelt att få igång och går att köra på nästan vilken AVR som helst. Men så har den två jobbiga krav. Nämligen att man måste anropa usbPoll() minst var 50:e ms och att interrupts inte får vara inaktiverat globalt i mer än någon enstaka klockcykel (hittar inte exakt hur många). Så vill man köra med interrupts så måste interruptrutinerna köras med interupts aktiverade, vilket kan ställa till med problem.

Postat: 27 mars 2008, 10:34:42
av PHermansson
Kul att se fler varianter :)
Billig krets också, även om den är lite begränsad. Finns den att köpa i Sverige? Blev lite glad när jag såg 'min' PIC18F2550 hos Kjell.

Postat: 27 mars 2008, 17:37:03
av thepirateboy
Tror inte den finns att köpa i Sverige förutom hos "grossisterna", tyvärr. Den kanske kommer in hos Lawicel eller ELFA så småningom. Gjorde en snabb jämförelse mellan 18F2550 och AT90USB162 och fördelen med AVR:n verkar vara den förproggade bootloadern. I övrigt verkar 18F2550 ha bättre data på det mesta.

Postat: 28 mars 2008, 11:44:14
av PHermansson
Ok lika obra som vanligt då... man hittar bra kretsar men ingen enkel möjlighet att köpa dem. Och frågan är vad de skulle kosta?
Men att få in en bootloader i en 2550 är inte särskilt svårt, så jag nöjer mig med den, även om den är lite dyr.