Migracija iz arduino v C

Arduino je pojav za katerega bi težko rekli, da opisuje samo HW ali samo SW, zato mu tu namenajm poseben prostor.

Moderator: tilz0R

Migracija iz arduino v C

OdgovorNapisal/-a Lovro7 » 29 Sep 2024, 20:38

Nisem se mogel odločiti, ali naj odprem temo v programskih jezikih ali v Arduino sekciji, zato prosim moderatorja, da temo prestavi, če bolj paše v programske jezike.

Sedaj pa k glavnemu delu. Odločil sem se, da se oddaljim od Arduina in ATmega328 ter poizkusim z drugimi AVR mikrokontrolerji. Programiranje v C ne bo problem. Imam pa nekaj vprašanj:

• Trenutno uporabljam VS Code. Ali je to v redu, ali priporočate kaj drugega?
• Kako kodo v C pretvorim v .hex, da jo lahko naložim z AVRdudess?
• Na kaj moram biti pozoren in imate kakšne nasvete?

Poznam osnovno strukturo portov pri Atmelovih mikrokontrolerjih (DDRx, PORTx, PINx), vendar me muči bit shifting. Iskal sem na internetu, a nisem našel nič uporabnega. Ali kdo pozna kakšen članek ali tutorial?

Hvala za pomoč.

Lep pozdrav,
Lovro
Vse je lahko žarnica, če je dovolj toka. https://lovro7a.github.io/Lovro7-web/html/home_page.htm
Uporabniški avatar
Lovro7
 
Prispevkov: 160
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 78 krat
Prejel zahvalo: 63 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 4

Re: Migracija iz arduino v C

OdgovorNapisal/-a mucek » 29 Sep 2024, 20:49

Saj Arduino je C ... No, z veliko pomagali, pa vseeno.
Bi pa, ce bi bil na tvojem mestu, mogoce rajsi startal na kaj mocnejsega kot AVR, ce se ue spravljas v nov svet: recimo STM32 :D Imas zastonj toole od STja, MCUji pa so neprimerno zmogljivejsi in cenejsi (ce gledas isti range).

Lp, G
... lahko pa se tudi motim ...
Uporabniški avatar
mucek
 
Prispevkov: 2884
Pridružen: 18 Jan 2015, 20:20
Kraj: Ljubljana
Zahvalil se je: 103 krat
Prejel zahvalo: 1156 krat
Uporabnika povabil: s54mtb
Število neizkoriščenih povabil: 225

Re: Migracija iz arduino v C

OdgovorNapisal/-a Lovro7 » 29 Sep 2024, 21:04

Ja, Arduino je C ampak si recimo pri ATtiny ne morem pomagati z digitalWrite().

Trenutno še ne potrebujem nekih močnih mikrokrmionikov bom pa v prihodnosti zagotovo poizkusil STM, PIC…
Dokler se ne naučim bi se najraje držal AVR saj je ogrmono gradiva, navodil…

V katerem jeziku pa se programira?
Vse je lahko žarnica, če je dovolj toka. https://lovro7a.github.io/Lovro7-web/html/home_page.htm
Uporabniški avatar
Lovro7
 
Prispevkov: 160
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 78 krat
Prejel zahvalo: 63 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 4

Re: Migracija iz arduino v C

OdgovorNapisal/-a dejko1 » 29 Sep 2024, 21:38

Če znaš C in C++ si pri mikrokontrolerjih kar zmagal ;)

V VS Code verjetno uporabljaš Arduino plugin? Kot alternativo lahko uporabiš npr. VS Code + platformio. S pluginom ti bodo nekatere stvari lažje (npr. avtomatska namestitev paketa prevajalnika, vgrajene funkcije za flashanje). Platformio ponuja podporo za precej različnih MCU-jev, sicer pa poskrbi da VS code ve, kje iskati prevajalnik, razhroščevalnik, knjižnice, program za flashanje itd. V vsakem primeru VS code deluje kot urejevalnik besedila. Iz njega se potem z ukazom požene zunanji prevajalnik, ki tvojo kodo prevede v kontrolerju razumljivo obliko (hex).

