Beräkna sändhastighet på µC
Beräkna sändhastighet på µC
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
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
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
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
256*(8*3+1) instruktioner för att lagra vad/hur i programminnet?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.
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.

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
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å.
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å.
Re: Beräkna sändhastighet på µC
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.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.(...)
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.