logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Kompilator dziwne działanie w C w Bascom program jest ok

narasta 02 Lut 2010 00:40 1287 5
  • #1 7630101
    narasta
    Poziom 21  
    Mam dziwny problem z kompilatorem w AVR Studio.


    Jest sobie taki przykładowy kod (zatrzymałem się już przy konfiguracji uarta)
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    
    #define bled 1<<5
    #define gled 1<<6
    #define rled 1<<7
    
    void UART_Init_a(void)
    {		    
    	UCSRB |= (1<<RXEN);
    	UCSRB |= (1<<TXEN);
    	UCSRB |= (1<<RXCIE);
            
    	UCSRC |= (1<<UCSZ1);
    	UCSRC |= (1<<UCSZ0);
    
        sei();
    }
    
    int main(void)
    {
    	DDRD |= (bled);
    	DDRD |= (gled);
    	DDRD |= (rled);
    
    	PORTD |= (bled);
    	PORTD |= (gled);
    	PORTD |= (rled);
    
    	PORTD &= ~(rled);
    
    	UART_Init_a();
    
    	PORTD &= ~(bled);	
    
    	while(1)
    	{		
    	}
    
    	return 0;
    }
    


    I żeby zobaczyć, czy kod jest wykonywany prawidłowo po prostu zapalam sobie diody (bled gled rled).

    Najpierw zapala się czerwona dioda - PORTD &= ~(rled);
    potem jest wykonywana funkcja UART_Init_a();
    W momencie wywołania UCSRB |= (1<<TXEN); program się zawiesza (tzn nie zapala się już niebieska dioda - PORTD &= ~(bled);

    nie mam pojęcia o co chodzi.

    AVR Studio 4.18 - najnowszy
    WinAVR 2010 01 10 - najnowszy
    winxp pro x64

    atmega8
    wyłączona optymalizacja
    kwarc 12MHz (próbowałem także przełączyć na 1MHz wew RC - też nie działa)


    Ciekawe jest to, że program napisany w bascomie działa idealnie bez problemu wysyła znaki przez uart.


    Moderowany przez inventco.eu:

    inventco.eu - temat poprawiłem - regulamin p.11.1

  • #2 7630362
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Mylisz się - program wysypuje się na tym:

    UCSRB |= (1<<RXCIE);

    (a w zasadzie dopiero na sei(); które faktycznie włącza to przerwanie)

    No bo po co włączać przerwanie, które nigdzie nie jest zdefiniowane. Jak tylko wystąpi to reset i od nowa.

    Pomijam bezsens zapalania po jednym bicie w rejestrze zamiast po prostu wpisania do niego jakiejś wartości od razu.

    Ludzie - zapomnijcie o czymś takim jak "błąd kompilatora"! Przez kilka lat natknąłem się na JEDEN, ogólnie znany i już poprawiony i nie był to błąd na AVRach, a tutaj co tydzień temat o "błędach kompilatora".

    4\/3!!
  • #3 7631427
    narasta
    Poziom 21  
    No dobrze, w takim razie nawet pomijając sprawę przerwań:

    Kod w C
    #include <avr/io.h>
    #include <util/delay.h>
    
    int main(void)
    {
    	int X1 = 0;
    	int X2 = 0;
    	int Maxz = 12;
    	int Dir0 = 1;	
    	
    	DDRD = 255;
    	PORTD = 255;		
    
    	while(1)
    	{
    		X2 = Maxz - X1;
    
    		PORTD = 223;
    		_delay_ms(X1);
    
    		PORTD = 127;
    		_delay_ms(X2);
    
    
    		if(Dir0 == 1) X1--;
    		if(X1 > Maxz) Dir0 = 0;
    
    		if(Dir0==0) X1++;
    		if(X1 < 1) Dir0 = 1;		
    	}
    
    	return 0;
    }


    oraz identyczny w bascomie
    $crystal = 12000000
    
    Dim X1 As Integer
    Dim X2 As Integer
    
    Dim Maxz As Integer
    
    Dim Dir0 As Bit
    
    
    X1 = 0
    X2 = 0
    Maxz = 12
    Dir0 = 1
    
    Config Portd = Output
    
    Do
       X2 = Maxz - X1
    
       Portd = 223
       Waitms X1
    
       Portd = 127
       Waitms X2
    
    
       If Dir0 = 1 Then Incr X1
       If X1 > Maxz Then Dir0 = 0
    
       If Dir0 = 0 Then Decr X1
       If X1 < 1 Then Dir0 = 1
    
    Loop
    
    End


    Efekt? W przypadku kodu w bascomie diody gasną i rozjaśnają się an przemian zgodnie z kodem. W przypadku C zapala się tylko niebieska dioda i nic się nie dzieje.
  • #4 7631462
    BoskiDialer
    Poziom 34  
    Masz absolutną rację, że kody są identyczne, w szczególności zwiększanie o jeden to x--, a zmniejszanie: x++ (ironia)

    Poprawnie: x-- to zmniejszanie o jeden, x++ to zwiększanie o jeden, natomiast _delay_ms jest makrem, argument zawsze musi być stałą - chcąc użyć zmiennego opóźnienia, należy dać w pętli opóźnienie o 1ms.
  • #5 7631560
    Freddie Chopin
    Specjalista - Mikrokontrolery
    narasta napisał:
    Efekt? W przypadku kodu w bascomie diody gasną i rozjaśnają się an przemian zgodnie z kodem. W przypadku C zapala się tylko niebieska dioda i nic się nie dzieje.

    To używaj dalej Bascoma a nie męcz się (i nas) walką z C.

    Ciekawe jak dwa programy napisane w dwóch różnych językach programowania i skompilowane dwoma różnymi kompilatorami mogą być "identyczne"...

    4\/3!!
  • #6 7632227
    narasta
    Poziom 21  
    Z bascoma już dawno nie używam bo jest zbyt toporny...

    Chodzi mi o to, że wcześniej wszytko działało w AVRStudio. Potem nie pisałem nic przez ostatni miesiąc bodajże i wczoraj włączając kompilator nagle takie niespodzianki... Najpierw nie chciało się kompilować bo wywalało błąd o braku makefile'u mimo ze kompilator powinien przygotować go sam. Gdy udało mi się już obejść ten problem to znowu się źle kompilowało dając jakiś dziwny kod.


    a jeśli chodzi o x++, x-- to oczywiście mój błąd zrobiony z pośpiechu...
REKLAMA