Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 22 gru 2024, o 15:04


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 27 ] 
Autor Wiadomość
 Tytuł: funkcja main
PostNapisane: 1 lut 2014, o 16:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

hej słyszałem że funkcja main to rodzaju pętla taka jak while i for co się dzieje w main na lini :
"}" czy następuje skok ku górze do lini:



DDRB |= (1<<PB7)|(1<<PB6);

i następuje wykonywanie instrukcji od początku: DDRB |= (1<<PB7)|(1<<PB6); do }.

hmm a co się dzieje z pustymi main tak jak tu int main (void) {} i pętlami : while(1) {}

Kod:
int main (void) {

   DDRB |= (1<<PB7)|(1<<PB6);

           .............  jakieś tam instrukcjie

   while (1){

   }

}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 17:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 maja 2013
Posty: 288
Ostrzeżenia: -2
Pomógł: 23

spider12 napisał(a):
hej słyszałem że funkcja main to rodzaju pętla taka jak while i for co się dzieje w main na lini :
"}" czy następuje skok ku górze do lini:



DDRB |= (1<<PB7)|(1<<PB6);

i następuje wykonywanie instrukcji od początku: DDRB |= (1<<PB7)|(1<<PB6); do }.

hmm a co się dzieje z pustymi main tak jak tu int main (void) {} i pętlami : while(1) {}

Kod:
int main (void) {

   DDRB |= (1<<PB7)|(1<<PB6);

           .............  jakieś tam instrukcjie

   while (1){

   }

}


main to jest funkcja. Każdy program w C musi ją zawierać. Nie jest to pętla.
W nawiasach klamrowych umieszczasz cały swój kod programu.

while(1) {} to jest pętla. 1 w nawiasach oznacza "prawde" czyli taka pętla będzie wykonywać się w nieskończoność.
Zatem jeśli umieścisz tutaj jakieś tam instrukcje to będą one się wykonywać cyklicznie w koło.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 17:41 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27319
Lokalizacja: Szczecin
Pomógł: 1041

spider12 napisał(a):
hej słyszałem że funkcja main to rodzaju pętla taka jak while i for co się dzieje w main na lini :
"}" czy następuje skok ku górze do lini:


A powiedz gdzie to słyszałeś ? ;)

no bo chyba nie powiesz że z tej książki?

http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

Jeśli jej nie masz to polecam bo na prawdę warto ugruntować sobie taką podstawową wiedzę - bez tego ciężko dalej iść

------------------------------------------

main() - to funkcja jak wyżej kolega słusznie powiedział

while() - to jedna z pętli w języku C

i jedno nie ma za bardzo z drugim nic do czynienia

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 19:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

jak to rozumieć czyli instrukcjie w main wykonują sie raz i koniec ???

raz ustawiają się bity w rejestrach ???

a co z przerwaniami jesli program wychodzi z przerwania ISR to czy wraca do pętli nie skończonej, czy wykonuje się main po powrocie od początku czyli od: DDRB |= (1<<PB7)|(1<<PB6); ??

Kod:
#include <avr/io.h>
#include <avr/interrupt.h>


int main (void) {

   DDRB |= (1<<PB7)|(1<<PB6);
   TCCR1B |= (1<<CS10)|(1<<CS12);
   TCNT1 = 54736;
    TIMSK |= (1<<TOIE1);

    sei();
   while (1){

   }

}

ISR (TIMER1_OVF_vect){

       TCNT1 = 54736;
      PORTB ^= (1<<PB7);

}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 19:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2012
Posty: 88
Pomógł: 2

jak na moje to wszystko w pętli main wykonuje się raz, następnie wchodzimy do pętli nieskończonej while i tam sobie lecimy w kółko. Wystąpi przerwanie to wykonuje się kod w przerwaniu i wraca do punktu w którym wystąpiło przerwanie czyli w pętli while :-)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 19:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Tak instrukcje w main wykonują się tylko raz
Ty zapętlasz program w niekończącej się pętli głównej (while(1))

Tak powrót z przerwania jest do pętli głównej
a konkretnie do miejsca o jedną instrukcje za momentem w którym
przerwanie zostało wywołane



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 20:32 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

Jeżeli w main() lub w funkcjach z main() wywoływanych nie zapętlisz programu to program będzie szedł dalej czyli będą wykonywane kolejne komendy zapisane we flaszu po main(). Da to oczywiście nieoczekiwane rezultaty. Prawdopodobnie zwiecha lub reset procesora. Dopóki jeszcze procesor dycha przerwania oczywiście będą się wykonywały.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 20:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2013
Posty: 223
Zbananowany użytkownik

Pomógł: 21

Panowie, zamiast uprawiać filozofie wystarczy spojrzeć w listing programu ;)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wektor resetu skacze do 54 (inicjalizacji pamięci). Jak widać 60 wywołuje maina, a po jego zakończeniu (74-ret) zostanie wywołane 64-skok do 76.
Zostaną więc wyłączone wszystkie przerwania, a potem program będzie cały czas skakał do 78 (taki assemblerowy while(1);).

Tak więc po zakończeniu/wyjściu z funkcji main w przypadku AVRów, mikrokontroler wyłącza globalnie przerwania i przechodzi do nic nie robiącej pętli nieskończonej.

Dlatego też, jeżeli main służy nam tylko do inicjalizacji przerwań, a potem program wykonuje się tylko w nich, to na końcu maina należy dodać while(1);, bo inaczej uC z niego by wyszedł i wykonał standardowe cli.

_________________
Nie pisz komentarzy - dobry kod komentuje się sam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 21:40 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

PKoz napisał(a):
Wbrew pozorom pytanie kolegi spider12 nie jest całkiem bez sensu. Funkcja main() jest jak każda inna, ma listę parametrów i ma zwracaną wartość.

Problem leży w tym, że język C został stworzony dla maszyn z systemem operacyjnym (Unix). System wywołuje funkcję main() i po jej zakończeniu odbiera od niej wartość. Dla AVR'ów nie ma systemu operacyjnego, nie ma więc jak uruchomić funkcji main(), ani gdzie przekazać wartości funkcji main().

Problem ten został rozwiązany w ten sposób, że funkcja main() uruchamia się sama (z resetem procesora) i kończy się nieskończoną pętlą. Jest to sprzeczne ze standardem języka C, ale działa.

Jak to? To w C nie można tworzyć pętli nieskończonych?
Podobno C bardzo dobrze nadaje się (nadawał) do pisania systemów operacyjnych. Czy SO nie działa w pętli nieskończonej?

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 22:42 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27319
Lokalizacja: Szczecin
Pomógł: 1041

spider12 napisał(a):
jak to rozumieć czyli instrukcjie w main wykonują sie raz i koniec ???


DOKŁADNIE TAK, funkcja main() tak jak każda inna funkcja, po wywołaniu wykonuje się TYLKO JEDEN RAZ ;) tylko jeden raz , a że jest to nietypowa bo startowa funkcja to ona może w ogóle TYLKO RAZ się wykonać po restarcie procesora. Nie ma innej opcji.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 22:59 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

PKoz napisał(a):
MirkoT napisał(a):
Jak to? To w C nie można tworzyć pętli nieskończonych?

Nic takiego nie twierdze.
Twierdze tylko, że funkcja main() jest wywoływana przez system operacyjny, z systemu pobiera parametry i zwraca wartość.
Jest to zgodne zarówno z konwencją K&R, ANSI i C9X.

A, jasne. Źle Cię zrozumiałem.
No a jak to się ma do pisania systemów operacyjnych?
Przecież kiedy startuje jądro to nie ma jeszcze "systemu", bo dopiero się uruchamia. Gdzieś tam na samym początku też musi
być "jakaś" funkcja main() która nie ma skąd wziąć parametrów i nigdzie ich nie zwróci, bo przecież podobnie nie zakończy
działania. No chyba, że "położymy" system.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 08:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

ok, może moje pytanie jest banalne ale zadałem je tylko dlatego by lepiej to sobie wszytsko wyobrazić;)

a co się dzieje gdy już wykona się miganie diodą w tym przypadku poniżej i prgram wraca do main
moje pytanie brzmi gdzie?
do while przeciez tam w ciele while nic nie ma :)

od którego momentu zaczyna zliczać impulsy timer od
TIMSK |= (1<<TOIE1); // ustawienie przerwania od przepełnienia

czy może od

sei(); //zezwolenie na globalne przrwanie


czytałem o tym w ksiązece jednak chciałbym przeczytać wasze wypowiedzi na ten temat by lepiej to zzrozumieć ;)




Kod:
/*Program wykorzystuje timer1 16 bitowy i ma zapalać dioda led  */

#include <avr/io.h>
#include <avr/interrupt.h>


int main (void) {

   DDRB |= (1<<PB7)|(1<<PB6);  // ustawienie kierunku pinów portu PB
   TCCR1B |= (1<<CS10)|(1<<CS12);  // ustawienie preskalera na 1024
   TCNT1 = 54736;  //wpiasanie wartosci początkowej
    TIMSK |= (1<<TOIE1); // ustawienie przerwania od przepełnienia

    sei();  //zezwolenie na globalne przrwanie
   while (1){

   }

}

ISR (TIMER1_OVF_vect){

      
      PORTB ^= (1<<PB7); // miganie diodą

}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 08:29 
Offline
Użytkownik

Dołączył(a): 25 sty 2014
Posty: 185
Lokalizacja: Działoszyn
Zbananowany użytkownik

Pomógł: 8

spider12 napisał(a):
jak to rozumieć czyli instrukcjie w main wykonują sie raz i koniec ???

mirekk36 napisał(a):
... a że jest to nietypowa bo startowa funkcja to ona może w ogóle TYLKO RAZ się wykonać po restarcie procesora. Nie ma innej opcji.

opcja jest : )
można uzyć goto

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 10:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2013
Posty: 93
Lokalizacja: Piotrków Trybunalski
Pomógł: 1

Funkcji goto raczej się nie używa, po to są pętle, żeby z nich skorzystać ;) Czemu by nie zrobić pętli w pętli ?:P

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 10:08 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27319
Lokalizacja: Szczecin
Pomógł: 1041

karolek napisał(a):
opcja jest : )
można uzyć goto


Jak ktoś to przeczyta ... (i nie piszę tego złośliwie broń boże do kolegi karolek bo kolega być może jeszcze mocno czegoś nie rozumie), ale jak ktoś to przeczyta to niech splunie trzy razy przez lewe ramię, obróci się wokoło 2 razy i ZAPOMNI o tym tzn o GOTO w języku C (poważnie - najlepiej zapomnieć że jest taka instrukcja w C i nigdy jej nie używać - a SZCZEGÓLNIE jak się jest początkującym)

Nie wspomnę już że w wielu przypadkach ludzie używając jej - robią to TOTALNIE niestety bez sensu, składu i ładu - tak jak zresztą w powyższym przykładzie :(

Poza tym nadal to co powiedziałem jest prawdą - FUNKCJA WYKONA SIĘ TYLKO RAZ .... nie ma innej opcji a to że tu kolega wystrzelił z kocim GOTO oznaczać by mogło tylko i wyłącznie fakt - że stworzy nową pętlę nieskończoną wewnątrz funkcji czyli niejako zastąpi while() - to tyle

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 10:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

dlaczego gdy w przerwaniu wpisze jeszcze raz do rejestru licznika TCNT1 wartość to program działa inaczej tzn. dioda led mruga co sekunde prawidołowo zgodnie z założeniem, inaczej jest gdy tego wpisu nie ma, dlaczego trzeba ta wartość wpisywac dwa razy w przerwaniu i funkcji main
jeśli się chce by dioda mrugała co sekunde.

sami zobaczcie może na swoich zestawach ATB ;)


