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

[VMLAB][ATMega16] problem z diodami

tomisk 16 Lip 2008 21:46 2580 11
  • #1 5349315
    tomisk
    Poziom 11  
    Witam

    Próbuje symulować zapalanie diody na atmega16, program napisany w C gdy w VMLAB-ie robie Project -> Bulid wszystko idzie ok do chwili gdny chce zrobić Run -> Go/Continue po chwili dostaje :

    [PC = $0036, Time = 2.10 ms, {MEM}]: Indexed write to a I/O space register? Address = $0037

    Może ktoś wie co oznacza taki błąd

    Pozdrawiam Tomek
  • #2 5349380
    ZbeeGin
    Poziom 39  
    Adres zapisu w operacji z użyciem wskaźnika (np. st Z, r16) naszedł na pole adresowe, które zajmują rejestry przestrzeni I/O. Dokładnie będzie to DDRB - rejestr kierunku działania portu PB.
    Zobacz czy pod adresem $0036 występuje instrukcja ST Z, Rx; ST Y, Rx; ST X,r16 lub jej odmiany z plusami lub minusami.
  • #3 5349473
    tomisk
    Poziom 11  
    Dzięki za odpowiedz bo już zaczynam się łamać :)
    pod adresem $0036 mam : st Z, R24
  • #4 5349539
    ZbeeGin
    Poziom 39  
    To wszystko wyjaśnia. W Z jest adres $0037, zatem jeśli to kod w C to sugeruje to błąd kompilatora lub VMLAB jest po prostu nadgorliwy.
  • #5 5349569
    tomisk
    Poziom 11  
    a jak sobie z tym poradzić bo ja nie mam koncepcji??
  • #6 5349592
    ZbeeGin
    Poziom 39  
    Nie bardzo wiem co w Twoim programie się dzieje w tym miejscu. Jeśli wykonujesz tam operację związaną z ustawianiem, która końcówka portu ma być wejściem/wyjściem to taka konstrukcja jest poprawna - choć dość dziwna.
    Przydał by się program i plik OBJ+HEX generowany przez kompilator, aby to sprawdzić.
  • #7 5349620
    tomisk
    Poziom 11  
    jest to program ze strony tkdami.net/~voytek/AVR_C/Przyk_1.rar ale to samo dzieje sie w innym programie napisanym do obsługi LCD
  • #8 5349699
    ZbeeGin
    Poziom 39  
    Ja bym go olał za przeproszeniem i dał Run ponownie. Widzę, że VMLAB bardzo się czepia jak coś jest nie po jego myśli.
  • #9 5350993
    tomisk
    Poziom 11  
    A może ktoś z was robił tam symulację wyświetlacza LCD bo mi coś nie idzie
    w C mam taki program:
    
    #include <avr/io.h>
    #include <avr/sfr_defs.h>
    #include <util/delay.h>
    
    
    #define LCD		PORTB
    #define LCD_RW 	1
    #define LCD_E	2
    #define LCD_RS	3
    
    
    #define CLR_RW LCD &= ~_BV(LCD_RW)	//ustawia 0 na bicie o  //numerze 1(LCD_RW) w zmiennej LCD
    
    #define SET_E LCD |= _BV(LCD_E)		//ustawia 1 na bicie o //numerze 2(LCD_E) w zmiennej LCD
    #define CLR_E LCD &= ~ _BV(LCD_E)	//ustawia 0 na bicie o numerze 2(LCD_E) w zmiennej LCD
    
    #define SET_RS LCD |= _BV(LCD_RS)	//ustawia 1 na bicie o //numerze 3(LCD_RS) w zmiennej LCD
    #define CLR_RS LCD &= ~_BV(LCD_RS)	//ustawia 0 na bicie o //numerze 3(LCD_RS) w zmiennej LCD
    
    
    void zapiszbajt(char x)
    {
    	LCD |= 0xF0;
    	LCD &= (x | 0x0F);
    	
    	CLR_E;
    	SET_E;
    
    	x <<= 4;
    	LCD |= 0xF0;
    	LCD &= (x | 0x0F);
    
    	CLR_E;
    	_delay_ms(1);
    }
    
    void zapiskomendy(char x)
    {
    	CLR_RS;
    	CLR_RW;
    	SET_E;
    	zapiszbajt(x);
    }
    
    void zapiszdane(char x)
    {
    	SET_RS;
    	CLR_RW;
    	SET_E;
    	zapiszbajt(x);
    }
    
    void czyscLCD(void)
    {
    	zapiskomendy(0x01);
    }
    
    void zapisztekst(char *s)
    {
    	while(*s)
    	{
    		zapiszdane(*s);
    		s++;
    	}
    }
    
    void inicjalizacja(void)
    {
    	char i;
    	_delay_ms(15);
    	
    	CLR_RS;
    	CLR_RW;
    	CLR_E;
    
    	for (i = 0; i < 3; i++)
    	{
    		SET_E;
    		LCD = 0x3F;
    		CLR_E;
    		_delay_ms(5);
    	}
    	SET_E;
    	LCD = 0x2F;
    	CLR_E;
    	_delay_ms(1);
    	zapiskomendy(0x28);
    	zapiskomendy(0x08);
    	zapiskomendy(0x01);
    	zapiskomendy(0x06);
    	zapiskomendy(0x0C);
    }
    
    int main(void)
    {
            DDRB = 0xFF;
            PORTB = 0xFF;
    	_delay_ms(40);
    	inicjalizacja();
    	czyscLCD();
    	zapisztekst("fkladflllo");
    	zapisztekst("kkkkkkkkksssss");
    }
    

    a w pliku prj :
    
    ; Following lines are optional; if not included
    ; exactly these values are taken by default
    ; ------------------------------------------------------------
    .POWER VDD=5 VSS=0  ; Power nodes
    .CLOCK 1meg         ; Micro clock
    .STORE 250m         ; Trace (micro+signals) storage time
    
    ; Micro nodes: RESET, AREF, PA0-PA7, PB0-PB7, PC0-PC7, PD0-PD7, ACO, TIM1OVF
    ; Define here the hardware around the micro
    X1 LCD(16 2 250K) PB3 PB1 PB2 PB7 PB6 PB5 PB4 D3 D2 D1 D0
    
    D1 VDD w1
    R1 w1 PB0 1k
    D2 VDD w2
    R2 w2 PB1 1k
    D3 VDD w3
    R3 w3 PB2 1k
    D4 VDD w4
    R4 w4 PB3 1k
    D5 VDD w5
    R5 w5 PB4 1k
    D6 VDD w6
    R6 w6 PB5 1k
    D7 VDD w7
    R7 w7 PB6 1k
    D8 VDD w8
    R8 w8 PB7 1k
    .Plot V(PB0) V(PB1) V(PB2) V(PB3) V(PB4) V(PB5) V(PB6) V(PB7)[/color]
    

    dodałem diody do obserwowania zmian ale wyświetlacz nie zaskakuje, co jest nie tak proszę o jakąś wskazówkę.

    Pozdrawiam

    Proszę używać znaczników [code]
    [zumek]
  • #11 5351169
    tomisk
    Poziom 11  
    nie mam jeszcze wyświetlacza na który czekam, a w tym czasie chciałem potestowac :) ale nie wiem dlaczego mi to nie odpala

    Dodano po 1 [godziny] 55 [minuty]:

    czy może być to spowodowane tym że na starcie domyślnie wyświetlacz ma tryb 8 bitowy a moje funkcje działają w trybie 4 bitowym
REKLAMA