Če ne uporabljaš platformia/Arduina, lahko prevajalnik namestiš in uporabljaš tudi ločeno / ročno, ali pa ukaze za poganjanje dodaš v nastavitve VS Code. Prevajalnik pogosto uporablja makefile skripto, ki mu da navodila za proces prevajanja, predvsem vsebuje nastavitve za prevajanje ter informacije, kje naj išče vhodne datoteke, ter kako naj izgleda izhodna datoteka. Če boš delal v IDE s prednastavljenimi projekti podrobnosti procesa prevajanja ni nujno poznati, se boš pa hitro srečal s tem, če boš želel uporabiti zunanji prevajalnik.

Razvijalci čipov nudijo tudi svoja integrirana orodja oz. IDE, ki so priporočeno orodje za delo z njihovimi čipi, za AVR je to Microchip studio. Tam si lahko obetaš najboljšo podporo za uradna orodja in najhitrejšo podporo s strani proizvajalca, če bi jo potreboval. Ni pa nujno, da je direktno podprta uporaba nizkocenovnih 3rd party plošč in programatorjev.

Kar se tiče bitnih operacij si lahko pogledaš naslednje linke:
https://legacy.rei-labs.net/armio/
https://legacy.rei-labs.net/wp-content/ ... acije2.pdf
https://legacy.rei-labs.net/wp-content/ ... _porti.pdf
Ne vem pa če je zadeva najbolj razumljiva brez razlage, tale post in skripte so bile pripravljene za spremljevalni material ene delavnice, kjer smo si to pogledali v živo. Gre sicer za drug mikrokontroler, ampak principi so enaki.
dejko1
 
Prispevkov: 549
Pridružen: 12 Feb 2015, 12:47
Kraj: Ljubljana
Zahvalil se je: 87 krat
Prejel zahvalo: 197 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 197

Re: Migracija iz arduino v C

OdgovorNapisal/-a Lovro7 » 29 Sep 2024, 22:03

Uporabljam VS code + platformio.

Bom poizkusil microchip studio.


Malo sem se igral v simulatorju in sem namesto digitalRead() uporabil:
Koda: Izberi vse
DDRD = 0x02;

PORTD1 mora biti izhod zaradi serijske komunikacije.
Nato pa:
Koda: Izberi vse
bool portd4_val = (PIND >> 4);


Ali je vredu ali obstaja boljši način?
Razmišljal sem, če to zamakne vse vrednosti v registru. Bi bilo mogoče bolje tako:
Koda: Izberi vse
int x = PIND;
bool pin4_val = (x >> 4);
Vse je lahko žarnica, če je dovolj toka. https://lovro7a.github.io/Lovro7-web/html/home_page.htm
Uporabniški avatar
Lovro7
 
Prispevkov: 160
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 78 krat
Prejel zahvalo: 63 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 4

Re: Migracija iz arduino v C

OdgovorNapisal/-a tilz0R » 29 Sep 2024, 22:04

Zakaj bi se učil na novo z AVR, ki je soon to be iz proizvodnje?
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 2346
Pridružen: 17 Jan 2015, 23:12
Kraj: Črnomelj
Zahvalil se je: 260 krat
Prejel zahvalo: 747 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: Migracija iz arduino v C

OdgovorNapisal/-a Lovro7 » 29 Sep 2024, 22:05

In še eno vprašanje:

V C programu imam int main().
Ali tudi tega vključim v program za mikrokrmilnik ali naredim while(1)?
Vse je lahko žarnica, če je dovolj toka. https://lovro7a.github.io/Lovro7-web/html/home_page.htm
Uporabniški avatar
Lovro7
 
Prispevkov: 160
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 78 krat
Prejel zahvalo: 63 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 4

Re: Migracija iz arduino v C

OdgovorNapisal/-a Lovro7 » 29 Sep 2024, 22:25

tilz0R je napisal/-a:Zakaj bi se učil na novo z AVR, ki je soon to be iz proizvodnje?


Narobe sem se izrazil.

Rad bi se naučil porgramiranje v C jeziku, da ne bom celo življenje omejen na ATmega328 im ArduinoIDE.

Gledena to da trenutno najbolj poznam AVRje bi se učil na njih, da bom lažje uporabil druge.
Vse je lahko žarnica, če je dovolj toka. https://lovro7a.github.io/Lovro7-web/html/home_page.htm
Uporabniški avatar
Lovro7
 
Prispevkov: 160
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 78 krat
Prejel zahvalo: 63 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 4

Re: Migracija iz arduino v C

OdgovorNapisal/-a tomazp » 30 Sep 2024, 09:41

Tudi sam sem začel z AVR procesorji. Veliko lahko narediš z njimi. Je pa prehod na kakšnega 32 bitnika zelo smiseln. Ogromno dobiš na hitrosti, velikosti pomnilnika... STM32 je tudi super zadeva. Lahko uporabiš njihovo Cube-ide orodje, ki ima uporaben debuger. Zelo uporabna je tudi njihova aplikacija STM32CubeMonitor na osnovi RedNoda, kjer lahko med delovanjem preverjaš dogajanje in spreminjaš željene parametre. Večino STM32 procesorjev lahko programiraš tudi z VS Code + Platformio. Lahko si pa izbereš enega od ESP32 zadev in poceni zraven pridobiš še povezljivost na splet preko wifi-ja. Lahko narediš loger, ki podatke pošilja direktno na nek strežnik v MariaDB bazo. Skratka, priporočam prehod iz starih avr-ov.

Če želiš štartati iz Arduinota potem je dobro izhodišče VS Code + Platformio. Ker gre za Arduino ( v bistvu C) boš isti procesor npr. Mega328 programiral iz novega okolja. Potem pa lahko enak program prevedeš za drug procesor npr. enega od STM32 ali ESP32. Precej enostavno je potem.
tomazp
 
Prispevkov: 746
Pridružen: 19 Jan 2015, 09:14
Kraj: Ljubljana
Zahvalil se je: 141 krat
Prejel zahvalo: 255 krat
Uporabnika povabil: Zeci
Število neizkoriščenih povabil: 53

Re: Migracija iz arduino v C

OdgovorNapisal/-a silvov » 30 Sep 2024, 12:59

tilz0R je napisal/-a:Zakaj bi se učil na novo z AVR, ki je soon to be iz proizvodnje?


Od kje ta informacija?

Lp Silvo
silvov
 
Prispevkov: 62
Pridružen: 09 Feb 2015, 10:21
Zahvalil se je: 25 krat
Prejel zahvalo: 4 krat
Uporabnika povabil: borisz
Število neizkoriščenih povabil: 2

Re: Migracija iz arduino v C

OdgovorNapisal/-a dejko1 » 30 Sep 2024, 14:06

Tole ni najboljše:
Koda: Izberi vse
bool pin4_val = (PIND >> 4);


Problem tvoje prve kode je, da prebere in zamakne vse bite registra. Pri zamiku se spodnji biti izgubijo, zgornji pa ne. Pri pretvorbi int->bool pa velja vsako neničelno število za true.

Raje takole:
Koda: Izberi vse
bool pin4_val = (PIND >> 4)&1;

ali takole (tale se mi zdi najbolj pregledna):
Koda: Izberi vse
bool pin4_val = PIND & (1 >> 4);


Pri Arduino platformi imaš dve funkciji, ki vsebujeta tvoj program - setup() in loop(). Pri C imaš funkcijo main(), kjer se nahaja celotna koda. V to funkcijo pišeš svoj program. Lahko si predstavljaš, da ima Arduino že vgrajeno nekaj takega:
Koda: Izberi vse
int main() {
  setup();
  while(1) {
    loop();
  }
}


AVR so drugače za učenje super iz tega stališča, da imajo zelo preprosto in lahko razumljivo periferijo, prekinitve in konfiguracijo ure. S parimi registri lahko npr. upravljaš s celo periferno enoto / celim čipom. Ne rečem, da se na STM ne da delati s periferijo direktno preko registrov, ampak ima toliko možnosti za konfiguracijo, da je za začetnika kar malo boleče. Večina ljudi zato ta del spusti in uprablja direktno HAL (ali LL) knjižnice, pri čemer pa je včasih vseeno dobro vedeti, da te knjižnice niso nekaj pretirano zapletenega, ter da ti le poenostavijo določene funkcije, kot je konfiguracija periferne enote, branje podatka ob določenem dogodku ipd. Največji minus, ki ga vidim pri AVR platformi, je sicer to, da nima dobre podpore za debug. Ta ti je lahko v precejšnjo pomoč, ko nekaj ne deluje tako, kot misliš da bi moralo.

