Contraintes d’opérande d’assemblage en ligne ATTiny414 pour le paramètre de broche d’E / S

sol

Contraintes d’opérande d’assemblage en ligne ATTiny414 pour le paramètre de broche d’E / S


J’essaie d’utiliser la bibliothèque light_ws2812 pour piloter les LED WS2812 à partir d’un ATTiny414. Le noyau de cette bibliothèque est un extrait d’assemblage en ligne qui bitbangs la ligne série. le voici avec les chronomètres nus:

 void   inline  ws2812_sendarray_mask ( uint8_t   * data , uint16_t  datlen , uint8_t  maskhi ) 
 { 
   uint8_t  curbyte , ctr , masklo ; 
   uint8_t  sreg_prev ; ws2812_DDRREG |=  maskhi ;   // Enable output masklo =~ maskhi & ws2812_PORTREG ; maskhi |=  ws2812_PORTREG ; sreg_prev = SREG ; cli ();   

   while   ( datlen --)   { curbyte =* data ++; 

     asm   volatile ( 
     " ldi %0,8 nt" 
     "loop%=: nt" 
     " out %2,%3 nt"      // '1' [01] '0' [01] - re 
     " sbrs %1,7 nt"      // '1' [03] '0' [02] 
     " out %2,%4 nt"      // '1' [--] '0' [03] - fe-low 
     " lsl %1 nt"      // '1' [04] '0' [04] 
     " out %2,%4 nt"      // '1' [+1] '0' [+1] - fe-high 

     " dec %0 nt"      // '1' [+2] '0' [+2] 
     " brne loop%=nt"      // '1' [+3] '0' [+4] 
     :    "=&d"   ( ctr ) 
     :    "r"   ( curbyte ),   "I"   ( _SFR_IO_ADDR ( ws2812_PORTREG )),   "r"   ( maskhi ),   "r"   ( masklo ) 
     ); 
   } SREG = sreg_prev ; 
 } 

Une différence évidente entre l’AVR ordinaire et les définitions de la série C d’ATTiny * 14 est que les registres d’E / S ne sont pas appelés DDRx et PORTx mais PORTx.DIR et PORTx. J’ai déjà corrigé cela dans l’en-tête light_ws2812 et cela semble bien fonctionner.

Après cela, je reçois cependant une erreur avec l’opérande d’assemblage 2 ( "I" (_SFR_IO_ADDR(ws2812_PORTREG)) ):

 lib / light_ws2812 . c :   In   function   'ws2812_sendarray_mask' : lib / light_ws2812 . c : 119 : 5 :  warning :   asm  operand 2  probably doesn 't match constraints asm volatile( ^~~ lib/light_ws2812.c:119:5: error: impossible constraint in ' asm ' make: *** [Makefile:28: lib/light_ws2812.o] Error 1 

J’ai également essayé d’utiliser un i minuscule comme contrainte au lieu du I , ce qui change l’erreur en

 /tmp/ ccBR4JKE . s : 48 :   Error :  operand out  of range :   1028 

En regardant la fiche technique, cette valeur est logique, PORTA commence à 0x400 (1024) et le registre PORTx.OUT a un décalage supplémentaire de 4 octets, plaçant PORTA.OUT à 0x404 = 1028 .

avec une contrainte de registre 16 bits comme x ou w il compile mais j’obtiens une erreur de l’éditeur de liens:

 avr - ld :  lib / light_ws2812 . o :   in   function   `loop32': light_ws2812.c:(.text+0x38): undefined reference to ` r30 ' 

Je compile ceci en utilisant avr-gcc et avr-ld , avec une avr-libc laquelle j’ai ajouté manuellement les fichiers pertinents du package de Atmel ATtiny Series Device Support .

sol

peut-être devrais-je plutôt utiliser le registre VPORTA.OUT ? Il commence à 0x0 donc contrairement à PORTA.OUT il devrait tenir dans i

Réponses


 C_Elegans

La série ATTiny 1 a les registres GPIO mappés en dehors de l’espace de registre de port io, de sorte qu’ils ne sont pas accessibles via out ou in . Vous devrez soit utiliser les registres VPORT, soit charger l’adresse du port io dans un registre et utiliser une instruction st pour écrire les données. Si vous décidez d’utiliser une instruction de stockage normale, cela peut changer le timing de la boucle, vous devrez donc peut-être ajuster le nombre de nop s.

sol

Très bien, j’étais également arrivé à une conclusion similaire après avoir finalement compris comment lire la disposition de la mémoire globale à partir de la fiche technique. Y aurait-il un avantage à utiliser les instructions d’adressage de bits pour définir la broche?

C_Elegans

Je ne suis pas sûr du tiny414, mais l’arc AVR global définit st comme prenant 2 cycles, tandis que out prend 1 cycle.

sol

Je pense que ce serait SBI et CBI . Comme ce sont toutes des instructions à cycle unique, je suppose qu’il n’y a pas de différence (sauf que s’il y avait un périphérique actif, nous ne pourrions / ne pourrions pas écraser leurs valeurs dans le registre des ports, mais je ne suis pas sûr que ce soit réellement un problème possible). Je vérifierai si cela fonctionne comme prévu lorsque je rentrerai à la maison et j’accepterai la réponse 🙂

sol

D’accord, je n’ai pas encore pu faire fonctionner mon code, mais cela n’est probablement pas lié à la question puisque le code d’origine avec la contrainte "I" fonctionne maintenant avec VPORT *.

 

(s), /, #de, #en, #pour, ATTiny414, broche, Contraintes, d’assemblage, d’opérande, Le, ligne, paramètre

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *