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. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 241
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 109 krat
Prejel zahvalo: 71 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 5

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: 2926
Pridružen: 18 Jan 2015, 20:20
Kraj: Ljubljana
Zahvalil se je: 103 krat
Prejel zahvalo: 1185 krat
Uporabnika povabil: s54mtb
Število neizkoriščenih povabil: 230

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. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 241
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 109 krat
Prejel zahvalo: 71 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 5

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: 581
Pridružen: 12 Feb 2015, 12:47
Kraj: Ljubljana
Zahvalil se je: 88 krat
Prejel zahvalo: 204 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 204

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. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 241
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 109 krat
Prejel zahvalo: 71 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 5

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: 2356
Pridružen: 17 Jan 2015, 23:12
Kraj: Črnomelj
Zahvalil se je: 261 krat
Prejel zahvalo: 750 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. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 241
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 109 krat
Prejel zahvalo: 71 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 5

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. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 241
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 109 krat
Prejel zahvalo: 71 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 5

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: 581
Pridružen: 12 Feb 2015, 12:47
Kraj: Ljubljana
Zahvalil se je: 88 krat
Prejel zahvalo: 204 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 204

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: 2356
Pridružen: 17 Jan 2015, 23:12
Kraj: Črnomelj
Zahvalil se je: 261 krat
Prejel zahvalo: 750 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: 581
Pridružen: 12 Feb 2015, 12:47
Kraj: Ljubljana
Zahvalil se je: 88 krat
Prejel zahvalo: 204 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 204

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. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 241
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 109 krat
Prejel zahvalo: 71 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 5

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: 2356
Pridružen: 17 Jan 2015, 23:12
Kraj: Črnomelj
Zahvalil se je: 261 krat
Prejel zahvalo: 750 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: 6003
Pridružen: 14 Jan 2015, 11:12
Kraj: Ljubljana
Zahvalil se je: 764 krat
Prejel zahvalo: 2340 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: 6003
Pridružen: 14 Jan 2015, 11:12
Kraj: Ljubljana
Zahvalil se je: 764 krat
Prejel zahvalo: 2340 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: 447
Pridružen: 25 Feb 2015, 13:18
Zahvalil se je: 21 krat
Prejel zahvalo: 140 krat
Uporabnika povabil: Proteus
Število neizkoriščenih povabil: 14

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. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 241
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 109 krat
Prejel zahvalo: 71 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 5

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: 933
Pridružen: 16 Jan 2015, 22:36
Kraj: Domžale
Zahvalil se je: 391 krat
Prejel zahvalo: 493 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. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 241
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 109 krat
Prejel zahvalo: 71 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 5

Re: Migracija iz arduino v C

OdgovorNapisal/-a Lovro7 » 17 Nov 2024, 03:06

Za vajo sem prepisal staro kodo za krmiljenje varilnega aparata v čisti C. Ker nova koda uporablja 1100B namesto 16kB bom uporabil ATmega8A.

Skrbi me del, ki pretvori vrednost analognih vhodov v čas.

Ali obstaja simulator za druge AVR-je? Drugače uporabljam wokwi arduino simulator ampak imata ATmega8A in 328 nekaj drugačnih registrov.
Za testiranje ne morem uporabiti stare tiskanine zaradi ohišja čipa.

Še vedno pa mi ni jasno, kako je lahko NPN tranzistor vklapljal drug tranzistor med emitterjem in bazo...včasih imam več sreče kot pameti.

Koda: Izberi vse
#define F_CPU 8000000L

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>


#define MAX_PRE_GAS_TIME 30000 //ms
#define  MAX_AFTER_GAS_TIME 45000 //ms
#define MAX_DOT_WELD_TIME 30000 //ms
#define MAX_PULSE_WELD_TIME 30000 //ms
#define TRANSFORMATOR_TO_WIRE_DELAY 100 //ms
#define MOTOR_STARTUP_PULSE_TIME 50 //ms

#define REAL_MAX_PRE_GAS_TIME (MAX_PRE_GAS_TIME / 2)
#define REAL_MAX_AFTER_GAS_TIME (MAX_AFTER_GAS_TIME / 1000)
#define REAL_MAX_DOT_WELD_TIME (MAX_DOT_WELD_TIME / 2)
#define REAL_MAX_PULSE_WELD_TIME (MAX_PULSE_WELD_TIME / 2)


