Al: inte det minste - det ville bli desto mer jobb till vi som kan använda annat än uråldriga 8-bitars processorer - så jag stöttar gärna din dröm. Räkna dock med att hitta ett jobb inom snabbmatsindustrin eller liknande om ditt levebröd ska vara industriprodukter baserat på Arduino...
Om du inte känner till Moore's lag kan det vara dags att berätta om den: ung. var 18 månader har IC-kretsars kapacitet fördubblats. Detta betyder att där man för 18 månader sedan kanske kunde klämma in 2 processorkärnor (CPU) i en krets kan man nu kasta in 4 st utan att svettas.
Samtidig är det så att man inte betalar speciellt mycket för funktionen i en krets, man betalar för kisleytan kretsen tar. Detta betyder att en uråldrig ATmega från 1800-talet är alldeles för dyr i förhållandet till prestanda.
Ett exempel jag var med om med några examensjobbare:
För att uppdatera ett styrkort tittade de på en ATmega2560V-16AU och hade nog beslutat sig för att använda den gamla härken. Sedan kom jag in och gjorde lite kontroll gentemot Renesas RX210:
RAM - AVR:8kB RX210:64kB
Flash - AVR:256kB RX210:512kB
EEPROM - AVR:4kB RX210:8kB
Hastighet - AVR:16MHz RX210:50MHz
Busbredd - AVR:8 bit RX210:32 bit
Pris - AVR:162,78 RX210:111,25 (Farnell-priser då de har båda kretsar)
Enda stället AVR'n slår Renesas'en är på priset, allt annat är den hopplöst långt efter med.
Och båda har gratis C-kompilers tillgängliga, båda ska ha ström och lite avkoppling och kan programmeras via ISP.
Räknar man: Faktor = Pris / (Exekveringshastighet * Busbredd) blir förhållandet mellan AVR och Renesas ~1:18,3, alltså 1 poäng till AVR och 18,3 till Renesas. AVR är alltså drygt 18 gångar så dyr för samma prestanda som Renesas.
OK, jag vet om att just ATmega2560 är en gammal härk så det är lite orättvist att jämföra dom direkt - men det är vad kunden till slutprodukten kommer att göra: billigast och bäst (i den ordning!) är kravet.
Vill man kan man välja en RX600, den tuggar på i 100MHz och det finns ARM och andra som lätt överstiger den frekvens och ändå håller en skaplig prisbild.
Och nu kommer det roliga: för att bränna ner programmet i kretsen flippar jag en brytare, klickar på en knapp på ett program och väntar 9 sekunder. Sedan flippar jag brytaren tillbaka och allt kör (om jag inte har klantat mig). Inom kort kommer jag inte ens att behöva flippa brytaren, det kommer att ske automatisk och då kommer HEX-filen att övervakas så att om den förnyas (en lyckad kompilering) kommer den att flashas in automagisk om den option är vald.
Och detta med en RX210. Den kör med intern klocka på 50MHz, inte hyperexakt (±1%) men det duger åt mig, ingen kristaller eller liknande.
Lite exempel på programmet i den:
Kod: Markera allt
// Capture 0/In 0 on P25, MTIOC4C, input
#define In_0 PORT2.PIDR.BIT.B5
#define In_0_D PORT2.PDR.BIT.B5
#define PORT25 USED_AS_INPUT
#define PORT25_INIT false
// Capture 1/In 1 on P24, MTIOC4A, input
#define In_1 PORT2.PIDR.BIT.B4
#define In_1_D PORT2.PDR.BIT.B4
#define PORT24 USED_AS_INPUT
#define PORT24_INIT false
Då har jag definierat två pinnar: "In_0" och "In_1".
Läsning är som följer: if(In_0)...
Samma sak med output-definitionerna, ingen simpla pinnummer á la Arduino, jag ger dom riktiga namn!
Detta är gjort i en separat fil som definierar alla pinnar och all hårdvara på det kretskort, för olika projekt kan jag sedan bara ladda in den och saken är biff, jag behöver aldrig göra om det jobb.
Kod: Markera allt
void main(void)
{
Initiate_System_Clock(); // Make it run on HOCO - which speeds it up quite a bit
Initiate_Ports(); // Set port to an known initial state
Initiate_Hardware(); // Initiate special hardware functions
Initiate_Variables(); // Set up variables and buffers
Initiate_RS232_B(9600); // Start RS232 channel B
Initiate_RS485(9600); // Start RS485 channel
// IIC_Initiate(); // Initiate I2C thus enabling access to RTC & EEPROM
// RTC_Initiate(); // Set up (or just check it) RTC (DS3232)
// Initiate_EEPROM(); // Really just check the current size of EEPROM
One_Wire_Initiate(); // Actually just prepare timer
Initiate_System_Timer(); // Start the system timer
Initiate_AD();
Send_RS232_B_Buffer("\f\rStarting program \r\n");
Display.Power_Control = true;
Initiate_Display_PWM(1, false, SMALL_DISPLAY_SCAN_LINES);
Display_Set_Intensity(10);
// Mycket mer här...
Lite kodstart. Är det så svårt att förstå? Vissa saker är kommenterat ut då jag inte har klar allt än men jag jobbar på det.
Jag vill påstå att det inte är speciellt olikt Arduino-programmering förutom att det inte baseras på färdiga förtuggade funktioner av tveksam kvalitet, allt mitt baseras på
egna rutiner av tveksam kvalitet.