Próbuję przepisać program który kiedyś napisałem w asemblerze na C. Program to prosty woltomierz - pomiar przez przetwornik a/c, następnie porównanie zmierzonego napięcia z pierwszą tablicą 16 bitową w której są umieszczone przedziały napięć a następnie odczytanie z drugiej liczby kroków odpowiadającej pomiarowi, która ma być wysłana do funkcji sterującej ruchem silnika krokowego. Tablica ma być czytana dotąd az zmienna odczytana z tablicy nie będzie większa lub równa zmierzonemu napięciu. Symulowałem ten kod w AVRStudio i przy czytaniu z tablicy, gdy wartość napięcia jest większa od zera, program nie wychodzi z pętli do - while. Ktoś może wskazać co jest nie tak? Dodam że testowałem różne warunki i różne kombinacje przy while i za każdym razem program nie wychodził z tej pętli.
//wlaczone pliki
#include<avr\io.h>
#include<inttypes.h>
#include<util\delay.h>
#include<avr\signal.h>
#include <avr\interrupt.h>
#include<avr\pgmspace.h>
///definicje wyprowadzen
#define LED 1
#define Reset 4
#define Kierunek 6
#define ClockDriver 5
#define F_CPU 1000000
////////////////////////////
/////tablice i zmienne ktore mozna zmieniac
prog_uint16_t g_TablicaPomiar[62] = {61, 133, 141, 149, 157, 163, 172, 180, 188, 196, 204, 212, 219, 227, 235, 243,
251, 260, 268, 276, 282, 290, 299, 307, 315, 323, 331, 337, 346, 354, 362, 370,
378, 387, 393, 401, 409, 417, 425, 434, 442, 450, 456, 497, 1023, 1023, 1023,
1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
1023, 1023};
prog_uint16_t g_TablicaKrokow[62] = {0, 300, 660, 732, 804, 876, 948, 1020, 1092, 1164, 1236, 1308, 1380, 1452, 1524,
1596, 1668, 1740, 1812, 1884, 1956, 2028, 2100, 2172, 2244, 2316, 2460, 2532,
2604, 2676, 2748, 2820, 2892, 2964, 3036, 3108, 3180, 3252, 3324, 3396, 3468,
3540, 3540, 3540, 3540, 3540, 3540, 3540, 3540, 3540, 3540, 3540, 3540, 3540,
3540, 3540, 3540, 3540, 3540, 3540, 3540};
//////zmienne ktorych nie mozna zmieniac
uint16_t g_Pomiar=0;
uint16_t g_PomiarTablica;
uint16_t g_WskaznikTablicy=0;
uint16_t g_KrokiTablica = 0;
/////////program///////////////
int main(void)
{
for(;;)
{
//////pomiar
ADCSR |=(1<<ADEN); //wlaczenie pzetwornika
ADCSR |=(1<<ADSC); //wlaczenie konwersji
while(!(ADCSR & 1<<ADIF)){}
g_Pomiar = ADC;
//////koniec pomiaru
g_WskaznikTablicy=0;
/////poczatek porownania
do
{
g_PomiarTablica &= pgm_read_word (&g_TablicaPomiar[g_WskaznikTablicy]);
g_WskaznikTablicy++;
}
while(g_PomiarTablica<g_Pomiar);
g_KrokiTablica &=pgm_read_word(&g_TablicaKrokow[g_WskaznikTablicy]);
}
return 0;
}