PS: Tudi jaz sem zadnje čase bolj na STM, ESP, nRF platformah. Če bi jaz delal nekaj novega nepovezanega bi izbral STM.
dejko1
 
Prispevkov: 549
Pridružen: 12 Feb 2015, 12:47
Kraj: Ljubljana
Zahvalil se je: 87 krat
Prejel zahvalo: 197 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 197

Re: Migracija iz arduino v C

OdgovorNapisal/-a tilz0R » 30 Sep 2024, 14:30

dejko1 je napisal/-a:ali takole (tale se mi zdi najbolj pregledna):
Koda: Izberi vse
bool pin4_val = PIND & (1 >> 4);


Tole pač ne bo delalo, če boš 1 shiftal dol za 4, dobiš 0.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 2346
Pridružen: 17 Jan 2015, 23:12
Kraj: Črnomelj
Zahvalil se je: 260 krat
Prejel zahvalo: 747 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: Migracija iz arduino v C

OdgovorNapisal/-a dejko1 » 30 Sep 2024, 18:15

Jap, res je. Pravilno:
Koda: Izberi vse
bool pin4_val = PIND & (1 << 4);
dejko1
 
Prispevkov: 549
Pridružen: 12 Feb 2015, 12:47
Kraj: Ljubljana
Zahvalil se je: 87 krat
Prejel zahvalo: 197 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 197

Re: Migracija iz arduino v C

OdgovorNapisal/-a Lovro7 » 17 Okt 2024, 19:45

Še nekaj mi ni jasno.

Koda: Izberi vse
PORTD =  (1 << PORTD5)


Ali to zamakne vse bite ali samo nastavi PORT5 na 1?

Več kot testiram manj mi je jasno. Ko uporabim zgornji ukaz nastavi samo to vrednost. Ko pa uporabim
Koda: Izberi vse
PORTD = (0 << PORTD4)
pa spremeni vse vrednosti.
Vse je lahko žarnica, če je dovolj toka. https://lovro7a.github.io/Lovro7-web/html/home_page.htm
Uporabniški avatar
Lovro7
 
Prispevkov: 160
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 78 krat
Prejel zahvalo: 63 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 4

Re: Migracija iz arduino v C

OdgovorNapisal/-a tilz0R » 17 Okt 2024, 20:07

Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 2346
Pridružen: 17 Jan 2015, 23:12
Kraj: Črnomelj
Zahvalil se je: 260 krat
Prejel zahvalo: 747 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: Migracija iz arduino v C

OdgovorNapisal/-a Kroko » 18 Okt 2024, 01:15

Tale prvi link s C in C++ nima veze. Se mi zdi, da je tako samo v Javi.
http://www.planet-cnc.com Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 5991
Pridružen: 14 Jan 2015, 11:12
Kraj: Ljubljana
Zahvalil se je: 764 krat
Prejel zahvalo: 2335 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Migracija iz arduino v C

OdgovorNapisal/-a Kroko » 18 Okt 2024, 01:27

Primer1:
1 << 5
če gledamo bite:
1 = 00000001
zamaknemo za 5
00010000
se oravi 16

Primer2:
0<<5
0 = 00000000
sploh nima vsmisla karkoli zamikat, ker je vedno nič

Primer3:
bool pin4_val = PIND & (1 << 4);
PIND = 01010101
1 = 00000001
1 << 4 = 00001000
01010101 &
00001000 =
00000000 oziroma false - se pravi četrti bit v PIND je ugasnjen

Primer4:
PIND = 11001100
1 << 4 = 00001000
11001100 &
00001000 =
00001000 oziroma true - se pravi četrti bit v PIND je prižgan
http://www.planet-cnc.com Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 5991
Pridružen: 14 Jan 2015, 11:12
Kraj: Ljubljana
Zahvalil se je: 764 krat
Prejel zahvalo: 2335 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Migracija iz arduino v C

OdgovorNapisal/-a lojzek » 18 Okt 2024, 16:47

Lovro7 je napisal/-a:Še nekaj mi ni jasno.

Koda: Izberi vse
PORTD =  (1 << PORTD5)


Ali to zamakne vse bite ali samo nastavi PORT5 na 1?

