Beräkna sändhastighet på µC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Beräkna sändhastighet på µC

Inlägg av Korken »

Hej alla glada!

Jag undrar hur kan ja beräkna den maximala teoretiska hastigheten som jag kan skicka med en µC vi en pin (och klock pin), alltså inte USART eller liknande.
Jag måste ju setta porten hög/låg och klocka sen shifta byten ett steg och sedan köra om det 8ggr per byte.
Ned är det väll bara att räkna cykler?
Typ; 20.000.000 Hz/x*8 cykler för funktionen/1024) för kB/s.

Har jag tänkt rätt?

Tack på förhand!
//Emil
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Vad skall ta emot? Du måste även ta hänsyn till att mottagaren skall hinna med och hålla sig synkad mot klockan. Sedan skall den också hinna göra något med inkommande data. Allt det där sänker hastigheten högst väsentligt mycket.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg av Micke_s »

Med loop så får du räkna med hoppinstruktioner osv.
Vad maximala tiden blir beror på vilken µC.

Teoretiska sändingshastigeten blir maximalt var pinnarna kan toggla delat med 3.

Sedan att det kräver 256*(8*3+1) instruktioner för lagra i programminnet är en annan sak.


pseudokod Ex

Kod: Markera allt

call s07


s00
   pin_clock_low
   pin_data_low
   pin_clock_high

   pin_clock_low
   pin_data_low
   pin_clock_high

   pin_clock_low
   pin_data_low
   pin_clock_high

   pin_clock_low
   pin_data_low
   pin_clock_high

   pin_clock_low
   pin_data_low
   pin_clock_high


   pin_clock_low
   pin_data_low
   pin_clock_high

   pin_clock_low
   pin_data_low
   pin_clock_high

   pin_clock_low
   pin_data_low
   pin_clock_high

   return
....
s07
   pin_clock_low
   pin_data_high
   pin_clock_high

   pin_clock_low
   pin_data_high
   pin_clock_high

   pin_clock_low
   pin_data_high
   pin_clock_high

   pin_clock_low
   pin_data_low
   pin_clock_high

   pin_clock_low
   pin_data_low
   pin_clock_high

   pin_clock_low
   pin_data_low
   pin_clock_high

   pin_clock_low
   pin_data_low
   pin_clock_high

   pin_clock_low
   pin_data_low
   pin_clock_high



   return
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Och hur skall mottagande processor kunna synka ifall det är en av samma sort?

Där måste finnas tid så att den kan vänta på klockan och sedan skifta in byten. Annars kan man lika väl skippa klockan.

Det är nog bara att konstatera, vill man ha högfart så kräver det hårdvara.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Micke_s skrev:Med loop så får du räkna med hoppinstruktioner osv.
Vad maximala tiden blir beror på vilken µC.

Teoretiska sändingshastigeten blir maximalt var pinnarna kan toggla delat med 3.

Sedan att det kräver 256*(8*3+1) instruktioner för lagra i programminnet är en annan sak.
256*(8*3+1) instruktioner för att lagra vad/hur i programminnet?
För själva byten tar inte många instruktioner. Tex ldi r16, 0xFF
Och varför ska man ta max va de kan toggla delat med 3?

När det gäller mottagningen låt oss anta att det finns inga problem att ta emot det.

Blir inte funktionen något i stil med?:
Den kan va riktigt fel. Är riktigt trött nu och orkar inte tänka men den kanske funkar med lite tur MEN den har nästan garanterat kraftiga logiska fel. :lol:

Kod: Markera allt

send_byte:
	clr cnt					;Sätt cnt = 0x00
	send_loop:				;Starta loopen som ska gå 8gånger
		mov tmp, byte		;Skicka byten som ska skickas till tmp registret
		andi tmp, 0x80		;Kör en Logical AND
		cpi tmp, 0x80		;Och se om biten vi är på är 1 eller 0
		breq bit_high		;Om biten är 1 hoppa till bit_high
		cbi PORT, 0			;Om inte, set data porten till 0 och clocka ut det
		sbi PORT, 1			
		cbi PORT, 1
		rjmp send_end		;Hoppa till send_end då vi vill ju inte köra bit_high om biten var låg
		bit_high:			
		sbi PORT, 0			;Sätt data porten hög och klocka
		sbi PORT, 1
		cbi PORT, 1
		send_end:			
		lsl byte			;Shifta data byten ett steg åt vänster: 11110000 <<1 => 11100000
		inc cnt				;Öka räknaren
		cpi cnt, 8			;Kolla om vi har kört klart loopen
	brne send_loop			;Om loopen inte är klar kör om den
ret
//Emil
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Oj, vad stökigt....

Nu vet jag inte vad Din CPU kan, men antar att den har carry.

Väljer Duatt ha sändningen på bit 0 eller bit 7 i porten så blir det enklast, det tycks Duredan ha gjort.

Placera data i en temporär plats.

Läs porten till ett register i processorn
Skifta ut så sändbiten försvinner ur registret.
Skifta ut en bit av data till carry.
Skifta in carry i registret.
Skriv registret till porten.
Generera klockpuls.

Loopa bakåt så alla 8 bitarna sänds, eller repetera koden totalt 8 gånger så sparar Du biträknare och loop. Det är en rimligt kort instruktionssekvens så det bör inte vara något problem att göra så.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47013
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Inlägg av TomasL »

Maximala hyastigheten på en port är alltid instruktionshastigheten/2.

På en PIC med 40MHz klocka blir detta 20ns dvs en instruktion tar 10ns och det krävs två instruktioner att tända resp släcka en port.

Att du inte kan göra nått meningsfyllt med detta är en helt annan sak.
eriikh
Inlägg: 258
Blev medlem: 5 maj 2006, 10:52:15

Inlägg av eriikh »

Om du vill ha upp hastigheten så kan du (kanske) dedikera en hel port till att skicka data och sedan använda ett snabbt shiftregister för att få datan seriellt? blir ju ganska enkelt att bara läsa en registeradress rakt till portX och sedan pulsa clock så fort det går :P
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Re: Beräkna sändhastighet på µC

Inlägg av $tiff »

Korken skrev:Hej alla glada!

Jag undrar hur kan ja beräkna den maximala teoretiska hastigheten som jag kan skicka med en µC vi en pin (och klock pin), alltså inte USART eller liknande.(...)
Vad menar du "alltså inte USART eller liknande"? Att du vill göra det via valfri I/O på din µC? Det du beskriver är helt vanlig synkron seriell överföring som master. Även om man skriver detta i mjukvara så är det ett hörn av en USART.

Jämförelsevis kan en modern AVR på 20 MHz skyffla ut data med 10 MHz som seriell synkron master med hårdvarustödet, det är svårt att slå (om det nu nu verkligen funkar på "riktigt").

Om du nu _bara_ vill optimera med avseende på datahastighet i en mjukvarurutin så går det alltid att skriva långa specialrutiner där du skippar loopar i största möjliga mån, det är ju oftast programhoppen som tar upp den mesta av tiden.
Skriv svar