Assembly + C

Moderator: tilz0R

Assembly + C

OdgovorNapisal/-a Lovro7 » 20 Jan 2025, 23:03

Pozdravljeni,
Frekvencmeter bom naredil kar po svoje in sem naletel na problem pri kodi.

Torej ideja je, da bi bila koda v glavnem pisana v C zaradi računanja in prikazovanja podatkov na LCD zaslon. Časovno kritični del pa bi bil napisan v assemblyju.

Če se ne motim lahko v C kodo v Atmel studio dodam assembly z asm("UKAZ");
TIMER2 bi na vsakih 10mS naredil interrupt. Takrat bo v asm preveril, če je preštel 100 interruptov. Če se je to zgodilo bo v ugasnil prescaler, ki ima 4 žice za krmiljenje. Nato pa mora C prebrati vrednost PORTB, TIMER1 in TIMER0, ki šteje kolikokrat se zgodi overflow na TIMER1. TIMER0 uporabljam zato ker lahko imam samo 1 interrupt. Drugi compare register TIMERja2 bo nastavljen tako, da ko doseže vrednost 0xFFFF odda pulz na izhodu, ki pa je povezan na vhod TIMERja1.

Zanima me, kako v zanko v asm dodam C kodo?
Kako se bo potem koda izvajala? Ali se bo vrnla naprej v glavo zanko iz asm zanke?


Koda: Izberi vse
#include <avr/io.h>
#include <avr/interrupt.h>

asm("ELSE_LABEL:"
      "OUT PORTC, r29"
      
      //TUKAJ MORA C PREBRATI VHODE IN TIMMER0 + 1 IN SHRANITI KOT SPREMENLJIVKE
      
      "OUT PORTC, r28"
      )
      
void start_count(){
   
}


int main(void){
   asm("LDI r31, 0x64"); //Load counter constant into mS sompare register
   asm("LDI r29, 0x1F"); //Load prescaler STOP command constant in register
   asm("LDI r28, 0x02"); //Load prescaler START command constant in register
   asm("CLR r30"); //Clear mS count register
   

   
   while (1){
      
   }
   
   ISR(TIMER2_COMPA_vect){
      asm("INC r30"); //incriment mS counter
      asm("CP r30, r31"); //compare mS counter with counter constant
      asm("BRNE ELSE_LABEL"); //If equal jump
   }
}


Mogoče bi naredil, da asm samo izklopi prescaler nato pa še C preveri stanje registrov in nato prebere?
Kaj mi vi priporočate?
Za tisti del v asm sem se odločil tudi zato, ker lahko izračunam koliko časa bo preteklo med interruptom in izklopom prescalerja in nato to napako programsko odpravim.

Hvala za pomoč!
Lp, Lovro
Vse je lahko žarnica, če je dovolj toka. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 323
Pridružen: 11 Feb 2024, 20:19
Kraj: Velenje (Šmartno ob Paki)
Zahvalil se je: 128 krat
Prejel zahvalo: 103 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 8

Re: Assembly + C

OdgovorNapisal/-a mare69 » 21 Jan 2025, 00:03

Omenjaš Atmel studio, nisi pa navedel ali gre za AVR, ali za ARM? Načeloma je prevajalnik dovolj pameten, da zna optimizirati, če mu poveš, da bi rad npr. optimizacijo za hitrost izvajanja. Za AVR si lahko pogledaš tole: https://ww1.microchip.com/downloads/en/ ... oc8453.pdf morda ti bo v pomoč. Če pa uporabljaš kak sodobnejši 32 bitni MCU, pa povej. Tam je veliko več opcij za optimizacijo. Je pa res, da če omenjaš ms to ni neka huda zahteva.
Uporabniški avatar
mare69
 
Prispevkov: 360
Pridružen: 30 Jun 2024, 14:48
Zahvalil se je: 69 krat
Prejel zahvalo: 220 krat
Uporabnika povabil: miharix
Število neizkoriščenih povabil: 108

Re: Assembly + C

OdgovorNapisal/-a S56FPW » 21 Jan 2025, 09:12

Jaz bi ti predlagal da narediš sodoben Frekvencmeter
ki zna še kako malenkost več kot samo meritev frekvence
https://lea.hamradio.si/~s56fpw/
ploščice imam pa nekaj kriticnih kosov tudi
http://lea.hamradio.si/~s56fpw/
Uporabniški avatar
S56FPW
 
Prispevkov: 923
Pridružen: 26 Jan 2015, 23:00
Kraj: Ljubljana
Zahvalil se je: 265 krat
Prejel zahvalo: 510 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 99

Re: Assembly + C

OdgovorNapisal/-a Lovro7 » 21 Jan 2025, 12:40

S56FPW je napisal/-a:Jaz bi ti predlagal da narediš sodoben Frekvencmeter
ki zna še kako malenkost več kot samo meritev frekvence
https://lea.hamradio.si/~s56fpw/
ploščice imam pa nekaj kriticnih kosov tudi


Trenutno bo meril samo frekvenco ampak na vsakem projektu pustim prostor za nadgradnje. ADC (PORTC) sem pustil prazen in USART pina tudi.
Kasneje pa samo dodam module.

1 timer bo najprej izmeril duty dicle TTL vhoda nato pa bo sluzil za meritev frekvence.
Vse je lahko žarnica, če je dovolj toka. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 323
Pridružen: 11 Feb 2024, 20:19
Kraj: Velenje (Šmartno ob Paki)
Zahvalil se je: 128 krat
Prejel zahvalo: 103 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 8

