Start

Förstasidan
Statistik

Social robot

Robotens syn
Modell/simulator
Levande modell


Arduino

Starta upp Arduino
DCcduino UNO
Pro Mini

Raspberry pi

Om Raspberry

Pic32

Om Pic32
Konstruktionen
Praktisk kom-igång
Starta upp UBW32
Installera MPLAB
Rinnande ljus
Stegmotor
Display
RS232 Pic32 - terminal
Luffarschack

Servo

Överblick
Isärmonterat servo
Styrning av servo
Mini Maestro
Bygga ett servo

Elektronik

Open Collector
Kontaktstuds
Drivsteg på utgångarna
Halleffektsensor/switch
MLX90316 (halleffekt)
Pulsbreddsmodulering

Open CV

Om OpenCV

Matematik

Linjär algebra
Olinjär länkmekanism

Display med seriell kommunikation
Feedback (debug m.m.)
Det finns några lysdioder på UBW32 -kretskortet. Det är väldigt bra eftersom man då kan få lite feedback om programmet snurrar eller inte. Lysdioderna är ett koncept som säkert går att utveckla. Man kan fixa så att lysdioderna blinkar eller rinner eller gör något annat om man har behov av mer avancerad kommunikation. Men lamporna har sina semantiska begränsningar. Det går inte att testköra ett avancerat program på flera tusen rader med 4 lysdioder som feedback på funktionen.

display med seriellt gränssnittMan behöver något mer avancerat. Åtminståne en display. Idealfallet är minimalt med kod i UBW32 och minimalt med anslutningar. Här kommer serie-interface't in i bilden.

Det finns en hel del "intelligenta displayer" där ute. Det kallas så därför att de har en processor ombord med teckengenerator och oftast någon enkel kommunikation med omvärlden, t.ex. ett serieinterface.

teckentabell
Parallax seriell display
Jag snubblade över en billig och käck display från parallax. Displayen har en inbyggd teckengenerator och kan med en enkel tråd anslutas till vilken serie-port som helst.

Teckenuppsättning
Displayen saknar svenska tecken ÅÄÖ åäö så dessa måste man lägga till själv. Det är möjligt att koda in 9 egna tecken i displayen och det räcker ju för de svenska tecknen. På datorsidan måste man då läsa igenom texten man skickar till displayen och ersätta de svenska bokstäverna med de koder man använt för respektive svensk bokstav.

Anslutning
Anslutningen blir enklast möjliga (en tråd + spänning till displayen) och det är ingenting förutom hastigheten på serietråden som behöver justeras. Jag sätter denna hastighet till 19200 på displayen. Det gör man med dip-switcharna på baksidan av displayen. På baksidan finns även anslutningarna till displayen, bara 3 stycken trådar här som behövs. Spänning (5 volt) samt serietråden. anslutning parallax intelligent display
På UBW32 anluter man TX till displayens RX. Dvs, Pic32'an skickar (TX) och displayen tar emot (RX). Display'en skickar inte tillbaka något så det är bara serie-tråden med information till display'en som är intressant. Vad är det man skickar till displayen? Med seriekommunikation menar man om inget annat sägs, RS232.

RS232 i ett nötskal [1]
Elektrisk kodas 1 som en spänning mindre än -3 volt och 0 motsvarande över 3 volt, alltså omvänt vad som är intutivt. Spänningen tillåts variera mellan 3 och 15 volt.

RS232
Det är sedan lite flexibelt vad det är som överförs. Det viktiga är att sändaren och mottagaren är överens om hur det fungerar, dvs om man använder 5,6,7 bitar eller 8 bitar, 1 eller 2 stopbitar, om man använder paritet eller inte och inte minst vilken hastighet det överförs med. Hastigheten brukar mätas i baud.

Konfigurering av Pic32'an UART
Ur manualen för UART sidan 26:
U1BRG = BaudRate;	// Set Baud rate
U1STA = 0;
U1MODE = 0x8000;	// Enable UART for 8-bit data
			// no parity, 1 Stop bit
