Sida 2 av 3
Re: PIC, Sätta TXREG med char
Postat: 8 juni 2011, 17:29:06
av sodjan
> Denna kod genereras ju.
Även för alternativet med TXREG = 'a' ?
Blir det alltså samma kod i båda fallen ??
OK, hur som helst...
Byt ut namnet "a" till något vettigt.
Oavsett om det hjälper eller inte...
Re: PIC, Sätta TXREG med char
Postat: 8 juni 2011, 17:32:15
av bearing
Definitionen av a borde hamna i asm-filen. Antagligen används instruktionen MOVWF istället för MOVFF när konstanten används. Fast det borde ju inte göra någon skillnad, sålänge a är korrekt.
Det är inte säkert att det blir någon kod av det där villkoret, kan hända att kompilatorn optimerar bort det, eftersom att optimeraren ser att a inte ändras. Ifall du vill att den inte ska optimera bort villkoret måste variabeln deklareras volatile.
Har du mätt om det kommer någon från pinnen alls, t.ex. 0? Ifall du byter terminalprogram till något som visar alla tecken som kommer in borde det blir enklare att felsöka.
http://realterm.sourceforge.net
Re: PIC, Sätta TXREG med char
Postat: 8 juni 2011, 17:49:46
av Abets
Kod: Markera allt
; volatile char char_to_send = 'a';
MOVLW 97
MOVWF char_to_send,0
; TXREG = 'a';
MOVWF TXREG,0
; TXREG = char_to_send;
MOVFF char_to_send,TXREG
Där har du med c-koden ovan varje rad assambler. Jag vet att det inte är någonting som ska fungera - bara så ni får se hur den tolkar min c-kod i de olika fallen.
Kolla! Nytt variabelnamn också!
Det kommer 0 från pinnen när jag sätter TXREG = char_to_send. Den reagerar alltså på att Någonting händer med registret.
Re: PIC, Sätta TXREG med char
Postat: 8 juni 2011, 18:07:32
av bearing
Det som vore intressant att se är ju vad som blir av koden TXREG = 'a', samt på vilken minnesplats char_to_send lagras. Det vore även intressant att se vad som blir av if(char_to_send == 'a') TXREG = 'a', nu när char_to_send är deklarerad som volatile.
Ifall du inte hittar definitionen av char_to_send i asm- eller map-filerna borde du kunna använda simulatorn för att se vilken adress variabeln får. I simulatorn går det även att se ifall TXREG får värdet noll när MOVFF-instruktionen körs.
Re: PIC, Sätta TXREG med char
Postat: 8 juni 2011, 18:27:31
av sodjan
> bara så ni får se hur den tolkar min c-kod i de olika fallen.
Men det *intressanta* var ju just fallet som Bearing nämner, TXREG = 'a'.
Eftersom det ju är den som fungerar, eller var det inte så ?
Det jag skulle ha gjort i detta läge vore att skriva ett litet test-case i assembler
som gör samma sak och få det att fungera. Där har man full kontroll på ett annat
sätt. Bearings förslag att undersöka hur/var saker och ting lagras är också vettiga.
Bra med annat variabelnamn, att ha ett "a" i PIC18 assembler är väldigt förvirrande.
Re: PIC, Sätta TXREG med char
Postat: 8 juni 2011, 20:02:17
av TomasL
Abets skrev: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';
Har "Dissassemblerat din assemblerkod och den är korrekt:
Konstanten "a"->W
W->reg0x000
reg0x000->TXREG1
"a" i koden, raden "000030 6E00 00077 MOVWF a,0" är i det det här fallet "Accessbanken"
Syntaxen för MOVWF är MOVWF,a,f
Men detta var ju den koden som fungerar, hur ser hela kodbiten ut i assembler för funktionen i fråga, dvs den funktionen som inte fungerar.
Hur ser din konfiguration ut dvs konfigurationsbitarna, vilka pinnar använder du som RX resp TX
Re: PIC, Sätta TXREG med char
Postat: 8 juni 2011, 20:09:19
av bearing
Den koden som inte fungerar är ju koden som han postat tre gånger i tråden, där MOVFF lägger ett registers värde i TXREG.
Re: PIC, Sätta TXREG med char
Postat: 8 juni 2011, 20:11:43
av TomasL
Var får du det ifrån?
Re: PIC, Sätta TXREG med char
Postat: 8 juni 2011, 20:21:16
av TomasL
OK, läste lite noggrannare i tråden nu
Kod: Markera allt
TRISC = 0b11000000; //RX & TX = inputs for serial communication
Är felaktig, den sätter TX som ingång.
Skall vara
Kod: Markera allt
TRISC = 0b10000000; //RX & TX = inputs for serial communication
[/i]
Glöm detta, läste fel datablad.
Dessutom kan det vara lämpligt att sätt TX1IE också,
Kod: Markera allt
REGISTER 9-7: PIE1: PERIPHERAL INTERRUPT ENABLE REGISTER 1
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
PSPIE(1) ADIE RC1IE TX1IE SSPIE CCP1IE TMR2IE TMR1IE
bit 7 bit 0
bit 7 PSPIE: Parallel Slave Port Read/Write Interrupt Enable bit(1)
1 = Enables the PSP read/write interrupt
0 = Disables the PSP read/write interrupt
bit 6 ADIE: A/D Converter Interrupt Enable bit
1 = Enables the A/D interrupt
0 = Disables the A/D interrupt
bit 5 RC1IE: USART1 Receive Interrupt Enable bit
1 = Enables the USART1 receive interrupt
0 = Disables the USART1 receive interrupt
bit 4 TX1IE: USART1 Transmit Interrupt Enable bit
1 = Enables the USART1 transmit interrupt
0 = Disables the USART1 transmit interrupt
bit 3 SSPIE: Master Synchronous Serial Port Interrupt Enable bit
1 = Enables the MSSP interrupt
0 = Disables the MSSP interrupt
bit 2 CCP1IE: CCP1 Interrupt Enable bit
1 = Enables the CCP1 interrupt
0 = Disables the CCP1 interrupt
bit 1 TMR2IE: TMR2 to PR2 Match Interrupt Enable bit
1 = Enables the TMR2 to PR2 match interrupt
0 = Disables the TMR2 to PR2 match interrupt
bit 0 TMR1IE: TMR1 Overflow Interrupt Enable bit
1 = Enables the TMR1 overflow interrupt
0 = Disables the TMR1 overflow interrupt
Kan inte nånstans i tråden hitta assemblerlistningen för
dvs den listningen som visar OP-coderna, och inte bara MNEONICS
Kod: Markera allt
void SendChar(uns8 c)
{
while( ! TXIF ) ;
TXREG = c;
}
Re: PIC, Sätta TXREG med char
Postat: 8 juni 2011, 22:40:46
av sodjan
> Syntaxen för MOVWF är MOVWF,a,f
Syntaxen är MOVWF f,a, inget annat.
a = 0 i listningarna så det är korrekt att det är access banken som används.
Det är just användningen av "a" som variabel och risken att blanda ihop
det med paramatern för accessbanken som gör det till ett dåligt variabelnamn.
> Den koden som inte fungerar är ju koden som han postat tre gånger i tråden,
Jo, men det som saknas är en ASM listning för koden som *fungerar*, eller har jag missat det ?
D.v.s den med TXREG = 'a' istället för TXREG = a (eller char_to_send).
Jag skulle även göra ett litet ASM testprogram (och se till att det fungerar) och
jämföra det med kompilatorns ASM kod.
Re: PIC, Sätta TXREG med char
Postat: 8 juni 2011, 22:49:21
av TomasL
Han har postat kod, som ser ut så här (på förra sidan)
a='a';
TXREG=a;
Och den assemblerar helt riktigt, vilket innebär att felet ligger nån annanstans, om det inte funkar, förmodligen elektriskt eller nån annanstans.
Re: PIC, Sätta TXREG med char
Postat: 8 juni 2011, 22:53:15
av sodjan
Men påstår samtigt att om han enbart ändrar till :
TXREG='a';
så fungerar det.
Hur förklarar du det med "förmodligen elektriskt eller nån annanstans" ?
Nej, vi behöver två kompletta exempel, ett som fungerar och ett som inte
fungerar. Samt ASM listningen från båda.
Re: PIC, Sätta TXREG med char
Postat: 8 juni 2011, 22:54:48
av TomasL
Tja, missanpassade hastigheter, glappande kablar, etc.....
Re: PIC, Sätta TXREG med char
Postat: 8 juni 2011, 23:02:54
av sodjan
Hm, du menar alltså att det var rena tillfälligheter ("tur") att det
fungerade i det ena fallet och inte i det andra ? Tja, det är ju också
möjligt. Men man måste ju på något sätt utgå från att de olika fallen
är testade fram och tillbaka så att tillfälligheter kan uteslutas.
Re: PIC, Sätta TXREG med char
Postat: 8 juni 2011, 23:04:46
av TomasL
Visst är det så, med tanke på den postade koden, dvs den jag refererade till assemblerar helt korrekt, och om det då inte funkar, ligger felet nån helt annanstans.