Kod:
ISR (TIMER1_OVF_vect){

       TCNT1 = 54736; //wpiasanie wartosci początkowej
      PORTB ^= (1<<PB7); // miganie diodą

}




przecież gdy wpisze ją raz to po co drugi ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 11:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Tak bardzo obrazowo :)
Wyobraź sobie że TCNT1 jest takim licznikiem który liczy w kółko od 0 .. MAX i od początku
a przerwanie Overflow wykonuje się gdy licznik doliczy do TOP (czyli jak nic nie wpiszesz to do MAX)

i teraz w main wpisujesz do TCNT1 nową wartość (ustawiasz w nim nawą wartość MAX)
jak licznik doliczy do MAX to wywoła się przerwanie , tylko jest mały szkopuł
ten licznik nie zacznie znowu liczyć od zera tylko leci dalej do swojego starego MAX
i dlatego żeby licznik zliczał równe (prawie równe) odcinki czasu trzeba
zaraz w przerwaniu najlepiej na samym początku wpisać ponownie nową wartość MAX
żeby nasztępne przerwanie wykonało się ponownie w tym samym czasie
i tak w kółko.
Jest inny tryb licznika (nie każdego) który wyręcza nas z wpisywania MAX to
tryb CTC ale to inna bajka :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 12:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

pokaż jak to zrobić kolego PKoz

Wielka prośba to sobie to zobacze i przeanalizuje

czyli po wejściu w przerwanie rejestr TCNT1 jest wyzerowany i zaczyna liczyc od zera wraca i znów zaczyna liczyc od zera stąd te 4 sekundy odstepu midzy przerwaniami a nie 1 s

od kiedy timer zaczyna przechodzić w przerwanie czy od ustawienia bitu

TIMSK |= (1<<TOIE1);

a co to jest sei();

tak naprawde to wiem tle że musi być w main gdy korzysta się z przerwania ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 13:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

spider12 napisał(a):
od którego momentu zaczyna zliczać impulsy timer od
TIMSK |= (1<<TOIE1); // ustawienie przerwania od przepełnienia

czy może od

sei(); //zezwolenie na globalne przrwanie

Timery w AVR zaczynają zliczać impulsy od momentu ustawienia preskalera czyli po tej lini
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

impulsy taktujące procesor są podawane na wejście licznikowe Timera. Czyli od tego czasu po każdym impulsie jest zwiększana wartość rejestru TCNTx. Można powiedzieć że Timer zaczął liczyć. Jeśli nie odblokujemy przerwań to Timer będzie tak sobie liczył od 0 do MAX i tak w kółko ale przerwania od niego nie będą obsługiwane. Flaga przerwania będzie ustawiona bo przy każdym przekręceniu licznika jest ustawiana ale do puki nie odblokujemy przerwań
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to procek jej nie zobaczy i nie przejdzie do funkcji obsługi przerwania.

spider12 napisał(a):
a co to jest sei();

sei() włącza globalne zezwolenie na przerwania czyli ustawia 8 bit (bit I) w rejestrze SREG.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 15:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

Jeśli odblokujemy raz:

TIMSK |= (1<<TOIE1); // ustawienie przerwania od przepełnienia

to po co drugi zezwalać na przerwanie

sei();

dokładnie tego nie rozumiem



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 16:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Bo
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

odblokowuje przerwania tylko dla Timera1 w trybie przepełnienia (Overflow).

