Elektroniikan ohjelmoinnin opiskelu

Viime aikoina alkanut ottaa niin paljon kupoliin tuo, kun ei ole koulussa kunnolla opetettu elektroniikan ohjelmointia, jonka takia moni projekti on jäänyt kesken/tekemättä/seisomaan paikallaan.

Eli nyt olisi tarkoitus alkaa kunnolla opiskella ja oppia ohjelmointia, ja varsinkin C-kieltä, koska alusta jolla kehitän laitteita toimii C-kielellä. Muutenkin C-kieli on mielestäni varmaan paras ohjelmointikieli elektroniikalle.

Onko olemassa jotain kirjallisuutta ja nettisivuja, joiden kautta voisi opiskella elektroniikan C-kieltä? Jos tiedätte jotain sivuja ja kirjoja niin laittakaa tänne ihmeessä, sillä moni muukin on varmasti kiinnostunut ohjelmoinnin opiskelusta.

Osaan ohjelmoida C-kielellä PC-pohjaisia ohjelmia esim. tehdä laskimia ja joitain pikkupelejä kuten lottoarvonta ja bingo eli nollasta en ole aloittamassa tätä ohjelmoinnin opiskelua. Mutta tuo elektroniikan ohjelmointi on erittäin heikolla eli en osaa muuta kuin vilkuttaa ledejä ohjelman avulla, ja joskus vahingossa olen saanut onnistumaan ohjelman, joka lukee kytkin tiedon ja sen jälkeen vilkautta jotain lediä.

Eli apua tarvitaan tämän kanssa. Alusta jota käytän on Porox Xuino-kit. Aika samanlainen kuin Arduino, mikrokontrollerina toimii ATmega32U4 ja ohjelmoinnissa käytetään AVR studiota. Tuolta löytyy tuote jos jotain kiinnostaa.

Itse suosittelen Pentti Vahteran ilmaista Micro-ohjaimen ohjelmointi C-kielellä. Näkyy olevan jälleen saatavilla Microsalon kotisivuilta. Teksti on vanhaa, mutta edelleen toimivaa :slight_smile:

Edit: Ja ennen kuin joku ehtii sanoa, että osta Karvisten kirja Sulautetut, niin älä osta. Tai osta vain jos siltä tuntuu, mutta ei kannata. Arduinon käyttöön on omat syynsä ja on siinä etujakin, mutta uskon että elämä pidemmän päälle on paljon helpompaa jos ensin opettelee komentamaan rautaa C:llä eikä arduinon kirjastoilla.

Kiitos Kelmi tuosta linkistä. Kirjassa opetetaan erittäin hyvin elektroniikan ohjelmointia, ja materiaalia riittää opsikeluun :wink: .

Tuollaista kirjaan en siis osta(Karvinen Sulautetut), jos siitä kerran ei hyötyä ole. Mielestäni siitä ei ole mitään hyötyä jos osaa koodata vain kirjastoilla. Kaiken lisäksi omat opettajani ovat siitä aina meltonneet, että pyrkikää käyttämään mahdollisimman vähän kirjastoja, jotta koodi pysyy tehokkaana.

Tuossa ainakin käyttäjän artikkelia suoraan AVR C koodaukseen.

viewtopic.php?f=15&t=169

Periaatteessa sulautetun koodaaminen ei paljoa eroa PC:lle tehtävästä. Tuossa pitää vain tutkia piirin manuaaleja.

OT:
Kannattaa noita valmistajan kirjastoja käyttää, jos on mahdollista. Yleensä tulevat C koodina eli voi tutkia, jos haluaa optimoida tai tehä omat. Tuossa STM32F4 Discoveryn kanssa käyttänyt MEMS kirjastoa ja prossan omia kirjastoja. Noissa prossan omissa kirjastoissakin joutu tutkimaan manuaalia ihan huolella.

Tämä. Olen kelmin kanssa täysin samaa mieltä :slight_smile:

Jos AVR:n lisäksi kiinnostaa vähävirtaiset prossat, niin MSP430 sarjalaisia on myös helppo ohjelmoida, kun lähtee ihan perusjutuista liikkeelle (kuten täytyy tehdä tuossa mikrosalon opuksessakin, on muuten hyvä). Itse olen kotisivuilleni värkkäillyt nyt reilun vuoden ajan opusta aiheesta MSP430 ohjelmointi C-kielellä. Opas ei ole mikään täydellinen mutta varmaan sillä nyt alkuun pääsee, mene ja tiedä kun ei kauheasti palautetta ole tullut, mitä nyt sarvinen joskus jotain kommentoinut :smiley:

