Sida 1 av 1
USART
Postat: 20 maj 2007, 00:07:46
av xezer
Försöker skicka lite data med USARTen men det vill sig inte riktigt
När jag skickar till PCn så får jag bara en massa lustiga tecken.
Något spontant fel eller något jag glömt?
Och ja, jag har rätt baudhastighet.
Kod: Markera allt
void InitUsart(){
TRISC = 0x00;
TRISC.F7 = 1; //RX
TXSTA = 0x00;
RCSTA.F7 = 1; //SPEN
SPBRG = 129; //2.4k Baud
}
void UsartSend(char* data){
int i = 0;
TXSTA.TXEN = 1;
//startar uarten
while(data[i])
{
TXREG = data[i++]; //skickar innehållet
while (TXSTA.TRMT == 0)
{}
}
TXSTA.TXEN =0; //stänger uarten
}
void main(){
InitUsart();
UsartSend("testar");
while(1){
}
}
Postat: 20 maj 2007, 00:44:40
av oJsan
Nivåkonvertering är rätt kopplat? Rätt inställda start/stoppbitar och ordlängd? Får du alltid samma skräp? Ändras skräpet om du skickar andra textsträngar? Skicka ett känt mönster och se hur det beter sig, tex 0x55 eller 0xAA
Postat: 20 maj 2007, 00:58:55
av xezer
Nivåkonvertering?
Kopplingen är det inget fel på, det fungerar med ett program jag skrev i assember, men nu när jag gav mig på C så gick det inget vidare.
Jag får olika skräp beroende på vilken textsträng jag skickar. Det är som att den bara byter ut tecken :/
Postat: 20 maj 2007, 01:47:13
av Micke_s
ÄR du säker att 129 ger lämplig baudrate??
jag brukar vänta på att TXIF flaggan är clearad också.
Varför slår du på och av TX delen??
Postat: 20 maj 2007, 11:42:20
av xezer
Micke_s:
129 ska vara 2.4k baudrate på 20MHz utan BRGH satt, om jag förstått det rätt.
Nu väntar jag på TXIF också, om jag gjort det rätt.
Och tja, varför jag sätter på och stänger av TXen har jag inget bra svar på..
Sådär, nu börjar det bli något även av det här
Ända problemet är att den inte sänder de 3-6 första tecknena
Antalet tecken den inte sänder ut varierar på vilken sträng jag skickar med, men är alltid samma till antal i samma sträng.
Såhär ser det ut nu,
Kod: Markera allt
void InitUsart(){
TRISC = 0x00;
TRISC.F7 = 1; //RX
TXSTA = 0x00;
TXSTA.TXEN = 1; //Sätter på TXen
RCSTA.F7 = 1; //SPEN
SPBRG = 32; //9.6k Baud
}
void UsartSend(char* data){
int i = 0;
while(data[i])
{
while(PIR1.TXIF == 0){} //Väntar på TXIF
TXREG = data[i++]; //skickar innehållet
while (TXSTA.TRMT == 0)
{}
}
}
void main(){
InitUsart();
UsartSend(" ABCDE CCC Marcus Testar lite");
while(1){
}
}
Postat: 20 maj 2007, 12:56:59
av Micke_s
Hur har du ställt BAUDCON ?
Sedan skulle jag rekomendera BRGH = 1, BRG16=1 och baudrate registret till 520 @ 9.6kbit eller 2082 @ 2.4kbit
Ger minst fel då
Edit : Ett till sätt att verifiera att man har rätt hastighet är att mäta med oscilloskopet på utsignalen.
Postat: 20 maj 2007, 13:31:47
av sodjan
> Ända problemet är att den inte sänder de 3-6 första tecknena...
Och om du enbart skickar *ett* tecken ?
Vart tar det vägen ? Det kanske är på PC sidan du tappar tecken...
> TRISC = 0x00;
> TRISC.F7 = 1; //RX
> TXSTA = 0x00;
> TXSTA.TXEN = 1; //Sätter på TXen
Varför gör du så där ? Varför inte sätta alla bitar på en gång ?
Postat: 20 maj 2007, 21:55:49
av xezer
Micke_s:
BAUDCON, BRG16 ? Hittar ingenting i databladet om det
Ska inte baudraten vara 129 med BRGH och 20MHz på 9.6 kbit?
Sodjan:
Om jag skickar ett tecken får jag 0xFF oavsett tecken.
Jag skriver så för att jag håller på och testar lite olika bitar, det underlättar för mig.
För övrigt så verkar jag få samma problem vilken baudrate jag än använder, både med och utan BRGH satt.
Jag använder den terminalen som följer med MikroC IDEet och har testat med andra liknande programvaror men får samma fel.
Postat: 20 maj 2007, 21:58:18
av Micke_s
Vilken PIC är det???
Jag antog att det var en PIC18.
Postat: 20 maj 2007, 22:02:47
av xezer
Oj, det skrev jag aldrig i denna tråden.
Men du har så rätt Micke_s, det är en PIC18F452.
Postat: 20 maj 2007, 22:13:53
av sodjan
8/16 bitars baudrate register finns i de modeller som
har EUSART (d.v.s "Enhanced USART"). Dessa finns även
i (nyare) PIC16 modeller och är inget specifikt för PIC18
(även om det i och för sig var i någon PIC18 modell
som EUSART först dök upp),,,
PIC18F452 har den något äldre USART, men det kan
knappast vara problemet i detta fall...
Och som sagt, den stora fördelden med EUSART är just
16-bitars baudrate register, vilket i många fall gör
"avrundningsfelet" vid beräkning av devisiorn betydligt
mindre.
Sen, med det utrett...
> Om jag skickar ett tecken får jag 0xFF oavsett tecken...
Hm, så om du sänder *ett* tecken (vilket som) så
får du ett x'FF' till PC'n ?
Och om du sänder *ett* till så kommer det ytterligare ett x'FF' ?
När är det som du får "rätt" tecken ?
Och vad måste du göra för att sen få fel tecken ingen?
Räcker det med en paus, eller måste du start om allt (reset) ?
Det låter som om du får in "skräp" i "röret" mellan din
PIC applikation och ditt terminalprogram.
Det du måste göra är att ta reda på *EXAKT* under
vilka förhållanden som du får skräp respektive rätt tecken...
Postat: 21 maj 2007, 01:57:04
av Icecap
"while(PIR1.TXIF == 0){} //Väntar på TXIF"
är lite suspekt. När en kompiler läser ett bitvärde är det inte sällan att den maskar ut bitten enbart och värdet kan då bli 1, 2, 4, 8, 16, 32, 64 eller 128 allt efter bittens position.
Ett bättre sätt är då:
"while(!PIR1.TXIF); //Väntar på TXIF"
Sedan funderar jag lite på varför du väntar på PIR1.TXIF först när du sedan använder TXSTA.TRMT, om du kör rent pollad är den enda användbara flagga ju TXSTA.TRMT.
Kod: Markera allt
Alltså bör
while(data[i])
{
while(PIR1.TXIF == 0); //Väntar på TXIF
TXREG = data[i++]; //skickar innehållet
while (TXSTA.TRMT == 0);
}
egentligen vara
while(data[i])
{
while(!TXSTA.TRMT); // Väntar på att TX blir klar
TXREG = data[i++]; //skickar en byte
}