2013-02-14 5 views
0

Stackoverflow, 이전에 도움이되었습니다. 다시 도움이 필요합니다. 나는 PIC18F2550에서 GPIO를 사용하여 내 시리얼 비트 아웃을 시도하고있다. 이것은 일부 시프트 레지스터 (3x74LS595)에 연결되며, 마지막 시프트 레지스터는 표준 HD44780 LCD에 연결됩니다. 지금까지 나는 시계 작업과 래칭 작업을 올바르게했고, 장시간 싸운 후에도 데이터가 정확하게 출력되고 있습니다. 배럴 시프 팅이 잘되지 않아서 데이터가 기한 내에 데이터를 뱉어 내지 만 나는 빗 나간다.)PIC에서 비트 밴딩 된 직렬 포트가 C에서 중첩 된 루프로 작동하지 않습니다.

내 문제는 LCD를 사용하려면 데이터 핀으로 사용 가능 핀을 토글해야하기 때문에 코드를 저장하기 위해 다른 루프를 두 번 중첩하고 달리 활성화 비트를 내보내는 동안 enable 플래그를 토글합니다. 이론적으로는 12에서 24로 바뀌는 바이트 수를 두 배로 늘려야합니다. 어떤 이유로이 루프를 추가하면 작동하지 않습니다. 그냥 2 바이트를 뱉어 내고 종료합니다. 그것 없이는 12 바이트를 모두 뱉어 낸다. (LCD는 제대로 설정되지 않았지만 enable가 없기 때문에).

여기 에이블 중첩 루프없이 작동 그것의 사진이다 :

Linked because lack of rep

D0 데이터이고 D1/2 아래에 각각 시계/부하이다.

그리고 여기서이 함께 루프 용 :

맨 왼쪽 가장자리 라인의 초기 리셋되었는지

Linked because lack of rep

. 그 두 바이트 뒤에 나왔다는 것을 알았습니다. 왜냐하면 나는 그것이 모든 의미있는 코드가 완료되었음을 나타내는 작은 부저 소리를 울리기 때문입니다. 나는 심지어 모든 바이트를 뱉어 것입니다 있는지 확인하기 위해 토글을 사용할

//First testing program for PIC18F2550 

#include <p18f2550.h> 
#include <stdlib.h> 
#include <delays.h> 

#define _XTAL_FREQ 4915200 
#pragma config PLLDIV = 1 
#pragma config CPUDIV = OSC1_PLL2 
#pragma config FOSC = XT_XT 
#pragma config MCLRE = ON 
#pragma config BOR = OFF 
#pragma config WDT = OFF 
#pragma config IESO = OFF 
#pragma config PBADEN = OFF 
#pragma config LVP = OFF 

unsigned char setupstream[12] = {0b0011, 0b0011, 0b0011, 0b0010, 0b0010, 0b1000, 0b0000, 0b0001, 0b0000, 0b1111, 0b0000, 0b0110}; 
unsigned char teststream[6] = {0xF0, 0x00, 0xFF, 0x00, 0xFF, 0x00}; 
unsigned char letterstream[2] = {0b0010, 0b0001}; 
unsigned char c1 = 0, c2 = 0, c3 = 0, outreg = 0, outmask = 0, feedout = 0; 


void main(void){ 

//CONFIG4L = 0b01000001; 
UCONbits.USBEN=0; 
UCFGbits.UTRDIS=1; 
//OSCCONbits.IRCF2=1; 
//OSCCONbits.IRCF1=1; 
//OSCCONbits.IRCF0=1; 
OSCCONbits.SCS1 = 0; 
OSCCONbits.SCS0 = 0; 
BAUDCONbits.TXCKP=0; 
SPBRG = 0x3F; //1200 baud 
TRISA = 0x00; 
TRISB = 0xFF; 
TRISC = 0x00;  

LATCbits.LATC0 = 1;  //Start: beep the speaker 
Delay10KTCYx(8); 
LATCbits.LATC0 = 0; 
Delay10KTCYx(8); 

LATA = 0;    //reset 
Delay10KTCYx(8); 
LATAbits.LATA2 = 1;  //load the reset 
Delay10KTCYx(8); 
LATAbits.LATA3 = 1;  //stop reset 
LATAbits.LATA2 = 0; 
Delay10KTCYx(123); 

for(c1==0; c1<12; c1++){ 
    for(c2==0; c2<2; c2++){ 
     outreg = setupstream[c1] << 2; //nibble of data needs to be in the middle 
     //outreg |= 0b00000010;   //set flags 
     //outreg ^= 0b00000001; 

     outmask = 0x80;     
     for(c3=0; c3<8; c3++){ 
      LATAbits.LATA0 = (outreg & outmask) ? 1:0; 
      outmask >>=1;   

      Delay10KTCYx(8); 
      LATAbits.LATA1 = 1;  //clock the data out 
      Delay10KTCYx(8); 
      LATAbits.LATA1 = 0;    
     } 

     Delay10KTCYx(8);   
     LATAbits.LATA2 = 1;   //one byte fed out; load it into shift regs 
     Delay10KTCYx(8); 
     LATAbits.LATA2 = 0; 
    } 
} 

LATAbits.LATA0 = 0; //Done, clear the line and 
LATCbits.LATC0 = 1; //Beep the speaker 
Delay10KTCYx(8); 
LATCbits.LATC0 = 0; 
Delay10KTCYx(8);  

while(1){ //Idle 
} 
} 

위의 코드에서 :

여기에 코드 덤프입니다. 맞춰봐. 어셈블리와 관련하여이 모든 작업을 진지하게 고려 중입니다. C를 사용하면 겉으로보기에는 간단한 작업으로 많은 문제가 발생했기 때문입니다. 나는이 일의 배경에서 무슨 일이 일어나고 있는지에 대해 아무런 통제력이없는 것처럼 느낍니다. 저는 Pickit 3을 사용하고 있습니다 만 실제로 진행되고있는 것에 대해 좋은 아이디어를 원한다면 ICD2를 파헤쳐 야 할 수도 있습니다.

+1

", 귀하의 게시물에 하나의 물음표가 없습니다. 어떤 종류의 질문이 있습니까? –

답변

1

(더블 ==)

사용 오히려 비교보다는 (= 하나)으로 할당 된 루프 변수의를 initialsing 시도

for(c1=0; c1<12; c1++){ 
    for(c2=0; c2<2; c2++){ 

대신 "삼원 연산자 제외

for(c1==0; c1<12; c1++){ 
    for(c2==0; c2<2; c2++){ 
+0

나는 분명히 나무 숲을 볼 수 없다. 감사. –