2013-02-14 1 views
0

Stackoverflow, vous m'avez déjà aidé, je pense avoir encore besoin de votre aide. J'essaie de mordre ma propre série en utilisant un GPIO sur un PIC18F2550. Cela se connecte à certains registres à décalage (3x74LS595), où le dernier se connecte à un écran LCD HD44780 standard. Jusqu'à présent, j'ai le cliquetis et le verrouillage fonctionnant correctement, et après un long combat, les données sont maintenant correctement crachées (il s'avère que le changement de barillet ne fonctionne pas bien et la chose crachera volontiers des données hors limites, mais Je digresse). Mon problème est que pour utiliser l'écran LCD, j'ai besoin de basculer la broche d'activation comme une horloge de données, donc pour enregistrer le code j'ai simplement imbriqué une autre boucle qui court deux fois et bascule le drapeau d'activation tout en crachant le même octet. Cela devrait théoriquement doubler la quantité d'octets crachés de 12 à 24. Pour une raison quelconque, lorsque cette boucle est ajoutée, cela ne fonctionne pas. Il crache juste deux octets et quitte. Sans cela, il crache bien tous les 12 octets (bien que l'écran LCD ne soit pas configuré correctement car l'activation n'est pas là).La série Bit-banged sur PIC arrête de travailler avec la boucle imbriquée C

Voilà une photo de fonctionner, sans la boucle imbriquée permettre:

Linked because lack of rep

D0 et D1 sont des données/2 est en dessous de l'horloge/charge respectivement.

Et voici avec la boucle:

Linked because lack of rep

Ce bord à l'extrême gauche est la remise à zéro initiale de la ligne. Je sais que c'est fait après ces deux octets parce que ça sonne le petit buzzer qui indique que tout le code significatif est fait.

est ici une décharge de code:

//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 
} 
} 

Dans le code ci-dessus j'ai même désactivé le basculement pour voir si elle crachait tous les octets. Je ne pense pas. Je pense sérieusement à faire tout ça en assemblée parce qu'avec C j'ai eu beaucoup de problèmes avec des choses apparemment simples; J'ai l'impression que je n'ai aucun contrôle sur ce qui se passe en arrière-plan de cette chose. J'utilise Pickit 3 mais je devrais peut-être creuser l'ICD2 si je veux avoir une bonne idée de ce qui se passe réellement.

+1

Mis à part le « opérateur ternaire ", il n'y a pas un seul point d'interrogation dans votre message. Avez-vous une question quelconque? –

Répondre

1

essayer initialsing la pour les variables de boucle avec assignation (simple =) plutôt que de comparaison (à double ==)

utilisation

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

au lieu de

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

Je ne peux pas voir la forêt pour les arbres apparemment. Merci. –

Questions connexes