Jos edellä mainitsemani kiinnostaa niin käy vilkasee: MSP430 Mikrokontrollerin ohjelmointi C-kielellä

Sellaista ongelmaa on, kun harjoittelin switch:jen käyttöä.

Eli softan pitäisi toimia siten, että kun painan kytkintä 7 syttyy jokin kuvio ja kun painan kytkintä 6 syttyy toinen kuvio. Näin ei tapahdu, vaan laite sytyttää molemmista napeista saman kuvion. Eli voisiko jokin ystävällisesti auttaa, kun nyt en itse ymmärrä.

Tässä koodi:

[code]/*

  • Switch_harjoitus.c
  • Created: 5.3.2013 9:35:44
  • Author: ChaosH
    */

#include <avr/io.h> //kirjastojen lisääminen
#include <util/delay.h>

int main(void)
{
DDRB = 0b00111111; // Portin B 7 ja 6 tuloja loput lähtöjä
unsigned char kytkin, arvo; // luodaan muuttujat kytkin ja arvo
while(1)
{
kytkin = PINB; // Luetaan Portin B tila kytkimen arvoksi

	if (kytkin > 63) // Jos kytkin 7 tai 6 painetaan mennään switchiin
	{
		PORTB = 0x44; 
	}
	arvo = kytkin; 
	
	switch(arvo)
	{
		case 64: // tila 1 kun kytkin 6 painettuna
		PORTB = 0x55;
		break;
	
		case 128: // tila 2 kun kytkin 7 painettuna
		PORTB = 0x77;
		break;
		
		default: PORTB = 0x11; // jos mitään ei paineta niin tällainen kuvio
		
	}
}

}
[/code]

Tosiaan tuosta voisi maskata lähdön arvot pois

" arvo = kytkin & 0xC0; "

Edit:
Vielä sellanen, että pulluppi kytkeytyy portin B 6 pinniin kirjoituksilla 0x55 ja 0x77 (0x40)

Edit2:
Korjattu koodi

[code]/*

  • Switch_harjoitus.c
  • Created: 5.3.2013 9:35:44
  • Author: ChaosH
    */
    #include <avr/io.h> //kirjastojen lisääminen
    #include <util/delay.h>

int main(void)
{
DDRB = 0b00111111; // Portin B 7 ja 6 tuloja loput lähtöjä
unsigned char kytkin, arvo; // luodaan muuttujat kytkin ja arvo
while(1)
{
kytkin = PINB; // Luetaan Portin B tila kytkimen arvoksi

    if (kytkin > 63) // Jos kytkin 7 tai 6 painetaan mennään switchiin
    {
         PORTB = 0x44 & 0x3F; // Maskataan inputit pois;
    }
    arvo = kytkin & 0xC0;
  
    switch(arvo)
    {
       case 0x40: // tila 1 kun kytkin 6 painettuna
       PORTB = 0x55 & 0x3F; // Maskataan inputit pois
       break;
     
       case 0x80: // tila 2 kun kytkin 7 painettuna
       PORTB = 0x77 & 0x3F; // Maskataan inputit pois
       break;

       case 0xC0: // tila 3 kun kytkin 6 ja 7 painettuna
       // Tila pysyy samana
       break;
         
       default: PORTB = 0x11; // jos mitään ei paineta niin tällainen kuvio
        
    }
}

}
[/code]

Kiitoksia Limba, laite toimii kuin pitää.

Oon sitä mieltä, että jos C on hanskassa, niin paras tapa oppia on ottaa ohjelmoitavan prossun datasheet kätöseen ja tavailla sitä. Tämä on siis vain oma mielipide. Itse juuri opettelen C/C++ @ MBED. Ammatiltani olen elektroniikkasuunnittelija eli tämä on vain harrastus :unamused: Koulussa aikoinaan on kyllä tullut käytyä C ja Java peruskurssit.

Joskus kesätöissä ohjelmoin PICejä assemblyllä ja se oli kyllä opettavaista ainakin rautasuunnittelijan näkökulmasta. Samalla ymmärsi millaista koodia se C-kääntäjä suoltaa ulos. Samoin osaa nyt arvostaa korkeamman tason (C:hän ei vielä ole kovin korkean tason kieli) kielen tuomaa etua ilmaisuvoimassa - perus-tyyppimuunnokset ja loopit tekee muutamalla rivillä koodia :slight_smile:

Hienoa!

Joku on samaa mieltä minunkin kanssani. Ensin opeteltakoon C PC:llä. Silloin on apupyörät ja kaikki muut kivat tuet turvana. GCC antaa ihania virheilmoituksia, netti osaa tukea jne. Tehdään Fizz-buzz-zoom harjoitteita, kokeillaan miten Hello world muuttuu Goodbye worldiksi. jne. Sitten oisi tietorakennehäkkyrät, C:n tapauksessa vielä pointterit, castaukset ja funktiopointterit.

Sitten mennään mikrokoiran kimppuun. Otetaan se toteutuksen manuaali ja kehityskalujen manuaali kiltisti kouraan. Ja sama uudelleen. Vilkutetaan LEDejä jne.

Se on pitkä ja kivinen tie. Yhdessä päivässä ei tapahdu ihmeitä. Ja jos vielä silloin kun tuntuu jotain osaavan tuntuu homma mielekkäältä ja ei kokoajan huuda ATK:lle räkä näytölle lentäen, niin sitten aletaan sielun puhdistusriitti.

Luetaan assembleria, tungetaan assya omiin ohjelmiin tiukkiin paikkoihin ja tunnetaan, kuinka mikrokontrollerin kellojaksot värähtelevät läpi oman tajunnan. Silloin ollaan valaistumassa. On näet hieno tunne kun tuntee olevansa mikrokontrollerinsa herra.

Ja hitec jos oikeasti kiinnostaa sisuskalut niin vilkaise Forthia. Se on simppeli. dataa, kaksi pinoa ja linkitetty lista. ja sillä voi tehdä veikeitä juttuja. Monet elektroonikot ovat kehuneet sitä. Näköjään löytyy mbed.org/cookbook/MbedForth

Tjooh no oikeastaan haluan ohjelmoinnin suhteen selvitä nyt mahdollisimman vähällä eli varmaan C/C++ pitäisi jollain tasolla opetella. Sisuskaluista sen verran, että kun elektroniikkasuunnittelija olen, niin minua kiinnostaa enemmän ohjelmoitava logiikka (FPGA/CPLD/VHDL jne.). http://opencores.org/projects:sta löytyy sorsaa. Jos oikeasti haluaa tutustua prossun sisuskaluihin niin esim. tämä projekti: http://opencores.org/or1k/Main_Page. Sieltä voi tavailla miten prossu rakentuu :slight_smile:

Pitää sanoa että C on kohtuu helppoa, kun vertaa VHDL koodiin.
Tai no kummassaki kompleksisuus kasvaa, kun järjestelmä kasvaa :slight_smile:

VHDL:ssä kannattaa muistaa, että miten mennään aikatasossa. Eli koko prosessi suoritetaan yhellä kellojaksossa, kun normi softassa mennään järjestyksessä koodia läpi.

Varmaan helpompi harrastelijan käyttää schemaa toppi tasolla, missä ei ole oikeastaan mitään logiikkaa vaan yhistellään lohkoja toisiinsa.

Melkeen OT:
Nyt ite olen töissä FPGA supporttina softareille ja samalla bugin metästystä. FPGA koodi + image tulee alihankkijalta.

Joo, mutta C:llä (tai millä vaan muulla kielellä) ohjelmoidaan valmista prosessoria, kun taas vaikka juuri VHDL:llä voi tehdä oman prosessorin ja sitten ohjelmoida sitä vaikka C:llä. Toki kääntäjä pitää myös koodata jos käskykanta poikkeaa muista prossuista :slight_smile: Mutta joo toki toikin pätee, että kun tekee suoraan digitaalilogiikkaa, niin voi päättää mitä tapahtuu milläkin kelloreunalla.

Ja onhan sitä System-C:tä ja vaikka mitä, mutta oleellista on ymmärtää, että VHDL:llä tehdään rautaa (samalla tavalla kuin kirjottaisi skriptillä piirilevyä), mutta normaalilla C-tms. koodilla tehdään käskyjä valmiille raudalle.

Itse on myös tullut käytyä sellainen c-kielen ohjelmoinnin peruskurssi PC ohjelmointiin koulun penkillä. Tuo on kyllä totta, että mikro-ohjaimen ohjelmointi on helpompaa, kun on sen datalehti kätösissä.

Mutta yksi asia on tuosta minun mikro-kontrollerin datalehdestä jäänyt lyhyeksi ja se on SPI:n käyttö, ja tuossa microsalon kirjassa on myös jäänyt aika lyhyeksi tuon SPI:n käyttö. Löytyisikö tuosta SPI:n käytöstä enemmän tietoa c-kielellä, sillä haluaisin todella oppia sen käytön.

SPI on SPI vähän joka paikassa. MasterOutSlaveIn MasterInSlaveOut ChipSelect ClocK
ovat MOSI, MISO, CS ja CK. GND:t ja Vcc tarviit myös. Noilla kuudella + resetillä ohjelmoidaan Atmeli jos niikseen tulee :slight_smile:

Ja jos juuri tietyssä mikrokontrollerin datalehdessä on jätetty vajaaksi, niin ota vastaavan datalehti ja katso siitä. Rekisterit voi olla vähän eri lailla ja sellaista, mutta muuten aina soi.

wikipedia kouraan tai katsoon sorsia jostain bitbang toteutuksesta. Silloin hiffaa hyvin miten sitä puhutaan.

Tai jonkin SPI ohjattavan laitteen datalehti.

Tässä on tullut nyt jonkin verran opiskeltua tätä ohjelmointia, ja alkaa homma kyllä pikku hiljaa luistamaan.

Nyt olisi tarkoituksena rakentaa itse jonkinlainen MP3 soitin, mutta nyt on vain ongelmana, että miten se audio toistetaan. Teoriassa ymmärrän ja osaan, mutta käytäntö ei onnistu :imp:
Joten osaisiko joku antaa jotain sivuja ja ohjeita tämän audion toistoon. Ja mieluiten C-kielellä. Ja kaikki tavat käy PWM, SPI mitä niitä nyt on.

Jonkinlaisen DACin (digital to analog converter) tarviit siihen. Se voi olla SPI:n tms. päässä tai audion tapauksessa yleisesti käytetyn I2S:n päässä. Se on hieman kuin laajennettu SPI, jossa kanavavalinnalle on oma signaali. Tuossa esim. yksi: http://www.ti.com/lit/ds/symlink/pcm1794.pdf.

Puratko sen MP3:n jollain mikrokontrollerilla vai miten meinasit toteuttaa? Millainen output? Ts. kuulokkeet, vahvistin vai kaiutin? MP3-soittimesta voi tietty avata oman projekti-threadin.

Täältä löytyy audio-DIY-dataa: http://www.diyaudio.com/forums/

kontrollerilla on turha alkaa ruveta purkamaan mp3 datastreamia. mielummin sillä kirjoitat sen datan SPI:n kautta audiopiirille, joka tukee MP3 purkua. Jos softalla haluat purkaa niin kellot olis hyvä olla siinä 100-200 MHz ja rautakertoja tai FPGA:ta kehiin :slight_smile:

Esim toi piiri vois olla soppeli hommaan:
vlsi.fi/en/products/vs1011.html

Tuo syö datan ja ohjauksen SPI:n kautta

Tein tästä nyt oman aiheen projektiosioon kun oon USB DACia funtsinut jo jonkin aikaa: http://www.ruuvipenkki.fi/foorumi/viewtopic.php?f=3&t=1016

Hyvä Hitec kun teit tuon topikin. Saadaan siitäkin sitten suomenkielistä tietoa edes jonkinlaista. Pitänee kirjoittaa sinne jotain omaa ‘tietoa’ ja asioita joita olen tuosta DAC:ista katsellut.

Limba:
Yritän nyt alkuun toteuttaa tuon MP3 soittimen SPI:llä. Seuraavaan projektiini tulen käyttämään tuota MP3 soittimen pohjaa, mutta siinä voi olla, että ääni ei pysy mukana SPIn hitauden takia. Ehkä joudun sen toteuttamaan PWM:llä.

Itselläni on muuten pari kappaletta noita VS1011 ja niitä aion käyttää MP3 soittimessani.

Huomenna alkaa tuon MP3 soittimen ohjelmointi, joten katsotaan mitä tapahtuu. Sitten vasta teen tästä MP3 soittimesta oman topikin, kunnes saan jotain aikaiseksi esim. ääntä pihalle laitteista.