unsigned int pre_gas_time = 0;
uint8_t after_gas_time = 0;
unsigned int dot_weld_time = 0;
unsigned int pulse_weld_time = 0;
unsigned int delay_time = 0;
unsigned int current_delay_time = 0;
uint8_t bit_mask = 0;
uint8_t current_gas_delay = 0;
char motor_started = 0;

void delay_long(unsigned int ms){
   delay_time = ms;
   TCCR0 = (1 << CS01) | (1 << CS00);
   while (current_delay_time < delay_time){
      //Do nothing
   }
   current_delay_time = 0;
   TCCR0 = 0x00;
}

void stop_after_gas(){
   TCCR1B |= (1 << CS12);
}

void initADC() {
   ADMUX = (1 << REFS0);
   ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
}

uint16_t readADC(uint8_t channel) {
   ADMUX = (ADMUX & 0xF0) | (channel & 0x0F);
   ADCSRA |= (1 << ADSC);
   while (ADCSRA & (1 << ADSC));

   return ADC;
}


void startWelding(){
   PORTD |= (1 << PORTD1); //release gas
   delay_long(pre_gas_time);
   PORTD |= (1 << PORTD0); //release current
   _delay_ms(TRANSFORMATOR_TO_WIRE_DELAY);
   DDRD |= (1 << DDRD3) | (1 << DDRD4); //connect motor and motor pulse to ground
   _delay_ms(MOTOR_STARTUP_PULSE_TIME);
   DDRD &= ~(1 << DDRD4); //disconnect motor pulse
}

void endWelding(){
   DDRD &= ~(1 << DDRD3); //disconnect motor
   _delay_ms(TRANSFORMATOR_TO_WIRE_DELAY);
   PORTD &= ~(1 << DDRD0); //stop current
   stop_after_gas();
}



int main(void) {
   //TIMER0
   TIMSK |= (1 << TOIE0);
   TIFR |= (1 << TOV0);
   sei();
   
   //TIMER1
   TCCR1B = (1 << WGM12);
   OCR1A = 31250;
   TIMSK |= (1 << OCIE1A);
   TIFR |= (1 << OCF1A);
   sei();
   
   DDRD = (1 << DDRD1) | (1 << DDRD0);
   PORTD &= ~((1 << PORTD3) | (1 << PORTD4)); //Disable pullup for motor and motor pulse
   
   initADC();

   while (1) {
      pre_gas_time = (readADC(2) * REAL_MAX_PRE_GAS_TIME) / 1023;
      after_gas_time = (readADC(3) * REAL_MAX_AFTER_GAS_TIME) / 1023;
      dot_weld_time = (readADC(4) * REAL_MAX_DOT_WELD_TIME) / 1023;
      pulse_weld_time = (readADC(5) * REAL_MAX_PULSE_WELD_TIME) / 1023;
      
      //wire release
      bit_mask = PIND;
      if(!((bit_mask >> 5) & 0x01)){
         DDRD |= (1 << DDRD4);
      }
      else{
         DDRD &= ~(1 << DDRD4);
      }
      
      //gas release
      bit_mask = PIND;
      if(!((bit_mask >> 6) & 0x01)){
         PORTD |= (1 << PORTD1);
      }
      else{
         PORTD &= ~(1 << PORTD1);
      }
      
      //classic welding
      if(dot_weld_time < 50 && pulse_weld_time < 50){
         bit_mask = PIND;
         if(!(bit_mask >> 2) & 0x01){
            startWelding();
            bit_mask = PIND;
            while(!((bit_mask >> 2) & 0x01)){
               bit_mask = PIND;
               //wait
            }
            endWelding();
         }
      }
      //dot welding
      if(dot_weld_time > 50 && pulse_weld_time < 50){
         bit_mask = PIND;
         if(!((bit_mask >> 2) & 0x01)){
            startWelding();
            delay_long(dot_weld_time);
            endWelding();
            bit_mask = PIND;
            while(!((bit_mask >> 2) & 0x01)){
               bit_mask = PIND;
               //wait
            }
         }
      }
      //pulse welding
      if(dot_weld_time > 50 && pulse_weld_time > 50){
         bit_mask = PIND;
         if(!((bit_mask >> 2) & 0x01)){
            bit_mask = PIND;
            startWelding();
            while(!((bit_mask >> 2) & 0x01)){
               bit_mask = PIND;
               delay_long(dot_weld_time);
               
               //turn motor and current off
               DDRD &= ~(1 << DDRD3);
               _delay_ms(TRANSFORMATOR_TO_WIRE_DELAY);
               PORTD &= ~(1 << PORTD0);
               
               delay_long(pulse_weld_time);
               
               //turn motor and current on
               PORTD |= (1 << PORTD0); //release current
               _delay_ms(TRANSFORMATOR_TO_WIRE_DELAY);
               DDRD |= (1 << DDRD3) | (1 << DDRD4); //connect motor and motor pulse to ground
               _delay_ms(MOTOR_STARTUP_PULSE_TIME);
               DDRD &= ~(1 << DDRD4); //disconnect motor pulse
            }
            endWelding();
         }
      }
   }

}

