Opdracht2
Bij deze opdracht worden verschillende taken gemaakt . De taken communiceren onderling met elkaar via een message queue of synchroniseren met elkaar via semaforen.
A: Maak een taak aan die de bluetooth communicatie tussen de PC en het stk501 boordje regelt. Hoe de verbinding tot stand kan komen wordt in de bijlage beschreven. Denk hierbij dat de ingestelde baudrate traag is. B: Zorg ervoor dat wanneer op de PC 0a wordt ingetypt het eerste ledje aangaat, bij het intypen van 0u het eerste ledje uit gaat. Bij het intypen van 1a het tweede ledje aangaat,enz... C: Maak een 2e taak aan die de communicatie met de PC regelt. De onderlinge communicatie tussen de taken (communicatie naar PC en een taak voor het aansturen van een led) gebeurt via een message queue.
Seriële bluetooth verbinding ATmega128
Bluetooth Installatie
RS232 ● ● ●
Verbind de (BLUEMAX05) RS232 bluetooth module met de PC Sluit de bijbehorende adapter aan, en stel de schakelaar in op adapter. De groene LED zou nu moeten branden.
USB ● ● ● ●
Verbind de (BLUEMAX15) USB bluetooth module met de PC. Er verschijnt een hardware-installatie venster, laat deze de drivers installeren via Windows Update. Nu is de USB module geïnstalleerd en geregistreerd op een COM port (COM3). De LED op de USB bluetooth module zou nu moeten knipperen of branden.
STK501 bord
RS232
Bluetooth adapter
Bluetooth adapter RS232
PC
Configuratie RS232 ● ● ● ● ●
● ●
● ●
Stel de RS232 module in op configuratie door de CFG knop naast de adapter-poort in te drukken. Hierdoor gaat de gele LED branden, de module bevindt zich nu in configuratie mode. Open het bijgeleverde configuratie-programma BT232Config(v1.71).exe Stel de COM Port in op de COM poort van de RS232 bluetooh module (COM1) en gebruik Baud Rate 115200. Klik op Connect om de configuratie in te zien. Als de RS232 bluetooth module verbonden is, is onderin het venster het MAC adres en de firmware versie van de module te vinden. Noteer dit MAC adres, dit is later nodig. In de configuratie zijn de volgende categorieën te vinden: ○ Role: De instellingen voor keuze master/slave ○ Security: De Pin Code voor veilige verbinding ○ Uart Configure: De instellingen die de module gebruikt voor aansturing via RS232 ○ Local Device Name: De naam van de module Om instellingen te wijzigen: klik op de Save knop De geadviseerde configuratie voor deze module zijn als volgt: ○ Role: Slave (Optioneel kan bij Remote BD address ook het MAC adres van de Master opgegeven worden, de Slave zal dan alleen met dit MAC adres verbinden) ○ Security: Aangevinkt met PIN Code 1234 ○ Uart Configure: Baud Rate: 9600 Stop Bit: 1 Parity Bit: Even ○ Local Device Name: RS232 Zodra de configuratie ingesteld is, klik op Disconnect. Druk vervolgens de CFG knop op de module weer in om uit de configuratie mode te gaan. De gele LED gaat hierdoor uit.
USB ● ● ● ● ● ●
● ●
Installeer het EikonAT Setup programma. Start het EikonAT Setup programma en selecteer de juiste COM poort voor de USB bluetooth module. Druk op de grijze knop op de USB bluetooth module. De module is nu gedurende 2 seconden gereed een verbinding van het EikonAT Setup programma te accepteren. Klik nu binnen 2 seconden op Connect om te verbinden met de USB bluetooth module. Stel de USB bluetooth module in als Master, en laat deze verbinden naar het MAC adres van de RS232 module Stel de instellingen van de seriële verbinding als volgt in: Baud Rate: 9600 Stop Bit: 1 Parity Bit: Even Klik op Save setting om de instellingen op te slaan. Klik op Disconnect om de verbinding te verbreken.
Er zou nu verbinding moeten zijn tussen de RS232 bluetooth module en de USB bluetooth module. Als de USB bluetooth module verbinding heeft brand de rode LED constant. Als de RS232 bluetooth module verbinding heeft brand de blauwe bluetooth LED constant. (Als deze verbinding er inderdaad is, kan deze worden getest met behulp van Putty) (De bluetooth modules kunnen alleen een verbinding van 1 op 1 tot stand brengen) (Let op dat bij gebruik van de bluetooth modules alleen gebruik gemaakt kan worden van 8 databits)
Verbinding seriële poort Om gebruik te kunnen maken van de tweede seriële poort voor datacommunicatie, is een fysieke verbinding op de STK500 / STK501 nodig.
STK501 (RS232 SPARE #2) Bij gebruik van de STK500 met STK501 is een verbinding nodig tussen twee pinnen van de ATmega128 microcontroller en de RS232 SPARE #2 pinnen: De juiste pinnen zijn te vinden in de documentatie van de ATmega128 in fig. 1 op pagina 2. Hierop is te lezen dat de juiste pinnen voor RXD1 en TXD1 de pinnen PD2 en PD3 zijn. (RXD1 en TXD1 zijn de Receive en Transmit registers van USART1 van de ATmega128) Verbind de stekker tussen PD2 en de RXD en tussen PD3 en TXD.
#include <stdio.h> #include <windows.h> HANDLE InitCom() { DCB dcb; HANDLE hCom; BOOL fSuccess; hCom = CreateFile("COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hCom == INVALID_HANDLE_VALUE) { MessageBox(0, "Fout: De seriële poort kan niet geopend worden!", "Fout", MB_OK| MB_ICONEXCLAMATION); exit(-1); } fSuccess = GetCommState(hCom, &dcb); if (!fSuccess) { MessageBox(0, "Fout: De instellingen van de seriële poort kunnen niet gelezen worden!", "Fout", MB_OK|MB_ICONEXCLAMATION); exit(-1); } dcb.fParity = TRUE; dcb.BaudRate = CBR_9600; // Baud Rate: 9600 dcb.ByteSize = 8; // Data bits: 8 dcb.Parity = EVENPARITY; // Parity: Even dcb.StopBits = ONESTOPBIT; // Stop bits: 1 dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fDsrSensitivity = FALSE; dcb.fOutX = FALSE; dcb.fInX = FALSE; dcb.fRtsControl = RTS_CONTROL_DISABLE; fSuccess = SetCommState(hCom, &dcb); if (!fSuccess) { MessageBox(0, "Fout: De instellingen van de seriële poort kunnen niet aangepast worden!", "Fout", MB_OK|MB_ICONEXCLAMATION); exit(-1); } return hCom; } char ReadCom(HANDLE hCom) { char inBuffer[2]=" "; unsigned long nBytesRead; ReadFile(hCom, &inBuffer, 1, &nBytesRead, NULL); if (nBytesRead!=1) { MessageBox(0, "Fout: De seriële poort kan niet uitgelezen worden!", "Fout", MB_OK| MB_ICONEXCLAMATION); exit(-1); } return inBuffer[0]; } void WriteCom(HANDLE hCom, char c) { char outBuffer[2]=" "; unsigned long nBytesWritten; outBuffer[0]=c; WriteFile(hCom, &outBuffer, 1, &nBytesWritten, NULL); if (nBytesWritten!=1) { MessageBox(0, "Fout: De seriële poort kan niet beschreven worden!", "Fout", MB_OK| MB_ICONEXCLAMATION); exit(-1); } }
int main() { HANDLE hCom; char in; hCom = InitCom(); // Openen COM-poort printf("Er wordt nu een S verstuurd.\n"); WriteCom(hCom, 'S'); // Schrijven character 'S' naar COM-poort printf("Ontvangen karakters worden op het scherm gezet totdat een Q wordt ontvangen.\n"); do { in = ReadCom(hCom); // Lezen van COM-poort if (in!='Q') { putchar(in); } } while (in!='Q'); // Tot er een 'Q' verstuurd wordt CloseHandle(hCom); // Sluiten COM-poort printf("\nEINDE.\n"); getchar(); return 0; }
Code voor Windows