PIC, Sätta TXREG med char

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Abets
Inlägg: 7
Blev medlem: 8 juni 2011, 10:19:06

PIC, Sätta TXREG med char

Inlägg av Abets »

Nybörjar med PIC behöver lite hjälp.

Sitter på en EasyPic6 med PIC18f4520 och använder kompilatorn CC8.

Jag försöker göra en funktion som skickar en byte data till PCns serieport.

Kod: Markera allt

void SendChar(uns8 c)
{
	while( ! TXIF ) ;
	TXREG = c;
}
Denna anropar jag med

Kod: Markera allt

SendChar('a');
Detta fungerar inte. På TX-pinnen skickar den endast en nolla - oavsett argument. TXREG får alltså ett värde(men någonstans blir det galet).
Om jag däremot sätter TXREG direkt med en konstant så fungerar det:

Kod: Markera allt

TXREG =  'a';
Vad är det som jag missar?
Användarvisningsbild
Icecap
Inlägg: 26655
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC, Sätta TXREG med char

Inlägg av Icecap »

Blir lite osäker på vad du menar.

Kod: Markera allt

void SendChar(uns8 c)
  {
  while(!TXIF);
  TXREG = c;
  }
Fungerar inte skriver du men det som fungerar, ser det ut som följer?

Kod: Markera allt

void SendChar(uns8 c)
  {
  while(!TXIF);
  TXREG = 'a';
  }
Om det är så kan det vara för att den uppfattar c på fel sätt (har aldrig använd CC8) och du kan testa:

Kod: Markera allt

void SendChar(char c)
  {
  while(!TXIF);
  TXREG = c;
  }

Eller kanske:
void SendChar(unsigned short c)
  {
  while(!TXIF);
  TXREG = c;
  }
Det sista sättet deklarerar c till samma typ som TXREG. Jag skulle tro att compilern "tror" att värdeskillnaden gör att det är ett 16-bit värde som ska skrivas ut och då skickar den bara inledande 0x00.

EDIT: kom på ett mer tydligt sätt kanske:

Kod: Markera allt

void SendChar(char c)
  {
  while(!TXIF);
  TXREG = (unsigned short)c;
  }
Detta cast'ar c till att vara rätt typ när den skickas till TXREG men "utåt" är det en char.
Användarvisningsbild
swesysmgr
Inlägg: 14961
Blev medlem: 28 mars 2009, 06:56:43
Ort: Göteborg

Re: PIC, Sätta TXREG med char

Inlägg av swesysmgr »

Du måste sätta upp TX/RX-pinnarnas TRIS register först så att din PIC vet om att de skall användas som ut/ingångar.

Du behöver även konfigurera din serieports baudrate och sätta (fritt ur minnet) TXEN och SPEN för att aktivera sändning och serieportsfunktionen.

PIC har även en miljard olika analoga funktioner multiplexade på pinnarna, stäng av komparatorer och annat som delar port med de du skall använda först.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC, Sätta TXREG med char

Inlägg av sodjan »

> Jag försöker göra en funktion som skickar en byte data till PCns serieport.....

Visa inte enbart lösryckta delar, visa *HELA* ditt testprogram.
Det finns (som swesysmgr påpekar) en hel del annat som kan störa,
och det finns ingen anledning att vi ska fråga om varje detalj.
Visa hela ditt testprogram så framgår det troligtsvis...
Användarvisningsbild
Icecap
Inlägg: 26655
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC, Sätta TXREG med char

Inlägg av Icecap »

När TXREG = 'a'; fungerar är resten ganska säkert ställd upp korrekt!
Abets
Inlägg: 7
Blev medlem: 8 juni 2011, 10:19:06

Re: PIC, Sätta TXREG med char

Inlägg av Abets »

Det fungerar att sätta TXREG='a'. Så jag antog att det var rätt inställt.

Skalade av lite. Problemet är det samma:

Kod: Markera allt

#include "18F4520.h"
#include "INT18XXX.H"