ISR(TIMER0_OVF_vect){
   current_delay_time++;
}
ISR(TIMER1_COMPA_vect){
   current_gas_delay++;
   if(current_gas_delay >= after_gas_time){
      TCCR1B &= ~(1 << CS12);
      PORTD &= ~(1 << PORTD1);
      current_gas_delay = 0;
   }
}

Vse je lahko žarnica, če je dovolj toka. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 241
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 109 krat
Prejel zahvalo: 71 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 5

Re: Migracija iz arduino v C

OdgovorNapisal/-a Kroko » 17 Nov 2024, 22:42

current_delay_time in current_gas_delay spremenljivki obvezno deklariraj kot "volatile".

Ali obstaja simulator za druge AVR-je?

Zakaj pa delaš direktno z registri? Je grdo, neskalabilno, slabo razumljivo...
Zakaj se ti zdi " ADCSRA |= (1 << ADSC);" bole kot "analogRead()"? Niti pod razno to ni "čisti C".

Pa tudi sicer:
https://en.wikipedia.org/wiki/Hardware_abstraction
oziroma HAL je bil "izumljen" ravno zato, da ločiš funkcionalnost programa od črevesja.

Poglej, kako je Tilen to lepo naredil v svoji LwBTN knjižnici.
https://docs.majerle.eu/projects/lwbtn/en/latest/
Tako lahko simulira delovanje svoje knjižnice kar na PC-ju, kar je ultimativni debug.

In ne, to ni kompliciranje. Če spraviš skupaj nekaj špageti kode še nisi programer, pa tudi če koda deluje.

Če želiš, lahko pomagam. Konec koncev izgleda program precej enostavno
http://www.planet-cnc.com Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 6003
Pridružen: 14 Jan 2015, 11:12
Kraj: Ljubljana
Zahvalil se je: 764 krat
Prejel zahvalo: 2340 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Migracija iz arduino v C

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

Kroko je napisal/-a:current_delay_time in current_gas_delay spremenljivki obvezno deklariraj kot "volatile".

Ali obstaja simulator za druge AVR-je?

Zakaj pa delaš direktno z registri? Je grdo, neskalabilno, slabo razumljivo...
Zakaj se ti zdi " ADCSRA |= (1 << ADSC);" bole kot "analogRead()"?


Seveda je lažje uporabiti analogRead() ampak raje malo več razmišljam. Škodilo mi ne bo.

Kroko je napisal/-a:Pa tudi sicer:
https://en.wikipedia.org/wiki/Hardware_abstraction
oziroma HAL je bil "izumljen" ravno zato, da ločiš funkcionalnost programa od črevesja.

Brez njega bi bilo programiranje 100x težje. Nima pa na primer Arduino.h in podobne knjižnice vseh funkciji, ki jih ponuja mikrokrmilnik (TIMER1, TIMER2, FAST PWM, merjenje notranje temperature...).

Kroko je napisal/-a:Poglej, kako je Tilen to lepo naredil v svoji LwBTN knjižnici.
https://docs.majerle.eu/projects/lwbtn/en/latest/
Tako lahko simulira delovanje svoje knjižnice kar na PC-ju, kar je ultimativni debug.


Bom poizkusil, kako deluje.
Vse je lahko žarnica, če je dovolj toka. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 241
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 109 krat
Prejel zahvalo: 71 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 5

Re: Migracija iz arduino v C

OdgovorNapisal/-a Kroko » 18 Nov 2024, 02:54

Lovro7 je napisal/-a:Seveda je lažje uporabiti analogRead() ampak raje malo več razmišljam. Škodilo mi ne bo.

Nisem rekel, da moraš uporabiti analogRead() ampak da ne uporabljaj ADCSRA |= (1 << ADSC);

Lovro7 je napisal/-a:Brez njega bi bilo programiranje 100x težje. Nima pa na primer Arduino.h in podobne knjižnice vseh funkciji, ki jih ponuja mikrokrmilnik (TIMER1, TIMER2, FAST PWM, merjenje notranje temperature...).

Tudi tega, da uporabljaj Arduino.h nisem nikoli napisal.

