Soucis avec Hserout et Hserin

gandalf60

New Member
Bonjour

Suite de mes essais

Suite a vos conseils, j'ai essayé la méthode de Hippy a la lettre.
Cela fonctionne très bien, évidemment...

Mais je désire passer 2 octets, donc je fais une modif pour en passer 2, en me servant de B0 comme flag pour les différencier.

Ok ca marche, sauf que si je coupe (volontairement) la liaison Hserout/Hserin, le prog attends...

soit je fais une bêtise, ou cela est du au prog de Hippy.

je suis sur un 08M2 pour l’émetteur, et un 20M2 pour le recepteur.

code émetteur
Code:
#Picaxe 08M2
#Terminal Off
#No_Data
                    ;  .------ 1 = Disable Hserin pin
                    ;  |.----- 0 = Enable Hserout pin
                    ;  ||.---- 0 = Don't invert input
                    ;  |||.--- 0 = Don't invert output
                    ;  ||||.-- 0 = No scratchpad receive
Transmitter:        ;  |||||
  HSerSetup b31250_4, %10000
  Do
 
   readadc C.2,b1
   readadc C.1,b2
    Pause 150
    HSerOut 0, ( $A0, b1 )
    'b0 = b0 + 1 // 100
  pause 200
 
  HSerOut 0, ( $B0, b2 )
 
 
  Loop

code récepteur

Code:
'test hserin
#Picaxe 20M2
'#Terminal 4800
#No_Data
symbol bp=pinC.6
symbol led=C.7
symbol LCD=C.1
symbol baud =T9600_16
Symbol PIR1      = $11
Symbol PIR1_RCIF = bit5

serout LCD,baud, (254,1)
pause 200
              
              
              
              ;  .------ 0 = Enable Hserin pin
                    ;  |.----- 1 = Disable Hserout pin
                    ;  ||.---- 0 = Don't invert input
                    ;  |||.--- 0 = Don't invert output
                    ;  ||||.-- 0 = No scratchpad receive
Receiver:           ;  |||||
  HSerSetup B31250_4, %01000
  Pause 2000
  SerTxd( "Started", CR,LF )
  Do
    
    'Do
      Do
        PeekSfr PIR1, b0
      Loop Until PIR1_RCIF = 1
      Pause 100
      w0 = $FFFF
      HSerIn b0
      HSerIn b1
 
    if b0=$A0 then
        gosub affi1
    endif
if b0=$B0 then
    gosub affi2
    endif
    'Loop Until b0 = $D0 And b1 < $100
    'SerTxd(#b1, CR, LF )
 
  if bp=1 then
      high led
      else low led
  endif
  'serout LCD,baud,(254,128,"Val1=",#b1," ")
  Loop
affi1:
serout LCD,baud,(254,128,"Val1=",#b1," ")
return

affi2:
serout LCD,baud,(254,192,"Val2=",#b1," ")
return



ps:J'ai lu la doc sur le pic du 20M2 et j'au vu qu'il y a 3 registres "pir".
dans ma méthode j'emploie pir1 pour passer 4 octets, (en 2 fois).
serait il préférable d'utiliser pir1 et pir2?

Merci a vous
 

PieM

Senior Member
Bonjour,
serait il préférable d'utiliser pir1 et pir2?
Non, PIR1 est un registre de flags d'interruption, dont le bit5 correspond à la réception USART sur le Pic.
Il est certain que le fait d'être dans une boucle do loop, bloque le programme lors d'une attente de réception.
Il faudrait faire l'essai sans cette boucle Do PeekSfr PIR1, b0 Loop Until PIR1_RCIF = 1
Le fait d'écrire dans le buffer la valeur $FFFF et de contrôler si elle change, devrait être suffisant.
Comme déjà dit ne pas envoyer les infos trop rapidement depuis l'émetteur quand on fait des tests.
 

gandalf60

New Member
Bonjour

Non, PIR1 est un registre de flags d'interruption, dont le bit5 correspond à la réception USART sur le Pic.
Ok compris

Il faudrait faire l'essai sans cette boucle Do PeekSfr PIR1, b0 Loop Until PIR1_RCIF = 1
Le fait d'écrire dans le buffer la valeur $FFFF et de contrôler si elle change, devrait être suffisant.
Ça marche!, même sur 3 octets a la suite

Merci

PS: je viens de recevoir mon 20X2, je commence a me battre avec lui...pour la com
 
Top