Witam. Zwracam sie do Was z moim problemem. Realizuje urzadzenie, ktorego mikrokontroler ma przepisywac stany pjawiajace sie na pinach do bufora. Funkcja napisana jest w C ale z powodu predkosci zmian stanow na pinach i ograniczenia czestotliwosci pracy zegara mikrokontrolera jestem zmuszony przepisac ja na asembler. O ile pisanie programow w C nie sprawia mi trudnosci o tyle asembler Atmegi owszem. Ktos kiedys wskazal mi pomoc w nauce asemblera w avr-libc-user-manual ale niestety nie jest to dla mnie wystarczajace. Moze pomozecie mi przepisac ta funkcje? Funkcja wyglada tak:
#define DI (PIND & (1<<PIND5)) #define CE (PIND & (1<<PIND2)) #define CL (PIND & (1<<PIND3))
do { oldStanCL=stanCL; do // czeka na narastajace zbocze sygnalu CE { oldStanCE=stanCE; stanCE=(uchar)CE; }while(stanCE>oldStanCE);
do // chip enable { stanCL=(uchar)(PIND & (1<<PIND3)); // czytanie linii portu CL
if(stanCL>oldStanCL) // detekcja narastajacego zbocza CL { if(DI) bajt |= (1<<itemBit); else bajt &= ~(1<<itemBit);
item++; if( ++itemBit>7 ) {
*ramkiPtr++=bajt; itemBit=0; } } oldStanCL=stanCL; }while(CE); // chip enable itemBit=0; if(item!=0x50) // jesli rekord jest o innej dlugosci powtorz odczyt rekordu { itemBit=0; item=0; ramkiPtr = ramkiPtrBuf; // odtworzenie wskaznika bufora odebranych ramek } }while(item != 0x50); // czytanie calego rekordu
Wszystkie zmienne s± jednobajtowe, poza ramkiPtr i ramkiPtrBuf ktore sa wskaznikami do bajtow. Monitorowany uklad podlaczony do mikrokontrolera z pomoca trzech linii CL, CE i DI. Odczyt rozpoczyna sie po pojawieniu sie zbocza narastajacego na pinie CE. Odczytywane wartosci sa z pinu DI po pojawieniu sie zbocza narastajacego na pinie CL. Po odczytaniu 0x50 wartosci odczyt jest zakonczony. Wiem, ze funkcja jest dosyc spora ale jestem zmuszony (czas) prosic Was pomoc. Bede wdzieczny rowniez za wskazanie innych miejsc, gdzie moglbym poczytac o wstawkach asemblerowych w GCC. Pozdrawiam
Jacek M.