Re: Assembly + C

OdgovorNapisal/-a Lovro7 » 21 Jan 2025, 12:50

mare69 je napisal/-a:Omenjaš Atmel studio, nisi pa navedel ali gre za AVR, ali za ARM? Načeloma je prevajalnik dovolj pameten, da zna optimizirati, če mu poveš, da bi rad npr. optimizacijo za hitrost izvajanja. Za AVR si lahko pogledaš tole: https://ww1.microchip.com/downloads/en/ ... oc8453.pdf morda ti bo v pomoč. Če pa uporabljaš kak sodobnejši 32 bitni MCU, pa povej. Tam je veliko več opcij za optimizacijo. Je pa res, da če omenjaš ms to ni neka huda zahteva.


Bom poizkusil sprogramirati v C kot piše v dokumentu. Ali je možno v microchip studio v C šteti cikle procestorja, da lahko programsko odpravim napako?

Uprabljam pa AVR mikrokrmilnike.
Kateri pa so najbolj pogosti 32 bitni MCUji?
Vse je lahko žarnica, če je dovolj toka. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 323
Pridružen: 11 Feb 2024, 20:19
Kraj: Velenje (Šmartno ob Paki)
Zahvalil se je: 128 krat
Prejel zahvalo: 103 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 8

Re: Assembly + C

OdgovorNapisal/-a mare69 » 21 Jan 2025, 17:42

Med najbolje razširjenimi z odlično podporo so NXP, Renesas in STM32. Cenovno ugodni so stm32, predvsem razvojni kompleti.
Uporabniški avatar
mare69
 
Prispevkov: 360
Pridružen: 30 Jun 2024, 14:48
Zahvalil se je: 69 krat
Prejel zahvalo: 220 krat
Uporabnika povabil: miharix
Število neizkoriščenih povabil: 108

Re: Assembly + C

OdgovorNapisal/-a tilz0R » 21 Jan 2025, 17:50

Objektivno najbolj popularni so STM32 32-bitniki (WSTS publikacija).
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 2377
Pridružen: 17 Jan 2015, 23:12
Kraj: Črnomelj
Zahvalil se je: 263 krat
Prejel zahvalo: 762 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: Assembly + C

OdgovorNapisal/-a radix » 21 Jan 2025, 23:24

Števila ciklov ki bodo izvedeni se iz raznih razlogov ne ugotovi iz C kode, ampak iz disassemblyja prevedenega programa. Opcijo za disassembly mogoče ponuja tudi IDE, sicer pa uporabi avr-objdump.

Najboljša navodila za mešanje assemblyja in C z avr-gcc so tukaj: https://avrdudes.github.io/avr-libc/avr-libc-user-manual-2.2.0/inline_asm.html.
radix
 
Prispevkov: 1541
Pridružen: 04 Feb 2015, 19:19
Kraj: Ljubljana
Zahvalil se je: 242 krat
Prejel zahvalo: 368 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 26

Re: Assembly + C

OdgovorNapisal/-a Lovro7 » 21 Jan 2025, 23:59

@radix, hvala za link.
Če prav razumem najprej napišem kodo v C, nato jo razstavim z avr-objdump in preštejem cikle. Nato pa napako odpravim programsko. Odpravil jo bom pri nastavitvah za TIMER2 in na štetju mS.

To bo zadnji AVR projekt, nato pa preklopim na STM32G441. Za kakšne lažje projekte, ki ne zahtevajo veliko moči procesorja pa bo še vedno ATmega ali tiny dober.
Vse je lahko žarnica, če je dovolj toka. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 323
Pridružen: 11 Feb 2024, 20:19
Kraj: Velenje (Šmartno ob Paki)
Zahvalil se je: 128 krat
Prejel zahvalo: 103 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 8

Re: Assembly + C

OdgovorNapisal/-a mare69 » 22 Jan 2025, 00:04

Lovro7 je napisal/-a:@radix, hvala za link.
Če prav razumem najprej napišem kodo v C, nato jo razstavim z avr-objdump in preštejem cikle. Nato pa napako odpravim programsko. Odpravil jo bom pri nastavitvah za TIMER2 in na štetju mS.

To bo zadnji AVR projekt, nato pa preklopim na STM32G441. Za kakšne lažje projekte, ki ne zahtevajo veliko moči procesorja pa bo še vedno ATmega ali tiny dober.


Super. A veš, da obstaja STM32 v SO-8 ohišju :) ?
Uporabniški avatar
mare69
 
Prispevkov: 360
Pridružen: 30 Jun 2024, 14:48
Zahvalil se je: 69 krat
Prejel zahvalo: 220 krat
Uporabnika povabil: miharix
Število neizkoriščenih povabil: 108

Re: Assembly + C

OdgovorNapisal/-a Lovro7 » 22 Jan 2025, 00:26

Sedaj vem :D
Nebi rad čisto opustil AVRjev ker sem se vseeno ogromno naučil na njih in so bili tudi prvi mikrokrmiljniki s katerimi sem delal.
Vse je lahko žarnica, če je dovolj toka. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 323
Pridružen: 11 Feb 2024, 20:19
Kraj: Velenje (Šmartno ob Paki)
Zahvalil se je: 128 krat
Prejel zahvalo: 103 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 8


Vrni se na Programski jeziki za mikrokontrolerje

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost