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

[ARM] LPC2142 - Problem z zapisem do rejestru FIO1DIR przy przenoszeniu bibliotek LCD

kazimi 07 Cze 2008 13:34 2172 5
REKLAMA
  • #1 5222344
    kazimi
    Poziom 12  
    Posty: 83
    Pomógł: 3
    Probowalem sobie przerobic biblioteki obslugujace LCD (AVR->ARM). Wyglada na to, ze wszystko jest ok, ale napotkalem pewien problem. Mozna go zobrazowac takim programem:
    Cytat:

    #include "lpc214x.h"

    #define FIO1DIR3 (*((volatile unsigned long *) 0x3FFFC023)) // 8 (byte)
    #define FIO1SET3 (*((volatile unsigned long *) 0x3FFFC03B)) // 8 (byte)
    #define FIO1CLR3 (*((volatile unsigned long *) 0x3FFFC03F)) // 8 (byte)
    #define FIO1PIN3 (*((volatile unsigned long *) 0x3FFFC037)) // 8 (byte)

    int main() {

    //konfiguracja portow
    SCS = 0x11; //czyil uzywamy szybkich portow GPIO

    FIO1PIN3 |= (1<<4);
    FIO1PIN3 |= (1<<5);


    //petla glowna programu
    for(;;){

    }

    }


    Tzn. problematyczne sa linijki:
    Cytat:

    FIO1DIR3 |= (1<<4);
    FIO1DIR3 |= (1<<5);

    Wydawalo mi sie, ze po tej operacji w rejestrze FIO1DIR powinna znalezc sie wartosc : 0x30000000 ale tak nie jest, w ogole dochodzi do zapisu na pierwszym i drugim bajcie tego rejestru, a przeciez zapis powinien odbyc sie tylko na czwartym bajcie (?). Tak wiec co moze byc nie tak?
    Zalezy mi na wykorzystaniu czesci portu P1 (osmiu bitow) jako takiego jakby niezaleznego portu (bardzo by mi to ulatwilo przerobienie wspomnianych bibliotek)
  • REKLAMA
  • #2 5222971
    zorg666
    Poziom 22  
    Posty: 556
    Pomógł: 30
    Ocena: 28
    
    //konfiguracja portow
    SCS = 0x11; //czyil uzywamy szybkich portow GPIO 

    -- dla lpc2148 jest SCS= 0x03, wtedy ustawia GPIO1M oraz GPIO0M bity.
  • REKLAMA
  • #3 5223072
    kazimi
    Poziom 12  
    Posty: 83
    Pomógł: 3
    ajś, oczywiście że miało być:
    Cytat:

    SCS= 0x03;

    jednakże to dalej nie chce działać...
    Niestety nie znam asemblera dla arm-ów (trzeba sie będzie nauczyć chyba na poziomie "komunikatywnym"), ale to może tak jest, że kompilator przy tłumaczeniu na asembler sam dokłada jakieś wyrównania ?
    W asemblerze zasadnicza czesc programu wyglada tak:
    Cytat:

    21: SCS = 0x03; //czyil uzywamy szybkich portow GPIO
    22:
    0x000001B4 E3A00003 MOV R0,#0x00000003
    0x000001B8 E59F1030 LDR R1,[PC,#0x0030]
    0x000001BC E58101A0 STR R0,[R1,#0x01A0]
    23: FIO1PIN3 |= (1<<4);
    0x000001C0 E59F002C LDR R0,[PC,#0x002C]
    0x000001C4 E5900037 LDR R0,[R0,#0x0037]
    0x000001C8 E3800010 ORR R0,R0,#0x00000010
    0x000001CC E59F1020 LDR R1,[PC,#0x0020]
    0x000001D0 E5810037 STR R0,[R1,#0x0037]
    24: FIO1PIN3 |= (1<<5);
    25:
    26: //petla glowna programu
    0x000001D4 E59F0018 LDR R0,[PC,#0x0018]
    0x000001D8 E5900037 LDR R0,[R0,#0x0037]
    0x000001DC E3800020 ORR R0,R0,#0x00000020
    0x000001E0 E59F100C LDR R1,[PC,#0x000C]
    0x000001E4 E5810037 STR R0,[R1,#0x0037]
    27: for(;;){
    0x000001E8 E1A00000 NOP
    0x000001EC EAFFFFFE B 0x000001EC
    0x000001F0 E01FC000 DD 0xE01FC000
    0x000001F4 3FFFC000 DD 0x3FFFC000

    A i jak coś to używam kompilatora Keil'a
  • REKLAMA
  • #4 5296858
    zorg666
    Poziom 22  
    Posty: 556
    Pomógł: 30
    Ocena: 28
    chyba mam ten sam problem, działa jesli jest tak jak ponizej

    
    			// fast GPIO
    #define LCD_SET		FIO0SET
    #define LCD_CLR		FIO0CLR
    #define LCD_DIR		FIO0DIR
    
    #define LCD_SET2	FIO0SET2		// Po.16 -- P0.23
    #define LCD_CLR2	FIO0CLR2
    #define LCD_DIR2	FIO0DIR2
    
    					//	software control SPI
    #define LCD_SCK		0x00020000		// P0.17 
    #define LCD_MISO	0x00040000		// P0.18
    #define LCD_MOSI	0x00080000		// P0.19
    
    
    //	#define LCD_RS		(1<<15)		  // P0.15
    //	#define LCD_RESET	(1<<16)		// P0.16
    //	#define LCD_CS		(1<<22)		// P0.22
    
    #define LCD_RS		0x00008000		// P0.15
    #define LCD_RESET	0x00010000	     // P0.16
    #define LCD_CS		0x00400000	      // P0.22
    
    
    #define SCB_SCS_GPIO0M      (0x00000001)
    #define SCB_SCS_GPIO1M      (0x00000002)
    
    
  • REKLAMA
  • #5 5296954
    kazimi
    Poziom 12  
    Posty: 83
    Pomógł: 3
    zorg666 : mógłbyś sprecyzować ? Czy dobrze rozumiem, że deklaracja:
    Cytat:
    #define LCD_SET2 FIO0SET2 // Po.16 -- P0.23
    #define LCD_CLR2 FIO0CLR2
    #define LCD_DIR2 FIO0DIR2

    załatwia wszystko?? Czyli u Ciebie działa bezproblemowo ?? No bo ja właśnie muszę najpierw sobie zdefiniować te rejestry w sposób następujący(bo moje lpc214x.h tego nie zawiera), ale mi nie działa:
    Cytat:

    #define FIO1DIR3 (*((volatile unsigned long *) 0x3FFFC023)) // 8 (byte)
    #define FIO1SET3 (*((volatile unsigned long *) 0x3FFFC03B)) // 8 (byte)
    #define FIO1CLR3 (*((volatile unsigned long *) 0x3FFFC03F)) // 8 (byte)
    #define FIO1PIN3 (*((volatile unsigned long *) 0x3FFFC037)) // 8 (byte)


    Nie wiem, może coś tam spartaczyłem...
    No ale poradziłem sobie bez tych rejestrów jakoś :)
  • #6 5299301
    zorg666
    Poziom 22  
    Posty: 556
    Pomógł: 30
    Ocena: 28
    te definicje u mnie także nie działaja pod lpc2148, działa jak podam w ten sposób.

    
    #define LCD_RS      0x00008000      // P0.15
    #define LCD_RESET   0x00010000        // P0.16
    #define LCD_CS      0x00400000         // P0.22 
    

    ale z tego zrezygnowałem poniewaz programowy SPI jest dośc wolny , nawet na Fast GPIO.
REKLAMA