U1STASET = 0x1400;	// Enable Transmit and Receive
I koden sätter jag dock U1MODE = 0x8008 vilket beror på att jag vill sätta BRGH=1 så att jag får nedanstående ekvation för baudrate'n vilket leder in på det lite klurigare momentet. Det är mycket viktigt att denna hastighet blir rätt. Nu vill jag ha 19200 baud's hastighet eftersom det är den jag ställt in på displayens baksida.
räkna ut baudrate för seriekommunikation
Variabeln FPB här ovan är 80 MHz för 795-varianten av Pic32'an. Det är alltså mer än dubbelt så högt som tidigare varianter vilket kan vara bra att veta eftersom de flesta böcker därför innehåller exempelkod som inte kommer fungera på 795'an.
räkna ut baudrate för seriekommunikation
Sätter man in siffrorna får man siffran 1041 som alltså skall in i Pic32'ans UART. Då kommer man så nära 19200 baud som är möjligt.

Kod
/********************************************************************
Seriedisplay på UBW32 80 MHz 19200 baud     http://www.robotsteel.com
********************************************************************/

#include "plib.h"
#include "HardwareProfile.h"

#define SYS_FREQ 	(80000000L)
#define BRATE	1041

void initU2(void)
{
	int x;
	U2BRG=BRATE;
	U2STA=0;
	U2MODE=0x8008;	 // init UART 
	U2STASET=0x1400; // enable transmitter
	putU2(0);
	for(x=0;x<10000;x++) ;
}

int putU2(int c)
{
	int x;
	if(c =='Å'){c='A';}
	if(c =='Ä'){c='A';}
	if(c =='Ö'){c='O';}
	if(c =='å'){c='a';}
	if(c =='ä'){c='a';}
	if(c =='ö'){c='o';}
	while(U2STAbits.UTXBF) ;
	U2TXREG=c;
	return c;
}

int putU2S(char *s)
{
	while(*s)
	{
		putU2(*s++);
	}
	putU2S("\r\n");
}

int main(void)
{   
	SYSTEMConfigPerformance(80000000L);
 	mJTAGPortEnable(0);
	initU2();
	putU2S("ABCDEFGHIJKLMNOPQRSTUVXYZÅÄÖ");
}

Om du exprimenterar med sådant här och saknar en logikanalysator, skaffa genast en sådan. Det reducerar helt påtagligt tiden att hitta fel och ökar förståelsen dramatiskt. En logikanalysator är ett MÅSTE. Jag använder en Saleae. Den kostade under tusenlappen på Lawicel. I den finns en smart funktion som inte bara kan läsa dina signaler utan också översätta signalen till tecken.

inställningar logikanalysator
Om man t.ex. hackat ihop en kod som ovanstående och det inte fungerar, då kan man enkelt t.ex. kontrollera att 1) man får ut en signal på serietråden överhuvudtaget och 2) vilken baudrate signalen har och 3) om den är begripbar.

obegripligt på serieporten
Om man skickar ut "ABCDEFG...." och kan läsa av ovanstående så har något gått fel. Felkällorna är oftast följande 2. Det första man skall kontrollera är att baudraten är den önskvärda. Det andra som kan strula till sig är start-tecknet. Det beror lite på hur det är implementerat på mottagarsidan.

seriekommunikation med sync i början

Så här ser det ut när allting fungerar. Det jag gjorde för att få det att fungera var att i initU2() skicka ut ett tecken (noll) och sedan vänta lite. Studera loopen i initU2. Kanske ingen jättebra lösning och ifall man optimerar koden kommer sannolikt denna loop trollas bort.

seriekommunikation bokstaven E


uppkoppling seriell display

Minimalt med anslutningar!





Robot och elektronik -sidan byter namn till electro.st

Senast läst 12:22:04 19/7 2017 Texten uppdaterad 17/9 2014
footer sign