Question

Je suis assez nouveau à la programmation des microcontrôleurs.J'ai une certaine expérience avec l'Arduino, mais après j'avais presque terminé mon projet, je décidons de déplacé mon projet actuel, à quelque chose de moins cher et plus petit.Donc, je suis maintenant en utilisant le AVR ATmega32 avec Atmel studio.

Je suis en train d'utiliser l'ATmega32, de communiquer à un MAX7219 puce pour le multiplexage avec une matrice de led.cependant, j'ai plusieurs différents appareils que j'ai envie de communiquer avec.

Comment puis-je communiquer avec l'appareil sans l'aide de la SPI goujons sur le microcontrôleur?J'ai fait un projet de test, mais il semble y avoir quelque chose de mal et je ne peux pas comprendre ce qu'est la question.Je pense que j'ai réussi à l'obtenir en mode test, parce que tous les Voyants sont allumés, mais je n'arrive pas à faire quoi que ce soit après que.Je ne peux même pas effacer l'affichage/l'arrêter.J'ai vérifié le câblage une fois de plus.Est mon codage peut-être incorrect aussi loin que la configuration des broches et affectation des broches?Avez-vous des suggestions pour ce ou une meilleure façon d'écrire mon code?

Voici le lien pour le MA7219 feuille de données

//test

#include <avr/io.h>


int main(void)
{

DDRB = 0b00000111; // pin 1(data), 2(clock) and 3(latch) are outputs

PORTB = 0 << PINB0; // data pin 1 is low
PORTB = 0 << PINB1; // clock pin 2 is low
PORTB = 0 << PINB2; // latch pin 3 is low

uint16_t data;
data = 0b0000110000000000; // data to shift out to the max7219

 //read bit
uint16_t mask;
 for (mask = 0b0000000000000001; mask>0; mask <<= 1) 
{ 
    //iterate through bit mask
    if (data & mask)
    { // if bitwise AND resolves to true
        // send one
        PORTB = 1 << PINB0;
        // tick
        PORTB = 1 << PINB1;
        // tock
        PORTB = 0 << PINB1;
    }
     else{ //if bitwise and resolves to false
        // send 0
        // send one
        PORTB = 0 << PINB0;
        // tick
        PORTB = 1 << PINB1;
        // tock
        PORTB = 0 << PINB1;
    }

}

PORTB = 1 << PINB2; // latch all the data
PORTB = 1 << PINB0; // data pin 1 is high
PORTB = 0 << PINB1; // clock pin 2 is low
PORTB = 0 << PINB2; // latch pin 3 is low
}
Était-ce utile?

La solution

Oui, votre bit-bang code a un problème dans ce que vous attribuer la totalité de la valeur du registre à chaque fois, sans la préservation de la valeur existante.Par conséquent, vous pouvez effacer vos données de signal à l'instant de la conduite de votre horloge, violant le temps d'attente du récepteur et résultant en des opérations imprévisibles.

Au lieu de l'affectation des broches avec =, vous devez les fixer avec |= ou clairement avec &= ~(value)

Par exemple:

     PORTB = 1 << PINB0;      //drive data
    // tick
    PORTB |= 1 << PINB1;      //clock high PRESERVING data
    // tock
    PORTB &= ~(1 << PINB1);   //clock low

Vous pouvez aussi avoir besoin d'insérer un léger retard entre la broche opérations.

Techniquement, étant donné que vous êtes déjà en utilisant un if pour l'état des données, vous pouvez également re-conduire le signal de données avec un OU dans l'affectation, par exemple

if (data & mask)
{ // if bitwise AND resolves to true
    // send one
    PORTB = 1 << PINB0;
    // tick
    PORTB = (1 << PINB1) | (1 << PINB0);
    // tock
    PORTB = 0 << PINB1 | (1 << PINB0);
}
 else{ //if bitwise and resolves to false
    // send 0
    // send one
    PORTB = 0 << PINB0;
    // tick
    PORTB = 1 << PINB1;
    // tock
    PORTB = 0 << PINB1;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top