Żeby procesor mógł zobaczyć, że ów Timer zgłosił przerwanie musi być również włączone globalne zezwolenie na przerwania czyli ustawiony bit I w rejestrze SREG. Można to zrobić poprzez sei() ale można by zrobić też tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Czyli żeby procesor zobaczył, że jakiś moduł zgłosił przerwanie muszą być włączone globalne przerwania i przerwania dla konkretnrgo modułu.

W Elportalu znalazłem dwa rysunki z Oślej łączki. Przeanalizuj je a dużo ci się wyjaśni
Obrazek

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 16:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

OK jak to zobrazować wyżej kolega PKoz napisał że avr studio pokazuje to gdzie kompilator skacze
z instrukcji po instrukcji
co się dzieje z tym programem patrząc z perspektywy asemblera
Zobaczcie kod powyżej c tylko że w asemblerze :

Jeśli dalej tego nie zrozumiem to poprostu uznam że tak musi być

Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2014, o 17:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 gru 2012
Posty: 530
Lokalizacja: Bydgoszcz
Pomógł: 8

To może ja jeszcze spróbuję Cię nakierować.

Program na PC jest tak jakby skończony tak? Znaczy to, że np taki Pasjans - teoretycznie po wygranej partii jest koniec. Teoretycznie podkreślam. Program możesz zamknąć i spoko.

Na mikroprocesorach nie jest już tak prosto. Program na uP NIGDY ale to NIGDY nie może się skończyć. Dlatego jest ta pętla while. Pętla ta wykonuje swoje ciało dopóki warunek w nawiasie jest prawdą. Jak wiadomo z algebry i logiki Boola, 1 jest zawsze prawdą, także pętla while(1) będzie wykonywana aż do odcięcia zasilania.

A funkcja main musi być, gdyż jest to główne ciało programu. Program idzie zawsze od góry do dołu. Czyli jesteśmy w głównym ciele - funkcji main. Wykonują się jakieś procedury, np inicjacja przerwań itp, bo to się ma wykonać tylko raz. Ustawianie portów na odpowiedni tryb we/wy itd. Potem program napotyka na pętle while, do której wchodzi i nigdy nie wyskoczy.

To tak w wielkim skrócie, bo oczywiście z pętli while program może przeskoczyć do innej funkcji, zadeklarowanej przez użytkownika, ale nie ważne :)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lut 2014, o 19:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lip 2013
Posty: 208
Lokalizacja: Kielce
Pomógł: 15

kila napisał(a):
To tak w wielkim skrócie, bo oczywiście z pętli while program może przeskoczyć do innej funkcji, zadeklarowanej przez użytkownika, ale nie ważne :)


Lub np. do obsługi przerwania. :) Zawsze potem po wykonaniu tego co jest (jak kolega wyżej napisał w innej funkcji) lub po "obsłużeniu" przerwania - program zawsze wraca do main w miejsce o jeden rozkaz dalej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lut 2014, o 19:47 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3206
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

spider12 napisał(a):
OK jak to zobrazować wyżej kolega PKoz napisał że avr studio pokazuje to gdzie kompilator skacze
z instrukcji po instrukcji
co się dzieje z tym programem patrząc z perspektywy asemblera
Zobaczcie kod powyżej c tylko że w asemblerze :

Jeśli dalej tego nie zrozumiem to poprostu uznam że tak musi być

Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



No ale co ma się dziać? Program realizuje po kolei instrukcje asemblera.

A co robi każdy z rozkazów to już musisz sprawdzić w książce o asemblerze choćby na ATmegi.

Np. ostatni rozkaz to właśnie tzw. koniec programu. Program skacze w kółko w to samo miejsce (stop program) w pustej pętli.

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2014, o 17:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

okej a do do czego służy rejestr OCR1B skoro CTC wykorzystuje OCR1A to po co OCR1B ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lut 2014, o 22:22 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Procesor ma takie nóżki oznaczone OC1A i OC1B na których możesz sobie uruchomić PWM i wtedy korzysta się z OCR1A i OCR1B

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 27 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO