PE et assembleur

PapyJP

Senior Member
Bonjour
nouveau sur le Forum, je suis un Papy passionné des PIC et du language assembleur.
Je souhaite initier mes petits enfants aux joies ( et aux peines ! ) de la programmation et pour cela je me tourne vers les Picaxes et le language Basic, épatants pour débuter.
J' utilise PE en mode diagramme et voici deux questions dont je ne trouve pas les réponses dans les manuels:
1/ Quand j' ai terminé un diagramme, ( il tourne en simulation ) comment insérer un bloc pour y ajouter une nouvelle fonction ou un appel à une sous routine ?
Je n' arrive pas à déplacer une partie du diagramme pour faire une place au nouveau bloc. Faut-il tout recommencer ?
2/ Peut-on utiliser, en sous routine par exemple, une fonction écrite en assembleur ?
Si oui, faut-il faire un copier-coller dans le programme en Basic ?
 

PieM

Senior Member
Bonjour,

et bienvenue...

2/ Peut-on utiliser, en sous routine par exemple, une fonction écrite en assembleur ?
Si oui, faut-il faire un copier-coller dans le programme en Basic ?
Concernant l'assembleur, il n'est hélas pas possible de mixer une sous routine en assembleur.

Pour ce qui est du mode diagramme, ne le pratiquant pas, je laisse le soin à d'autres d'apporter une réponse.
Attention toutefois que ce mode , interne à PE n'est plus maintenu par Rev-ED qui conseille d'utiliser Logicator...
 

PapyJP

Senior Member
Merci PieM d' avoir répondu ( même si la réponse est décevante, je m' y ferais ! ).
Vous semblez n' utiliser qu' un éditeur de texte pour dérouler vos instructions, Ok.
J' ai donc traduit mon diagramme en lignes Basic et là, surprise ! Pas de directives ( sauf un let de précaution ), pas de déclarations, rien qui ne ressemble à un programme PIC en assembleur. Même pas de " end " !!!!
Bref je sens que je ne maîtrise ni l' organisation ni la structure d' un programme en Basic. J' ai trouvé la syntaxe dans les manuels mais pourriez-vous m' indiquer un tutoriel, un article, un site, ... traitant ces sujets ?
 

PieM

Senior Member
Bonjour,

Le passage du mode diagramme au mode texte n'est jamais très structuré ...
Je ne connais pas de tutoriel spécifique à ce type de programme.

Ce que je peux vous montrer c'est ce que je fais par un petit extrait d'un programme...
Mais c'est sans prétention, car chacun a ses habitudes bonnes ... ou mauvaises.
J'avais lu sur le forum anglais, un post de Westaust qui parlait de l'organisation de ses programmes mais je ne l'ai pas retrouvé.
Je sais que lui par exemple , préconise d'écrire les instructions en majuscules pour les différencier du reste.
Par flemme, je ne le fais pas!

Concernant le end, il est mis systématiquement par le compilateur lors du transfert.
Il est possible d'en mettre un en fin du programme principal, pour éviter que celui-ci continue sur un sous programme.

Dans le code suivant, l'indentation d'origine n'est pas trop conservée, ce qui nuit un peu à la clarté ...
et la maintenabilité exigerait beaucoup de commentaires pour être correct!



Code:
'===============================================
'Circuit principal - 28X2  - 5V
'Prg: Modprinc00 
'date: 20100615
'liaison I2C avec Modmot - Modpos - Modcharge - Compas/accel
'===============================================
'Directives--------------

#picaxe 28X2
#no_table	
#no_data	

'in ---------------------

Symbol Iton     = A.0
Symbol Bat 	= A.2
Symbol Ppv 	= A.3

'out --------------------

Symbol MesurPPV	= C.0
Symbol Mmottond    = C.1

Symbol CDModMotG = B.3	'NU
Symbol CDModMotD = B.4	'NU

Symbol CD1ModPos = B.5
Symbol CD2ModPos = B.6
Symbol HP                = B.7

'variables -------------------

'b0 et b1 reserve bits flag
symbol flagbalai	= bit4
symbol flagprox 	= bit5
symbol Sens		= bit8 '1 si gauche  0 si droite
 
symbol Rx   	        = b2			'< Modpos
symbol Ry   	        = b3			'< Modpos
symbol IR 		= b4 		'< Modpos
symbol lum 		= b5			'< Modpos
symbol memlum 	= b6 		'< Modpos
symbol ConsMotD	= b7 	'>> Modmot consigne vit Mot droit
symbol ConsMotG	= b8 	'>> Modmot consigne vit Mot gauche
symbol zzzzz	= b13
symbol IMotD	= b10  	         '<< Modmot Intensité Moteur Droit
symbol IMotG	= b11	         '<< Modmot Intensité Moteur Gauche
symbol xxxxx	= b12
symbol yyyyy	= b13

symbol echo			= w7 	'< Modpos b14 b15  
symbol Rz  			= w8	'< Modpos b16 b17	
symbol MemRzLum    	= w9 	'< Modpos b18,b1 9
symbol memechomax 	= w10	'< Modpos b20 b21	
symbol MRzechomax 	= w11	'< Modpos b22 b23

symbol Ubat			= w14
symbol Uppv			= w15
symbol IMotton		= w16
symbol MemID 		        = w18
symbol MemIG		        = w19

symbol Cap 		        = w20
symbol Ecart 	                 = w21
symbol VitAR 	                 = w22
symbol VitAV 	                 = w23
symbol MemconsD 	         = w24
symbol MemconsG 	         = w25
symbol MoyRz	                 = w26

'initialisation------------------------------

hi2csetup i2cslave, %10100000	'adresse slave  $A0
settimer t1s_8  'preload timer pour 1 seconde

MemID = 80 :MemIG = 80
VitAR = 70 :VitAV = 160
MemconsD = 185 : MemconsG = 170

'==================================
Princ:
'-------------------------------------------------------------
  'init Cap sur RZ depart
   pause 3000
   get 17, b16,b17	' Rz
   cap = Rz :MoyRZ =Rz
   gosub BIP
do

	gosub testBat
	gosub testIR
	gosub testecho
	gosub suivicap
	gosub misajour
	gosub testImot 	
	pause 20

loop

'============================================ 
Testecho:
'---------------------------------------------

get 15, b14,b15 		'echo
select echo
	case >700
			ConsMotD = MemConsD: ConsMotG = MemConsG
			put 2, ConsMotD,ConsMotG
	
	case  400 to 700
		if ecart > 10 then return :	endif 
			
			ConsMotD = 127: ConsMotG = 127	'Arret moteur
			put 2, ConsMotD,ConsMotG		'Arret moteur
			'low flagprox
			gosub balayage
	else 	
		do
			ConsMotD = VitAR: ConsMotG = VitAR
			put 2, ConsMotD,ConsMotG
			get 15, b14,b15 		'echo
			pause 20 
		loop while echo <45
		high flagprox		'flag de proximité
		goto testecho
endselect

return
'============================================
Balayage:
'---------------------------------------------
	put 25, 0,0					'RAZ Memechomax
	if flagbalai = 0 then :	gosub balaymin
					else : 	gosub balaymax 
	endif
					
	do						'boucle attente de la transmission
  	get 21, b20,b21,b22,b23 ' Memechomax et MRzmax
	loop while memechomax=0
  		pause 300
  		
	  	If memechomax > 700 then 
	  	cap = MRzechomax
	  	return
	  	endif
	  	
	  	If flagbalai =1 then
	  	gosub degage
	  	cap = MRzechomax
	    else : flagbalai =1 'balayage maxi
	   	endif
	  	gosub balayage

'============================================
BIP:

sound HP,(105,30, 110,30) : return
'============================================
 

PapyJP

Senior Member
Merci et surtout bravo !
Voilà un listing clair, aéré et bien structuré comme je les aime, on s' y retrouve.

Concernant les instructions en majuscule, peut être si l' on utilise un éditeur de texte ' indépendant ' genre bloc note ou Word; mais quelques essais avec PE me montrent que les instructions sont imprimées en bleu ( comme dans MPLAB IDE ) ce que je trouve bien commode.

Encore une question concernant le hard: J' ai fait un grand tableau comparatif des différents Picaxe ( galère car il faut réunir des caractèristiques de différents § des manuels ).
J' avais porté mon choix sur le 20M2 ( 20 pattes et 1 DAC ) mais j' ai lu dans le Forum que plusieurs adhérents avaient eu des soucis jusqu' à l' échange par Gotronic.
Avez-vous un avis
Merci et encore bravo, travail de pro !
 

PieM

Senior Member
Merci .. :)

Je crois que quand on a des programmes de plusieurs centaines de ligne on est un peu obligé d'adopter un minimum de structure et de mise en forme...

Concernant les 20M2, il semble qu'il y ait eu effectivement un problème à une époque, peut être un bug de bootloader. Mais il n'y a jamais eu, à ma connaissance de récidive. En tout cas Gotronic a été consciencieux !

Il y a une petite doc sur les M2 qui remplacent toute la série des 08, 14, 20, Ici

et cette page de Picaxe.com est intéressante aussi... http://www.picaxe.com/FAQs/Interfacing/
 

fuse

Senior Member
Bonjour PapyJP,

Avec un peu de retard, je me permet de complèter la réponse de PieM.

1/ Quand j' ai terminé un diagramme, ( il tourne en simulation ) comment insérer un bloc pour y ajouter une nouvelle fonction ou un appel à une sous routine ?
Avec Programming Editor en mode flowchart , pas de décalage possible, cependant, il est possible de sélectionner un ensemble de bloc avec la flèche "Select within area" (il s'agit de la flèche entourée par des lignes pointillées). Malheureusement, cela détruit souvent les liaisons.
Cette option de décalage est possible avec Logicator.


2/ Peut-on utiliser, en sous routine par exemple, une fonction écrite en assembleur ?
Si oui, faut-il faire un copier-coller dans le programme en Basic ?
Pas de copier-coller avec la commande BASIC du mode flowchart de Programming Editor mais possibilité de copier-coller sur différents blocs (mais cela met des blocs un peu partout).
Encore un fois Logicator fait mieux : le copier-coller d'une ou plusieurs commandes en BASIC est possible. Cependant pas d'assembleur...

Concernant les 20M2 (commandés chez A4) aucun problème avec Programming Editor ou Logicator en ce qui me concerne.
Petite remarque personnelle : le 20M2 est un circuit très homogène, pas très cher, puissant et assez bien équipé en entrées/sorties....
Dernier point : pas de préférence entre la programmation BASIC et flowchart, le choix de l'un ou l'autre s'effectue en fonction de ses objectifs.
Je privilégie le mode flowchart avec les élèves et pour faire ses premiers pas,
J'utilise le mode BASIC pour les programmes utilisant des commandes non disponibles en flowchart... Cela m'arrive rarement...

Cordialement
 
Last edited:

PapyJP

Senior Member
Je crois que quand on a des programmes de plusieurs centaines de ligne on est un peu obligé d'adopter un minimum de structure et de mise en forme... Pas qu' un peu !
J' ai écrit des programmes pour des PIC 16F74 comportant plus de 4000 lignes assembleur. Sans méthode ni structure, j' y serais encore ! ( Aie mes chevilles ... ). Ils étaient plus pleins que des oeufs car ces derniers possèdent une réserve d' air pour respirer !
Ingénieur électronicien ( d' application, à la retraite ), je pensais être à l' aise avec le hard. La consultation du site que vous m' avez signalé me montre qu' il y a quelques spécifcités pour les Picaxes, donc merci, je vais rester vigilant pour ne pas me planter.

En assembleur, j' écrivais chaque fonction indépendamment, la débugais puis la sauvais dans un fichier très documenté ( entrées, sorties, symboles, appels, ... ). L' écriture de programme principal devenait un meccano par copier-coller. Fuse ( voir son aimable message ) semble me dire que ce n' est pas possible en Basic. Cruelle déception !
 

PieM

Senior Member
En assembleur, j' écrivais chaque fonction indépendamment, la débugais puis la sauvais dans un fichier très documenté ( entrées, sorties, symboles, appels, ... ). L' écriture de programme principal devenait un meccano par copier-coller. Fuse ( voir son aimable message ) semble me dire que ce n' est pas possible en Basic. Cruelle déception !
A moins que j'ai mal compris, mais ce que disait Fuse, c'est que ce n'est pas possible dans le mode flowchart de P.Editor.
Dans le mode texte du Basic, cela reste possible bien sûr!

D'autre part, ce basic ne permettant pas le passage d'arguments pour des fonctions prédéfinies, cela présente un risque lors du copier coller.

Et l'idéal serait une directive include, mais elle n'est pas encore implémentée .
 

PapyJP

Senior Member
Bien vu le pb du passage d' argument !
Ca demande réflexion ..............
Certains logiciels permettent de déclarer des variables comme " globales ", locales ", " déclarées dans l' en tête comme utilisables dans une fonction ou une sous-routine ".
Ca n' existe pas en Basic ?
 
Last edited:

fuse

Senior Member
Bonjour,

OUI, je parlais du mode flowchart pour Programming Editor.
Concernant les Picaxes, inutile de déclarer les variables en locales ou globales, c'est même inutile de les déclarer (pas d'instruction de type DIM comme avec les Picbasic...).
Avec Programming Editor. les variables vont de b0 à b13 et sont en 8 bits.
Les variables peuvent être organisées en 16 bits, dans ce cas là elles se regroupent en b0/b1 b1/b2... et s'appellent w0, w1 ...
Toutes ces variables peuvent être appelées à tout moment dans un programme sans aucune déclaration.
Cordialement
 

PapyJP

Senior Member
Merci PieM et Fuse
La balle est nettement dans mon camp !
Je vais pratiquer mais attendez-vous à recevoir des SOS de PapyJP.
Amitiés.
Autre question.
Mon " reply with quote " n' a pas marché comme attendu.
J' avais entouré la phrase de balises obtenues par l' icone ad hoc ..............
 

PieM

Senior Member
Bonjour,

Je vais pratiquer mais attendez-vous à recevoir des SOS de PapyJP.

Mon " reply with quote " n' a pas marché comme attendu.
J' avais entouré la phrase de balises obtenues par l' icone ad hoc ..............
Pour les SOS, pas de problème ... le forum est fait pour ça ! :)

Le "reply with quote", met en place le texte avec les balises Quote normalement.
Sinon sélectionnez l'icone QUOTE dans le menu, et faites un copier coller du texte souhaité entre les deux balises...
c'est souvent ce que je fais pour ne pas copier tout le texte systématiquement.
 
Top