Moji odgovori so precel bolj globoki, kot se zdi na prvi pogled. Verjamem pa, jih ni veliko, ki bi jih razumeli.
Vprašaj NacMan-a, kako ga sekiram da mora vsako malenkost narediti tako, kot je prav.

Lahko pripravim online tečaj, na katerem bom tvojo kodo za varilni aparat poštimal, tako, kot je treba. (edino moj code style ja malo specifičen in ni tipično C-jevski saj ga uporabljam tudi v drugih jezikih).
http://www.planet-cnc.com Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 6003
Pridružen: 14 Jan 2015, 11:12
Kraj: Ljubljana
Zahvalil se je: 764 krat
Prejel zahvalo: 2340 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Migracija iz arduino v C

OdgovorNapisal/-a valter » 18 Nov 2024, 16:26

Kroko je napisal/-a:
Lovro7 je napisal/-a:Seveda je lažje uporabiti analogRead() ampak raje malo več razmišljam. Škodilo mi ne bo.

Nisem rekel, da moraš uporabiti analogRead() ampak da ne uporabljaj ADCSRA |= (1 << ADSC);

Lovro7 je napisal/-a:Brez njega bi bilo programiranje 100x težje. Nima pa na primer Arduino.h in podobne knjižnice vseh funkciji, ki jih ponuja mikrokrmilnik (TIMER1, TIMER2, FAST PWM, merjenje notranje temperature...).

Tudi tega, da uporabljaj Arduino.h nisem nikoli napisal.

Moji odgovori so precel bolj globoki, kot se zdi na prvi pogled. Verjamem pa, jih ni veliko, ki bi jih razumeli.
Vprašaj NacMan-a, kako ga sekiram da mora vsako malenkost narediti tako, kot je prav.

Lahko pripravim online tečaj, na katerem bom tvojo kodo za varilni aparat poštimal, tako, kot je treba. (edino moj code style ja malo specifičen in ni tipično C-jevski saj ga uporabljam tudi v drugih jezikih).

Waw to bi pa bilo nekaj res dobrega
valter
 
Prispevkov: 1050
Pridružen: 21 Jan 2015, 10:52
Kraj: Lokev,Predgrad,Boa
Zahvalil se je: 147 krat
Prejel zahvalo: 205 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 22

Re: Migracija iz arduino v C

OdgovorNapisal/-a VolkD » 18 Nov 2024, 17:12

valter je napisal/-a:Waw to bi pa bilo nekaj res dobrega
+1
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 66116
Pridružen: 29 Dec 2014, 19:49
Kraj: Kačiče (Divača)
Zahvalil se je: 19539 krat
Prejel zahvalo: 10088 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 254

Re: Migracija iz arduino v C

OdgovorNapisal/-a Lovro7 » 18 Nov 2024, 20:37

Kroko je napisal/-a:
Lovro7 je napisal/-a:Seveda je lažje uporabiti analogRead() ampak raje malo več razmišljam. Škodilo mi ne bo.

Nisem rekel, da moraš uporabiti analogRead() ampak da ne uporabljaj ADCSRA |= (1 << ADSC);

Lovro7 je napisal/-a:Brez njega bi bilo programiranje 100x težje. Nima pa na primer Arduino.h in podobne knjižnice vseh funkciji, ki jih ponuja mikrokrmilnik (TIMER1, TIMER2, FAST PWM, merjenje notranje temperature...).

Tudi tega, da uporabljaj Arduino.h nisem nikoli napisal.

Moji odgovori so precel bolj globoki, kot se zdi na prvi pogled. Verjamem pa, jih ni veliko, ki bi jih razumeli.
Vprašaj NacMan-a, kako ga sekiram da mora vsako malenkost narediti tako, kot je prav.

Lahko pripravim online tečaj, na katerem bom tvojo kodo za varilni aparat poštimal, tako, kot je treba. (edino moj code style ja malo specifičen in ni tipično C-jevski saj ga uporabljam tudi v drugih jezikih).


Večino razumem, mi pa še dosti znanja manjka.
Najprej bom naredil breakout board in tam preizkusil če dela.

Drugače pa bi bilo odlično poslušati ta tečaj. Če boš organiziral se vidimo.
Vse je lahko žarnica, če je dovolj toka. http://lovro7.eu/index.html
Uporabniški avatar
Lovro7
 
Prispevkov: 241
Pridružen: 11 Feb 2024, 20:19
Zahvalil se je: 109 krat
Prejel zahvalo: 71 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 5


Vrni se na Arduino

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost