Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

Inlägg av jesse »

AlBundy:

När jag ska vill att en AVR-processor ska göra något kul, t.ex. blinka lite lysdioder eller läsa av en temperatur, så vill jag programmera den. Då använder jag:

(1) En programmeringsmiljö.

Denna brukar finnas i form av mjukvara för PC. Till exempel kan man använda Atmel Studio (Den gillar jag!), Arduino's programmeringsmiljö (vad det nu heter?), eller något annat. Man väljer den man känner sig mest bekant med och som man gillar. Så skriver man sitt program i det språk som stöds, t.ex. C. Nu är ju mikrocontrollers lite speciella då man ofta vill använda flera av deras specialfunktioner. Som t.ex. digitala eller analoga in-och utgångar, timers, UART (dvs kommunikation med en annan enhet), EEPROM (minne som inte glöms bort när man stänger av strömmen) med mera. Det är väl främst dessa saker som skrivs olika i Atmel Studio och Arduino. Man får läsa tutorials och lära sig helt enkelt. Läsa databladen till controllern skadar inte heller. Varje typ av controller skiljer sig mer eller mindre från alla andra, både i yttre funktion och i hur man skriver programmet. Så Ett program för ATmega8 funkar inte rakt av för en ATMega1284 eller tvärt om. Men det brukar inte vara några jättestora skillnader. I Atmel Studio måste man skriva in vilken modell man ska programmera.

Alltså skriver vi ett program:

Kod: Markera allt

// blinka lysdiod:

(sätt pinne B2 som utgång) // Definierar vilken pinne som ska sättas som utgång och som är kopplad till lysdioden
loop for ever:
{
      (tänd lysdioden) // dvs. skicka ut en "etta" på rätt pinne.
      (vänta 0.1 sekund)
      (släck lysdioden) // dvs. skicka ut en "nolla" på samma pinne.
}
// the end 
Några exempel:
Bild

Bild

Vi kompilerar koden och får en hex-fil. Den innehåller den kod som ska läggas i processorns Flash-minne.
Bild

(2) Programmering av microkontrollern.

microkontrollern innehåller tre typer av minnen: Flash, RAM och EEPROM.
Flash används till själva programmet och till fasta data som programmeraren lägger in i programmet (t.ex. textfraser, tabeller).
RAM används till data som ska lagras under själva programkörningen.
EEPROM används oftast av programmet för att spara data som inte raderas efter att programmet avslutats (ungefär samma som att spara en fil på en hårddisk, men i EEPROM sparas enskilda variabler eller arrayer)

Hur ska vi då få in programmet i Flash-minnet?

Jo, med hjälp av ISP (= In System Programming). Då ansluts pinnarna MISO, MOSI, SCK och RESET till en programmerare som tar emot data från en PC via t.ex. USB eller serieporten.

AVR-minnet ser ut så här:
Bild

Efter programmering kommer det att se ut så här:
AVR_flash1.png
När man väl har lagt in programmet i Flash-minnet så kan man alltså koppla loss controllern från programmeraren och den kan köras fristående med sitt program. Den klarar sig alltså helt utan USB eller andra anslutningar när den väl programmerats.

Men av någon anledning så vill man ibland kunna programmera sin AVR utan att använda programmeraren. Kanske man inte har någon? Då vill man ha en bootloader. Bootloadern är ett vanligt program som läggs i Flashminnet fast på en speciell reserverad plats, kallad "boot-sektorn". FÖr att få in en bootloader i flash-minnet måste man alltså programmera conrtollern på vanligt vis, dvs. via ISP med en programmerare ohh en hex-fil. Via programmeraren väljer man även att controllern ska starta i boot-sektorn och inte på adress 0000 som den annars gör.

Då ser det ut så här:
AVR_flash2.PNG
Bootloadern är ett program som kan ta emot data via en anna kanal än ISP. Vanligtvis används UART, dvs. seriell kommunikation med pinnarna RX och TX. Dessa kan kopplas via en RS323-krets till serieporten på äldre datorer (RS-232), eller till en USB-krets som ansuts direkt till USB. Om controllern innehåller en egen USB-krets så kan bootloadern använda den.

Nu finns det ledig plats i Flash-minnet där bootloadern inte ligger. Där kan programmet läggas in. Du behöver ett speciellt program som kan kommunicera med bootloadern via USB/sereporten. Bootloadern tar emot data från hex-filen och lägger in det i Flashminnet:
AVR_flash3.PNG
Fördelar med bootloader:
* Du kan programmera utan att använda en separat programmerare.
* Du kan programmera om controllern på distans via internet, om den är uppkopplad.

Nackdelar med bootloader:
* Det finns inte lika mycket ledig plats i Flash-minnet för det egentliga programmet.
* Du måste ha en RS232 eller USB-omvandlare eller ha en AVR med inbyggd USB.
* Ditt lysdiodprogram kan inte starta direkt när du slår på strömmen. Bootloadern startar först och väntar på instruktioner via USB. Om den inte får något inom några sekunder så startas ditt program.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av jesse 23 oktober 2013, 18:50:23, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

Inlägg av sodjan »

Det var ju väldigt seriöst, men är det inte i princip samma
sak som finns i 200+ tutorials "out there" ?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

Inlägg av jesse »

troligtvis. :)
BJ
Inlägg: 8864
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

Inlägg av BJ »

Tack.
(Hade jag sökt tillräckligt hade jag inte behövt fråga... :vissla:)
Miramithe
Inlägg: 1423
Blev medlem: 21 januari 2013, 17:45:10
Ort: Borlänge

Re: Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

Inlägg av Miramithe »

Bra inlägg!

Tack då fick jag lära mig lite oxå.
Dock trög som jag är har jag en fråga.
om man har en arduino så kan man använda den som programmerare (såg en länk i denna tråd, dock har jag inte lusläst den.)
Men kan jag programmera en ATmega genom arduinon med adruino programmet eller måste man ha ett annat program till att skriva programmet till den "tomma" (ATmegan utan bootloader)

Typ så här tänker jag.
Jag vill ha en liten microkontroller att köra standalone. tex släcka fönsterlampan när det blir ljust på morgonen.
Då känns det onödigt att ha en hel Arduino Uno som står där utan man kan bygga programmet först testa på Unon sen programmera det på en standalone ATmega.

Någon som förstår eller är jag bara dum?
Användarvisningsbild
Lennart Aspenryd
Tidigare Lasp
Inlägg: 12607
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

Re: Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

Inlägg av Lennart Aspenryd »

Det är aldrig fel att fråga!

Att det finns en attityd här på forumet som gör att man känner sig så är en sak!

Någon som förstår eller är jag bara dum?

Du har helt rätt! Arduino är en enkel och bra komigångmiljö.
Testa och lek, sedan kör du över applikation till en single kapsel och låter den sköta ljus och tid.

Lycka till säger Lasp
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

Inlägg av sodjan »

Jag tror att Arduino-programmet ska byggas (kompileras) på något lite
speciellt sett för att köras utan bootloader. Jag tror att det finns
web-sidor som beskriver det närmare...
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

Inlägg av Icecap »

Miramithe: jag ser definitivt hellre frågar som denna än frågar från självutnämnda experter som "alla kunniga" inser inte har koll på speciellt mycket.

Nåväl, din fråga:
Jag vet inte nog om Arduino-miljön till att kunde svara på om det går att "flippa en inställning" som säger att bootloadern inte ska med i det hela. Men rent faktisk kan du lägga in båda delar utan problem och då fungerar det normalt (för Arduino).

Men avser du att göra fler småsaker blir det enklare och definitivt billigare att just ta "småkretsar" och bygga egna kretskort och programmera dom via ISP. Som programmeringsenhet kan du använda en Arduino med rätt program i och sedan får du, om det ska vara helt säkert att det kan köra utan att behöva ställa om någonting i Arduino-miljön, skriva och kompilera koden i t.ex. AVR Studio.

Och skillnaden är i grunden minimal - men ändå signifikant.

I Arduino räknar man pinnummer enl. kretskortets numrering medan man i verkligheten använder register för portarna, namnen blir alltså lite annorlunda men det är i grunden allt. Är detta ett problem kan jag tvärsäkert skriva att du kan få hjälp med det här.

Likaså är det en skillnad i själva programskrivningen mellan Arduino-fusket och ANSI C. Ingen stor skillnad men ändå signifikant:
Ett "vanligt" C-program skrivs oftast enl. följande mall:

Kod: Markera allt

void main(void)
  {
  // Först kommer initieringen av portar, variabler osv.
  while(1)
    { // Denna loop kommer att köra i all evighet
    }
  // Hit kommer koden faktisk aldrig om man inte gör fel eller har extrem speciell anledning.
  }
Jag har letat igenom en del hex-koder från kompilers och de flesta har en "låsning" av programkoden i slutet av main, alltså att den inte kommer vidare om man inte har loop'en i main. I C-kod blir det: while(1){};

Detta är det största problem med Arduinons programmeringsspråk, man kan alltså inte portera koden direkt utan att skriva om lite. Och detta är anledningen till att alla som påstår att Arduinons programmeringsspråk minsann är ren C inte har fattat! Och det är ju konstigt att jag, som ganska tydligt är en bakåtsträvande stofil med skygglappar, rent faktisk vet så pass mycket om Arduino att jag har koll på detta medan förespråkarna inte har koll...

Men i stort kommer du inte att ha problem med att konvertera ett Arduino-program till C som kan kompileras i t.ex. AVR Studio och de få problem som kan finnas kan du lätt få hjälp med.
Användarvisningsbild
Wedge
Inlägg: 1026
Blev medlem: 8 juli 2012, 17:33:33

Re: Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

Inlägg av Wedge »

I Arduinomiljön har man redan skrivit main() åt användaren.
Först anropas användarskriven kod i setup(), och sedan körs den eviga whileloopen som anropar den användarskrivna funktionen loop(). Helt vanlig C-kod, och absolut inget märkligt.
Att det redan färdigskrivna konceptet kräver att användaren implementerar en initierings- och en arbetsfunktion gör det inte till ett nytt språk, bara ett arbetssätt.
Gillar man inte det kan man ändra i main(), det är bara vanlig C-kod.
olof_n
Inlägg: 116
Blev medlem: 23 februari 2011, 21:36:46

Re: Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

Inlägg av olof_n »

Om du använder Arduino IDE:t och vill ladda upp koden utan att använda en bootloader väljer du alternativet "Upload using programmer" under File-menyn.
Däremot brukar jag alltid börja med att bränna en bootloader till kretsen eftersom man då får alla "fuses" satta (förenklat är det inställningar över hur kretsen är konfigurerad). '
Bootloadern skrivs sedan över (men inställningarna är kvar) när du programmerar med "upload using programmer".
Liter mer om fuses -> http://www.ladyada.net/learn/avr/fuses.html.

Om man inte vill använda ett dyrt arduinokort som programmerare kan man köpa en (USBasp) för 6:- på Ebay :)
Själv köpte jag en annan programmerare som heter USBTiny för 50:-, tror dock att en USBasp fungerar bra den med.

Jag använder mest arduinokortet om jag vill testa något snabbt.
Att använda ett arduinokort i ett projekt känns rätt onödigt eftersom dom flesta hemmaprojekt i alla fall kräver flera komponenter/kretsar som måste lödas på ett prototypkort (eller monteras på ett riktigt kretskort ifall man vill det).
En Atmega8 kostar ca 5:- om man köper 10st, en Atmega328 14:-, att löda ihop en enkel "arduino" på ett labbkort kostar inte mycket.

Sedan vill jag bara tillägga att det går utmärkt att skriva vanlig AVR-C i Arduino IDE:t. Jag hittar ofta kod på rena AVR-sidor som jag nyttjar i Arduino IDE:et.
Att jag använder "Arduino" överhuvudtaget beror mest på dess fantastiska community samt att det ibland är skönt att kunna nyttja ett färdigt programbibliotek istället för att lägga ner hundratals timmar på att skriva koden själv, särskilt som det är en liten del i ett större projekt.
jfri
Inlägg: 180
Blev medlem: 1 februari 2010, 21:41:20

Re: Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

Inlägg av jfri »

sodjan skrev:> Du menar att jag kan programmera in ett program på processorn via ISP precis som bootloadern?
> Det jag tycker är dåligt med uno är att det verkar inte som att man kan bränna in en
> bootloader om man trycker fast den tomma processorn på uno:n och sen bränner in bootloadern.

Om man förstår hur det fungerar så förstår man att det självklart är så.
Processorn som sitter i en Arduino *MÅSTE* ha en bootloader, hela
Arduino-konceptet bygger på det...
Men i en Arduino IDE finns det ett menyval under 'Tools' som heter 'Burn Bootloader'. Är inte detta just för att programmera kretsen med bootloadern ? Om inte vad är det då ?
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

Inlägg av sodjan »

OK.
Och hur går det då till, om det inte finns en bootloader sedan innan?
Jag antar att Arduinon även har ISP kontakt, men då behövs det
sannolikt något mer hårdvara ("programmerare") som kör ISP'n.
Är det inte en funktion för att uppdatera bootloadern?

Skit samma, svaret finns här: http://arduino.cc/en/Hacking/Bootloader
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

Inlägg av sodjan »

Ja, anledningen till att bootloadern finns där över huvudtaget är ju för att få
en lösning som är i linje med dagens "bara-att-plugga-in-USB-kabeln" koncept.
Ungeför som vilken MP3-spelare eller annan USB-pryl som helst.
olof_n
Inlägg: 116
Blev medlem: 23 februari 2011, 21:36:46

Re: Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

Inlägg av olof_n »

Egentligen är det lika enkelt att ansluta programmerarens sladd till ISP-kontakten som att använda bootloadern.
Jag har inte varit med så länge men kan tänka mig att en programmerare kostade betydligt mer än 6:- när Arduino började lansera sina färdiga kort men USB/Serie interface.
Idag kostar en USB/Serie adapter lika mycket som en ISP-programmerare.

Dessutom tar bootloadern onödigt mycket plats när man jobbar med mikroprocessorer med begränsat flashminne (Attiny, Atmega8 med flera).

Men som jag ser det är inte bootloader = Arduino, utan en del i konceptet som hör till dom färdiga korten som säljs.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Kan jag bygga egen Arduino med ATmega8-16UP kontroller?

Inlägg av sodjan »

> Egentligen är det lika enkelt att ansluta programmerarens sladd till ISP-kontakten som att använda bootloadern.

Inte om du saknar programmerare! Jag gissar att de allra
flesta Arduino ägare/användare saknar en ISP programmerare.

> Idag kostar en USB/Serie adapter lika mycket som en ISP-programmerare.

Men kör inte Arduino-korten USB direkt?
Behövs det en extra USB/RS232 adapter?

> Men som jag ser det är inte bootloader = Arduino, utan en del i konceptet som hör till dom färdiga korten som säljs.

Det är väl samma sak.
Utan korten så faller Arduino-konceptet ganska platt...
Skriv svar