Piszę program sterujący zapłonem silnika 3 cylindrowego,
Ma on na celu "emulację" mechanicznego regulatora odśrodkowego kąta wyprzedzenia zapłonu.
Wymyśliłem sobie że tabelę zmiennych zapiszę w PROGMEM, poniżej program testujący rozwiązanie z tabelą.
No i teraz:
Niech mi ktoś proszę powie czy licznik T1 (16bitowy) zwiększa się co 5uS??
Takie obliczenia założyłem w excelu obliczając czas po którym powinien komputerek dać iskrę.
12,8Mhz / prescaler 64 =5uS
zmienna indeks będzie docelowo pobierana z licznika T2 (zwiększającego się co 80uS (prescaler 1024) i jest wskaźnikiem prędkości obrotowej.
Założyłem 459 punktów charakterystyki.
np. dla wskaźnika 300 powinien program zaświecić diodę po 3,1ms i po takim samym czasie ją zgasić. natomiast podstawiając taką wartość w miejsce indeks widzę jak dioda miga około 3 razy na sek.
Puszczając program tak jak poniżej, czyli z zwiększającym się indeksem widzę jak dioda miga coraz wolniej.
teraz jeszcze jedno pytanko, jeżeli stałe z tabeli są 16bitowe to indeks pokazuje początek każdej stałej, czy początek kolejnego bajtu?
No i oczywiście koronne pytanie: Ile trwa odczyt z pamięci PROGMEM.
Tutaj programik testowy
Ma on na celu "emulację" mechanicznego regulatora odśrodkowego kąta wyprzedzenia zapłonu.
Wymyśliłem sobie że tabelę zmiennych zapiszę w PROGMEM, poniżej program testujący rozwiązanie z tabelą.
No i teraz:
Niech mi ktoś proszę powie czy licznik T1 (16bitowy) zwiększa się co 5uS??
Takie obliczenia założyłem w excelu obliczając czas po którym powinien komputerek dać iskrę.
12,8Mhz / prescaler 64 =5uS
zmienna indeks będzie docelowo pobierana z licznika T2 (zwiększającego się co 80uS (prescaler 1024) i jest wskaźnikiem prędkości obrotowej.
Założyłem 459 punktów charakterystyki.
np. dla wskaźnika 300 powinien program zaświecić diodę po 3,1ms i po takim samym czasie ją zgasić. natomiast podstawiając taką wartość w miejsce indeks widzę jak dioda miga około 3 razy na sek.
Puszczając program tak jak poniżej, czyli z zwiększającym się indeksem widzę jak dioda miga coraz wolniej.
teraz jeszcze jedno pytanko, jeżeli stałe z tabeli są 16bitowe to indeks pokazuje początek każdej stałej, czy początek kolejnego bajtu?
No i oczywiście koronne pytanie: Ile trwa odczyt z pamięci PROGMEM.
Tutaj programik testowy
#define F_CPU 12800000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
static const PROGMEM int licznik[]=
{64915,64911,64907,64903,64898,64894,64890,64886,64882,
64878,64874,64870,64865,64861,64857,64853,64849,64845,
....cała tabela ma 459 stałych w zakresie od 64915do 62127....
64841,64836,64832,64828,64824,64820,64816,64812,64808,
64803,64799,64795,64791,64787,64783,64779,64774,64770,
62292,62286,62280,62274,62268,62262,62256,62250,62244,
62239,62233,62227,62221,62215,62209,62203,62197,62191,
62186,62180,62174,62168,62162,62156,62150,62144,62138,
62133,62127
};
volatile unsigned int led,indeks,wys;
SIGNAL (SIG_OVERFLOW1)
{
led=~led;
PORTD=led;
wys=1;
if (indeks<450) { indeks++;};
}
int main(void)
{
DDRD=0xFF; //PORT D jako wyjście
TIMSK=_BV(TOIE1);
TCCR1A=0x00;
TCCR1B=_BV(CS10)|_BV(CS11); //prescaler ck/64
sei(); //uruchomienie przerwań
indeks=0;
wys=1;
while(1) //pętla nieskończona
{
if (wys==1)
{
TCNT1=pgm_read_word(&licznik[indeks]);
wys=0;
}
}
}