Ce programme permet donc de lire les données issues du lecteur de bandes perforées, en utilisant le signal SPTK pour le strobe. La polarité du signal strobe est détectée automatiquement en partant du principe que les données ne changent pas durant l'état actif de ce signal (i.e. les données sont positionnée, le strobe est activé puis désactivé, et les données sont modifiées pour l'octet suivant).
On peut également reprendre ce prgramme en le débarrassant du traitement de la parité (variables parity et rotate) afin de lire un port parallèle normal (sans parité).
On peut aussi s'inspirer de la méthode de lecture directe des ports pour faire un petit analyseur logique.
Une remarque concernant les niveaux logiques lus :
Les cartes sont en technologie TTL et l'Arduino en technologie CMOS 5V. Même si la lecture de la première par la seconde ne pose généralement pas de problème, en toute rigueur elles ne sont pas vraiment compatibles, à cause d'une différence des niveaux de tension garantis.
En effet, le niveau haut d'une sortie TTL correspond à un minimum de 2,7V, tandis que sur l'entrée CMOS de l'Arduino le minimum spécifié est de 3,0V. Il existe donc un risque, faible mais réel, que l'Arduino ne lise pas le niveau logique de la sortie TTL.
Typiquement, à l'état haut la sortie TTL fournit 3,5V et l'entrée CMOS accepte 2,5V, ce qui permet de réaliser correctement la lecture du niveau logique. Mais on n'est pas à l'abri de tomber sur une situation exceptionnellement défavorable où la tension de sortie serait trop basse et le niveau d'entrée trop élevé.
Si tel était le cas, on pourrait commencer par tenter d'aider un peu les sorties TTL en activant les résistances de pull-up sur chaque entrée de l'Arduino, ce qui se réalise en écrivant 1 dans les bits correspondants du port de sortie :
On pourrait d'ailleurs rajouter ce code au programme afin que les résistances de pull-up soient toujours présentes, au cas où.Code:void setup() { #if defined(__AVR_ATmega2560__) // Arduino Mega 2560 PORTA = 0xFF; // pull-up inputs #22...#29 PORTC |= 0x80; // pull-up input #30 #else // Arduino Uno PORTD |= 0xFC; // pull-up inputs #2...#7 PORTB |= 0x07; // pull-up inputs #8...#10 #endif ...
Si cela ne suffisait pas (ce qui ne serait vraiment pas de chance), il faudrait alors rajouter quelques composant externes pour régler le problème.
-----