
Det är väl roligare att det inte fungerar då...
Men på PIC18 blir det nog rätt - men jag är inte säker men TS verkar vara det. Bara konstigt att det inte fungerar ändå...
Kod: Markera allt
movlw 'A' ;Skriv ut ett 'A'
call SEROUT
return
SEROUT
btfss PIR1,TXIF
bra SEROUT
movwf TXREG
return
Vad jag kommer ihåg så började jag med att testa TXIF och kunde då inte skriva ett tecken felfritt. Då testade jag med TRMT och kunde skriva ut två tecken felfritt.Kaggen skrev:Vet inte varför du (trådskaparen) kollar sänd byte med TRMT? Det borde ju iofs också gå, men den kollar ju egentligen bara om shiftregistret är ledigt. Jag (och dom exempel jag sett) brukar kolla TXIF vilket betyder att TXREG registret är tomt och kan fyllas med nästa byte. Dessutom kollar jag TXIF *innan* jag skickar nästa byte. Det blir mer tidseffektivt eftersom man vanligen gör lite annat innan man slänger på nästa byte. Annars står ju controllern och dökör efter varje byte till ingen nytta.
Min utskriftrutin efter det jag initierat allt, som jag enbart normalt bara gör vid uppstart av uC, ser ut som nedan:Jag bökar inte heller med BSR flaggorna/access bitarna efter instruktionerna. Jag använder oftast inte mer än 96 bytes RAM så då fixar assemblern det automagiskt. Vet inte heller riktigt varför du bökar med bsf PORTC,RC6,0? Enda anledningen jag kan tänka mig är att du kör mot någon underlig hårdvara? USARTen brukar fixa allt sådant själv annars. Jag har kört med ovanstående kod mot ett antal Windows/Linux burkars serieportar, och det funkar utmärkt utan att behöva lägga till "fulkod".Kod: Markera allt
movlw 'A' ;Skriv ut ett 'A' call SEROUT return SEROUT btfss PIR1,TXIF bra SEROUT movwf TXREG return
Håller med övriga att relativa hopp (och självmodifierande kod) var coolt när man började programmera. Sedan vart programmen mer komplicerade och CPUerna fick cache. Så jag växte upp och slutade med dumheterna.
Jag missade Kaggens inlägg men har nu svarat.sodjan skrev:Det hela tyder på att din kontroll av om sändaren är "ledig" är fel.
Har du bara testat med 256 och 256x256 cykler ? Inte för att det
kanske behövs, men jag gissar att gränser går vid en fördröjning
som är i stort sett lika med sändningstiden för ett tecken.
Men, som sagt, jag säger att det ganska tydligt pekar på att du har
fel i kontrollen av om sändaren är ledig...
Är det av någon speciell anledning du inte har svarat på Kaggens
inlägg här direkt innan ? Det är ju inte orimligt att du har svaret där.
Enligt databladet är TRMT 1 i vila. När skiftregistret fylls blir TRMT 0, och sedan åter 1 när shiftregistret är ledigt.Kod: Markera allt
movwf TXREG btfsc TXSTA,TRMT goto $-2