Stap 5: Inzicht in de code van de USB-
Dit is waar de pret begint!Als u dit hebt komt veel, moet je een scherm dat "weergeven geïnitialiseerd zegt" wanneer u stroom van het apparaat.
Als u het al hebt gedaan, download de broncode gekoppeld aan dit instructable, en we hebben een dichtere blik op hoe de AVR met het beeldscherm en de computer communiceert.
Als u nog nooit hebt gewerkt met V-USB vóór, het zou erg verwarrend op het eerste. Het was in ieder geval voor mij. Scroll naar beneden naar de usbFunctionSetup functie en we hebben een kijkje op hoe het eigenlijk werkt. Het gaat om de enige functie die u wilt bewerken naast de hoofdfunctie schelen.
usbFunctionSetup is de functie waar u het verwerken van alle gegevens die ik naar de microcontroller via USB stuurde. Als u merkt dat de als-instructies, controleer ze allemaal naar een specifiek nummer op de rq -> bRequest -variabele. Deze i waar de verzoek-codes worden opgeslagen. U kunt denken aan verzoek codes als opdrachten. Op de hostsoftware, hebben we een functie als volgt: SendData (int verzoek, gegevens), de waarde die je in de parameter van het verzoek zal worden overgebracht naar de microcontroller en opgeslagen in de rq -> bRequest-variabele, en kunt u deze code verzoek doen verschillende dingen in de usbFunctionSetup.
Ik heb alleen 6 verzoek codes, maar als je wilt om een 7e code gewoon aanvragen typt u dit in ergens in de usbFunctionSetup functie:
Als de aanvraag 7 is
als (rq -> bRequest == 7) {/ / opdracht 7 - SEND_MYCOMMAND
Doen mijn code
}
Als u nu de SendData functie als volgt oproepen: SendData (7, 0);
De instructie als die u zojuist hebt gemaakt, wordt uitgevoerd.
De 2e parameter in de functie SendData is de feitelijke gegevens die u naar de microcontroller verzendt. Dit nummer wordt opgeslagen in struct rq -> wValue . Dit is een woord (2 bytes), maar als alleen u hier gebruik van 1 van de 2 bytes opgeslagen wilt, kunt u dat doen met behulp van de matrix van bytes, zoals dit: rq -> wValue.bytes[0]. Als u gebruiken van het hele woord willen zou, kunt u het als volgt: rq -> wValue.word. Merk op dat u een unsigned int gebruiken moet als u wilt gebruiken het hele woord.
U moet geavanceerde functies die een lange tijd om te doen buiten de usbFunctionSetup functie zetten, en in plaats daarvan laat de hoofdlus uit te voeren. Als u ze in de usbFunctionSetup hebben en ze een lange tijd te voltooien (50 MS) gebruiken, verliest u mogelijk de USB-verbinding met de computer. Ik wilde hebben ze in de usbFunctionSetup omdat wegschrijven naar het display is veel sneller dan de USB (In feite, we schrijven een stabiele 1, 33Mbit/s tot de weergave en de weergave ondersteunt maximaal 4Mbits/s) dus ik niet de verbinding riskeert door het te lang duurt.
De rest van de code moet worden besproken genoeg voor u om te begrijpen. Als iets onduidelijk is, laat het me weten en ik zal proberen om dingen voor u duidelijk.