USART

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

USART

Inlägg 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){
     }

}
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg 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
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg 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 :/
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg 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??
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg 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å.. :oops:

Sådär, nu börjar det bli något även av det här :D
Ä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){
     }
}
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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 ?
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg 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.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg av Micke_s »

Vilken PIC är det???
Jag antog att det var en PIC18.
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg av xezer »

Oj, det skrev jag aldrig i denna tråden. :oops:
Men du har så rätt Micke_s, det är en PIC18F452.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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
         }
Skriv svar