Več kot testiram manj mi je jasno. Ko uporabim zgornji ukaz nastavi samo to vrednost. Ko pa uporabim
Koda: Izberi vse
PORTD = (0 << PORTD4)
pa spremeni vse vrednosti.


Uporabljaj
Koda: Izberi vse
PORTD |= (1<<5);
Postavi 5. bit na 1
Če ne uporabiš |= (OR) operanda, ampak samo =, spremeni cel port.

Huh... za ugasnit posamezni bit bi pa moral komp prižgat in primere pogledat. :_silent sramota. Ampak že pol leta nisem nič delal, pa še nešolan samouk sem ;)

HA, spomnil sem se!,
Koda: Izberi vse
PORTD &= ~(1<<5)
to pa izbriše samo 5. bit. &= je AND operand, znak ~ pa negator (tistega v oklepaju)

Obstaja pa še XOR operand, ki spremeni bit iz enega v drugo logično stanje.
Koda: Izberi vse
PORTD ^= (1<<5);
lojzek
 
Prispevkov: 418
Pridružen: 25 Feb 2015, 13:18
Zahvalil se je: 20 krat
Prejel zahvalo: 127 krat
Uporabnika povabil: Proteus
Število neizkoriščenih povabil: 12

Re: Migracija iz arduino v C

OdgovorNapisal/-a Lovro7 » 02 Nov 2024, 03:13

Nov projekt novi problemi.

Trenutno pišem kodo za inkubator. Uporabljam ATmega8.
Uporabljam knjižico avr/interuppts.

Ko sem postavil prvi interupt za AD pretvornik je vse delovalo.
Koda: Izberi vse
void converte_temp_input(){
    ADCSRA |= (1 << ADSC);
}

ISR(ADC_vect){
    adc_mask = ADC;
    current_temp = ((adc_mask * 40.) / 1024.);
}


Potem pa sem dodal še 2. interupt za Timer0, ki skrbi da ko se cca 30 sekund nič ne spremeni izklopi LCD dobim to napako:
Koda: Izberi vse
wiring.c.o (symbol from plugin): In function `__vector_9':
(.text+0x0): multiple definition of `__vector_9'
.pio\build\ATmega8\src\main.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status


Tukaj je še koda za 2. interupt:
Koda: Izberi vse
void start_lcd_countdown(){
    TIFR = (1 << 0);

    TCCR0 = (1 << 2) | (1 << 1) |(1 << 0);

    sei();
}

ISR(TIMER0_OVF_vect){
    if(rot == previus_rot){
        PORTD &= ~(1 << 6);
    }
}



Kje je problem?
Ali nebi smel 2x uporabiti ISR() čeprav imata različna vektorja?
Vse je lahko žarnica, če je dovolj toka. https://lovro7a.github.io/Lovro7-web/html/home_page.htm
Uporabniški avatar
Lovro7
 
Prispevkov: 160
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 78 krat
Prejel zahvalo: 63 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 4

Re: Migracija iz arduino v C

OdgovorNapisal/-a sundancer » 02 Nov 2024, 17:06

Kot kaže wiring knjižnica že uporablja TIMER0_OVF_vect (vir: https://github.com/arduino/ArduinoCore- ... ring.c#L42 )

Za kaj točno uporabljaš wiring knjižnico?
Dyslexic man walks into a bra.
Uporabniški avatar
sundancer
 
Prispevkov: 931
Pridružen: 16 Jan 2015, 22:36
Kraj: Domžale
Zahvalil se je: 390 krat
Prejel zahvalo: 490 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 59

Re: Migracija iz arduino v C

OdgovorNapisal/-a Lovro7 » 02 Nov 2024, 17:44

Wiring ne uporabljam. Je pa verjetno zravem zaradi tega, ker sem dodal Arduino.h. Tega imam samo zaradi pinov za LCD zaslonu.
Za zamike pa uporabljam _delay_ms() iz avr/delay.h

Bom začasno zakomentiral problematični del koda v wiring.c
Vse je lahko žarnica, če je dovolj toka. https://lovro7a.github.io/Lovro7-web/html/home_page.htm
Uporabniški avatar
Lovro7
 
Prispevkov: 160
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 78 krat
Prejel zahvalo: 63 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 4


Vrni se na Arduino

Kdo je na strani

Po forumu brska: dotbot in 1 gost