void main() 
{
	OSCCON = 0b01000011; //1MHz
	
	TRISC = 0b11000000; 	//RX & TX =  inputs for serial communication
	PORTC = 0x00;

	TRISB = 0x00;
	PORTB = 0x00;
	
	SPBRG = 25; //---9600 Baud rate---
	SPBRGH = 0;
	BRGH = 1;	//High baudrate select bit (Asynch: 1= High speed, 0 = Low Speed)    
	BRG16 = 1;	//16-bit baud rate register enable bit (1= 16-bit, 0 = 8-bit)
	SYNC = 0;	//EUSART Mode Select bit (1 = Synchronous, 0 = Async)
	SPEN = 1;	//Serial port enable bit
	
	TXEN = 1;  //Transmit enable bit
	
	clearRAM();
	
	char a = 'a';
	TXREG = a;
	
	while(1) ;
	
}
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: PIC, Sätta TXREG med char

Inlägg av bearing »

Hur ser genererade assemblerkoden ut kring raden TXREG = a; ?
Abets
Inlägg: 7
Blev medlem: 8 juni 2011, 10:19:06

Re: PIC, Sätta TXREG med char

Inlägg av Abets »

Kod: Markera allt

00002E 0E61		00076 		MOVLW 97
000030 6E00		00077 		MOVWF a,0
				00078 		;	TXREG = a;
000032 C000 FFAD  	00079 		MOVFF a,TXREG
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: PIC, Sätta TXREG med char

Inlägg av bearing »

Ser ju inte ut att vara något fel i koden. Mätfel?

EDIT: vad gör clearram, och vad menar du med att det "funkar" att sätta TXREG = 'a'?
Senast redigerad av bearing 8 juni 2011, 15:30:45, redigerad totalt 1 gång.
JustNeed
Inlägg: 799
Blev medlem: 7 november 2007, 22:07:01
Ort: 08

Re: PIC, Sätta TXREG med char

Inlägg av JustNeed »

Har du testat det som Icecap skrev?

Fungerar nedanstående?

Kod: Markera allt

void SendChar(uns8 c)
  {
  while(!TXIF);
  TXREG = 'a';
  }
Edit: Vet du om den kör igenom SendChar överhuvudtaget?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC, Sätta TXREG med char

Inlägg av sodjan »

Prova med ett annan (bättre) variabelnamn än "a".
T.ex :

char char_to_send = 'a';
TXREG = char_to_send;

Om *det* fungerar så får du frågan om varför som hemläxa...
Abets
Inlägg: 7
Blev medlem: 8 juni 2011, 10:19:06

Re: PIC, Sätta TXREG med char

Inlägg av Abets »

bearing,
Hur menar du med mätfel?

clearRAM förjer med kompilatorn.
The internal function clearRAM() will set all RAM locations to zero. The generated code uses the FSR0 register.
När det funkar att sätta TXREG = 'a', så menar jag att jag får ut ett "a" i hyperteminalen.

JustNeed,
Ja. Det fungerar. SendChar anropas, men det har egentligen inte någonting med problemet att göra. Problemet ligger någonstans i att ange ett variabelt värde till TXREG.

sodjan,
Jag har kört runt med de flesta variabler. Det slutade med a, av ren lathet (bara för att det är kort). Jag tar det ändå som hemläxa att ta reda på varför.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC, Sätta TXREG med char

Inlägg av sodjan »

Från din ASM kod :

MOVWF a,0
MOVFF a,TXREG

Har du någon assembler lista som visar vad symbolen "a" har för värde ?
Finns "a" definierat i någon av de två .h filerna ?

(Ledtråd: Detta *kan* vara ett problem just för att det är en PIC18, det
*borde* inte vara ett problem på en PIC16...)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC, Sätta TXREG med char

Inlägg av sodjan »

> Problemet ligger någonstans i att ange ett variabelt värde till TXREG.

Jaha, och vad är skillnaden då ?
D.v.s i den genererad ASM koden ?
Felsökning kurs 1A... :-)

> Jag har kört runt med de flesta variabler.

Varför det ? Hur skulle *det* kunna hjälpa ?

> av ren lathet

Right, just *det* kan jag garantera är något som aldrig hjälper.
Abets
Inlägg: 7
Blev medlem: 8 juni 2011, 10:19:06

Re: PIC, Sätta TXREG med char

Inlägg av Abets »

00002E 0E61 00076 MOVLW 97
000030 6E00 00077 MOVWF a,0
00078 ; TXREG = a;
000032 C000 FFAD 00079 MOVFF a,TXREG
Denna kod genereras ju.
Sätter 97 som värde på a. Det finns inte någon symbol "a" i någon av .h filerna.

a får värdet som jag anger.
Testade med koden nedan
if(a == 'a') TXREG = 'a';
Skriv svar