Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Resolu : easynixie clock a 16f628a : chiffres non corrects ?
elektrax
Débutant
Débutant
Messages : 50
Enregistré en : septembre 2015

#1 Message par elektrax » lun. 21 mai 2018 17:58

bonjour tlm,
j'ai dessiné et cablé un pcb d'apres le schéma : schema, paru aussi dans le num janvier 2008 de la revue radio pratycka electronica, le schéma et le soft est donné pour 4 µcontroleur different. j'ai choisi version avec le 16f628A, on peut telecharger le hex et le C
ClockPIC.c
hitech piccc lite : http://elbastl.sweb.cz/pic628.zip. A la mise sous tension, les 2 afficheurs sec et dizaine de sec indiquent 00, quelques secondes apres affichage : 307470 avec le chiffre des secondes qui change sauf que les chiffres sont incoherents. j'ai testé mon cablage : entrées ABCD du 74141 (j'ai un k155 russe), et surtout les sorties du support de 74141 : je connecte le 5 volts sur la pin qui doit allumer le 1, puis le 2 etc...ok, soit ma fuse configuration du 628 est incorrecte : intrc i/o pour utiliser les ports ra6 ra7, sur le brochage du 628 la pin 4 RA5 est marquée dig1 B, la pin 1 RA2 aussi : c'est celle qu'il faut utiliser d'apres le fichier c, ra5 est non connectée. A mon avis le 16f628 n'envoie pas les bons codes ABCD au 74141, j'ai du mal a comprendre les lignes 205 a 217 du fichier c et surtout la "table digit" de la ligne 164
static const byte tabledigit[] = {3,2,7,4,1,9,8,0,5,6,0xF,0xF,0xF,0xF,0xF,0xF};
je crois que je devrai la changer, et c'est là que je suis bloqué, je n'ai pas hitec piccc, disponible (gratuitement ?) sur le site microchip : inscription chez microchip (?) que j'avais au temps où je leur commandai des samples (çà fait plus de 10 ans, lol).
je pense que çà devrait etre : static const byte tabledigit[] = {0,1,2,3,4,5,6,7,8,9,0xF,0xF,0xF,0xF,0xF,0xF};
que pensez vous de ce tableau "table digit" ?
merci
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par elektrax le mar. 28 août 2018 10:38, modifié 1 fois.

easynixie clock a 16f628a : chiffres non corrects ?
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1064
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » lun. 21 mai 2018 18:48

bonjour elektrax ,

As-tu refait un schema avec le PIC .. car impossible à suivre avec le schema original ...
Il faut bien pouvoir s"appuyer sur un schema pour suivre aussi le programme.

de plus, si on rajoute le pavé 16F628 tel que decrit
rien ne va plus ..
clock_6_nixies_Pic_Pinout.gif
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

easynixie clock a 16f628a : chiffres non corrects ?
elektrax
Débutant
Débutant
Messages : 50
Enregistré en : septembre 2015

#3 Message par elektrax » lun. 21 mai 2018 20:22

en effet il a fallu redessiner en tenant compte du branchement pic, la pin4 n'est pas digit1 B.
à part les chiffres non conformes, je l'ai laissé 1 journée branchée et çà fonctionne : genre chiffre 3 a la place du zero, d'ailleurs quand je "mets à l"heure" pour les dizaines d'heures je n'ai que les chiffres 3 2 7 qui défilent, alors que çà devrait etre 0 1 2, comme si, pour des raisons de circuit imprimé, l'auteur avait choisi la sortie 74141 du chiffre 3 reliée au chiffre zero du nixie, mais çà n'apparait pas sur le schema qui est dessiné avec les sorties du 74141 conforme à la datasheet, soit je change le cablage entre les sorties du 74141 et les nixies (j'ai mis des in16)
141 3 nixie 0
2 nix 1
7 nix 2
4 nix 3
1 nix 4
9 nix 5
8 nix 6
0 nix 7
5 nix 8
6 nix 9
ou recompiler en changeant juste ce tableau, si je trouve un hitec picc qui accepte le 16f628A qui n'est pas défini dans piccc 9.50 (si quelqu'un connait ?)
déjà pour comprendre que POS 0 correspond aux secondes et POS 5 aux dizaines de minutes...

easynixie clock a 16f628a : chiffres non corrects ?
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1064
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#4 Message par paulfjujo » mar. 22 mai 2018 09:50

bonjour,


Est-ce que ton code fait moins de 2Ko ?
pour essayer de le compiler avec Milkro C..

MikroC est tres semblable à Hitech en fait ..
je viens de l'adapter et compilation OK .. le run c'est autre chose
Cela devrait passer avec la version MikroC OK en libre essai juqu'à 2Ko
Used ROM (program words): 543 (27%) soit 1086 bytes

à toi de jouer..


Code : Tout sélectionner



// revu pour MikroC

/*   ClockPIC.c                                                               */
/*   (c) 2007 St                                                              */
/*   Program for nixie clock controlled by PIC16F627A or PIC16F628A           */
/*   Xtall frequency: 32.768 kHz (External clock for Timer1)                  */
/*   Compiler: HI-TEC PICC-Lite                                               */
/* ========================================================================== */


#define word unsigned int
#define byte unsigned char

// Definition of PIN connection
#define POSITION0 PORTA.F7  // digit anode switches
#define POSITION1 PORTA.F6
#define POSITION2 PORTA.F0
#define POSITION3 PORTB.F5
#define POSITION4 PORTB.F4
#define POSITION5 PORTB.F2

#define DIGIT0 PORTB.F1     // outputs for nixie driver 74141
#define DIGIT1 PORTA.F2
#define DIGIT2 PORTA.F3
#define DIGIT3 PORTB.B0

#define BUZZER PORTB.F3     // alarm buzzer
#define KEYINP PORTA.F4     // button input

// Connection of function buttons to digit positions
#define KEYMENU  4
#define KEYUP    3
#define KEYENTER 2


// Global variables used in main loop and in the timer interrupt
// counter for 2 miliseconds ticks
word milisec 0;
// arrays for real time, alarm and auxiliary time during setting
byte time[6],alarm[6],auxtime[6];
// pressed button code, half second flag (for alarm and blink), blinking position
byte button 0halfsec 0blink 0xF;
// pointer which array to display
byte *p_digit time;

// wait for button pressed or 20 second time-out
void waitbutton(void) {
  
word i;
  
byte n;

  for(
n=0n<200n++) {
    
// Wait for about 100 msec
    
for(i=0i<10000i++) {}
    if(
button) break;
  }
}

// wait for all buttons released
void endbutton(void) {
  
word i;

  while(
button) {
    
button 0;
    for(
i=0i<10000i++) {}
  }
}

// function for setting array "setdata" with a new time
// seconds are not updated, just only hours and minutes
byte settime(byte *setdata) {
  
byte posit 2updated 0next 1;

  while(
next) {
    
blink posit;   // updated position blinks
    
waitbutton();
    
// Test buttons and do 1 of 4 possibilities
    
switch(button) {
      case 
KEYMENU next 0; break; // Stop updating time
      
case KEYENTER: {  // Move to next digit
        
posit++;
        if(
posit == 6posit 2;
      } break;
      case 
KEYUP   : {  // Increment digit on this position
        
setdata[posit]++;
        if(((
posit == 2) || (posit == 4)) && (setdata[posit] == 10)) setdata[posit]=0;
        if((
posit == 3) && (setdata[posit] == 6)) setdata[posit]=0;
        if((
posit == 5) && (setdata[posit] == 3)) setdata[posit]=0;
        
updated 1;
      } break;
      default      : 
next 0;  // Time-out expired
    
}
    
endbutton();
  }
  
// Hours above 23 are not allowed
  
if((setdata[5] == 2) && (setdata[4] > 3)) {
    
setdata[5] = 0setdata[4] = 0;
  }
  
blink 0xF;
  return(
updated);
}
// ****************************
//    Main program function  //
// ****************************
void main(void) {

  
// Default values for start
  
time[4] = 7time[3] = 3;
  
alarm[4] = 7alarm[3] = 4;
  
alarm[1] = 0xFalarm[0] = 0xF;

  
// Turn comparators off
  
CMCON 0x07;
  
// Set Port I/O
  
TRISA 0b00110000;
  
TRISB 0b10000000;

  
/* Init TIMER1 for 2 milisec period - external 32 kHz clock*/
  
T1CON 0b00001011// Timer control register
  
TMR1L 0;    // About 1 sec to start
  
TMR1H 0x80// start Timer
  
TMR1IE_bit 1// Enable interrupt from Timer1
  
PEIE_bit 1;

  
GIE_bit=1;         /* enable interrupts */

  /***** Main loop of program *****/
  
for(;;) {
    
// Set Alarm Buzzer if time == alarm time
    
if((time[5] == alarm[5]) && (time[4] == alarm[4]) && (time[3] == alarm[3]) && (time[2] == alarm[2]) && halfsecBUZZER 0; else BUZZER 1;

    if(
button == KEYMENU) {
    
// Menu button enters time updating
      
endbutton();
      
p_digit alarm;
      if(!
settime(alarm)) {
        
// Alarm was not updated, try Time
        
GIE_bit 0;  // Stop interrupt during copy
        // We must not destroy real Time, copy it to auxiliary array
        
auxtime[5] = time[5];auxtime[4] = time[4];auxtime[3] = time[3];auxtime[2] = time[2];
        
GIE_bit 1;
        
p_digit auxtime;
        if(
settime(auxtime)) {
          
// Time was updated - copy it back
          
GIE_bit 0;
          
time[5] = auxtime[5];time[4] = auxtime[4];time[3] = auxtime[3];
          
time[2] = auxtime[2];time[1] = 0;time[0] = 0;
          
GIE_bit 1;
        }
      }
      
p_digit time;
    } else 
button 0;

  } 
/* loop forever */
  /* please make sure that you never leave main */
}

/*
** ===================================================================
**     Interrupt handler
** ===================================================================
*/
void interrupt() iv 0x0004 ics ICS_AUTO
 
{
  static const 
byte tabledigit[] = {3,2,7,4,1,9,8,0,5,6,0xF,0xF,0xF,0xF,0xF,0xF};
  static 
byte position 0;
  static 
byte auxdigit;

  
TMR1L 0xC1;   // New value for next
  
TMR1H 0xFF;   // 2 milisecond period
  // Increment Time
  
milisec++;
  if(
milisec == 256halfsec 1;
  if(
milisec == 512) {
    
halfsec 0;                 // half second flag
    
milisec 0;                 // miliseconds
    
time[0]++;
    if(
time[0] == 10) {          // seconds
      
time[0] = 0;
      
time[1]++;
      if(
time[1] == 6) {
        
time[1] = 0;
        
time[2]++;
        if(
time[2] == 10) {      // minutes
          
time[2] = 0;
          
time[3]++;
          if(
time[3] == 6) {
            
time[3] = 0;
            
time[4]++;
            if(
time[4] == 10) {  // hours
              
time[4] = 0;
              
time[5]++;
            }
            if((
time[4] == 4) && (time[5] == 2)) {
              
time[4] = 0;
              
time[5] = 0;
            }
          }
        }
      }
    }
  }
  
// Clear display (all digits off)
  
POSITION0 0POSITION1 0POSITION2 0POSITION3 0POSITION4 0POSITION5 0;

  
// New digit to display
  // Test for blinking digit (and set it according "blink" variable)
  
if((blink == position) && halfsec) {
    
DIGIT0 1DIGIT1 1DIGIT2 1DIGIT3 1;
  } else {
    
// Set new digit to display
    
auxdigit tabledigit[*(p_digit position)];
    
DIGIT0 0DIGIT1 0DIGIT2 0DIGIT3 0;
    if(
auxdigit 0x1DIGIT0 1;
    if(
auxdigit 0x2DIGIT1 1;
    if(
auxdigit 0x4DIGIT2 1;
    if(
auxdigit 0x8DIGIT3 1;
  }

  
// Switch ON new digit
  
switch(position) {
    case 
0POSITION0 1; break;
    case 
1POSITION1 1; break;
    case 
2POSITION2 1; break;
    case 
3POSITION3 1; break;
    case 
4POSITION4 1; break;
    case 
5POSITION5 1; break;
  }

  
// Test if pressed button with this position
  
if((!button) && (KEYINP == 1)) button position;

  
// Update position for next digit
  
position++;
  if(
position == 6position 0;
  
TMR1IF_bit 0;                        // Clear the interrupt flag
}

/* END */
 



Code : Tout sélectionner

0 1 mikroCPIC1618.exe -MSF -DBG -pP16F628A --DL -O11111114 -fo8 -N"C:\_MikroC\_MesProjets_MikroC\_16F628A_Horloge_6_Nixies\Horloge_6_Nixies_16F628A.mcppi" -SP"C:\_MikroC\mikroC PRO for PIC\Defs\" -SP"C:\_MikroC\mikroC PRO for PIC\Uses\P16\" -SP"C:\_MikroC\_MesProjets_MikroC\_16F628A_Horloge_6_Nixies\" -IP"C:\_MikroC\mikroC PRO for PIC\Uses\P16\" -IP"C:\_MikroC\_MesProjets_MikroC\_16F628A_Horloge_6_Nixies\" "Horloge_6_Nixies_16F628A.c" "__Lib_Math.mcl" "__Lib_MathDouble.mcl" "__Lib_System.mcl" "__Lib_Delays.mcl" "__Lib_CType.mcl" "__Lib_CString.mcl" "__Lib_CStdlib.mcl"  
0 1139 Available RAM: 208 [bytes], Available ROM: 2048 [bytes]  
0 122 Compilation Started Horloge_6_Nixies_16F628A.c
0 1004 interrupt handler (interrupt at 0x0004) Horloge_6_Nixies_16F628A.c
237 123 Compiled Successfully Horloge_6_Nixies_16F628A.c
0 127 All files Compiled in 63 ms  
0 1144 Used RAM (bytes): 34 (16%)  Free RAM (bytes): 174 (84%) Used RAM (bytes): 34 (16%)  Free RAM (bytes): 174 (84%)
0 1144 Used ROM (program words): 543 (27%)  Free ROM (program words): 1505 (73%) Used ROM (program words): 543 (27%)  Free ROM (program words): 1505 (73%)
0 125 Project Linked Successfully Horloge_6_Nixies_16F628A.mcppi
0 128 Linked in 31 ms  
0 129 Project 'Horloge_6_Nixies_16F628A.mcppi' completed: 109 ms  
0 103 Finished successfully: 22 mai 2018, 09:45:10 Horloge_6_Nixies_16F628A.mcppi

easynixie clock a 16f628a : chiffres non corrects ?
elektrax
Débutant
Débutant
Messages : 50
Enregistré en : septembre 2015

#5 Message par elektrax » mer. 23 mai 2018 04:00

merci pour votre aide
pour que le programme corresponde à mon cablage :
static const byte tabledigit[] = {0,1,2,3,4,5,6,7,8,9,0xF,0xF,0xF,0xF,0xF,0xF};
reste plus qu'à me débrouiller avec un compilateur C

easynixie clock a 16f628a : chiffres non corrects ?
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1064
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#6 Message par paulfjujo » mer. 23 mai 2018 13:28

j'ai modifié la table et recompilé ...
projet mikroC complet
_16F628A_Horloge_6_Nixies.zip
avec chargeur
Horloge_6_Nixies_16F628A.hex dans le zip

_16F628A_Horloge_6_Nixies.zip


:sifflotte: SGDG
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

easynixie clock a 16f628a : chiffres non corrects ?
elektrax
Débutant
Débutant
Messages : 50
Enregistré en : septembre 2015

#7 Message par elektrax » mer. 23 mai 2018 19:58

j'ai compilé le fichier C que vous avez posté hier avec mikroC demo : allume les secondes au demarrage puis apres aucun affichage
la config : int rc 4 mhz ra6 et ra7 comme I/O fosc 2 1 0= 100, config 3F18, mikroC donne 2118, pourquoi 21 a la place de 3F ?
je suis certain : fuse config doit etre 3F18 (ou 2118 avec mikroc)
je vais regler le hardware en cablant les sorties du 74141 vers les bons chiffres

Merci pour le temps que vous m'avez accordé

easynixie clock a 16f628a : chiffres non corrects ?
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1064
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#8 Message par paulfjujo » mer. 23 mai 2018 20:27

j'avais mis config Quartz 8MHz
vu les pattes XTAL sur le schema

INTOSC oscillator avec RA6 et RA7 comme Pin I/O
RA5 /MCLR /VPP disabled .. RA5 serait donc configurée en I/O ?
CONFIG : $2007 : 0x2118
4Mhz

RA5 ...
MikroC n'est pas clair de ce coté là !

contrairement sur un 18F on a clairement le choix
MCLR Pin :
MCLR pin enabled,RE3 input disabled
ou
RE3 input enabled , MCLR disbaled

easynixie clock a 16f628a : chiffres non corrects ?
elektrax
Débutant
Débutant
Messages : 50
Enregistré en : septembre 2015

#9 Message par elektrax » ven. 25 mai 2018 05:51

RA5/mclr : pgmé à 0 : internal mclr tied to vcc
ra5 n'est pas utilisé
avec le hex de mikroC, on dirait que le 16f628 se bloque apres l'affichage de 00 chiffres secondes à la mise sous tension, aucun "signal" sur aucune pin à l'oscillo

#define DIGIT0 PORTB.F1 // outputs for nixie driver 74141
#define DIGIT1 PORTA.F2
#define DIGIT2 PORTA.F3
#define DIGIT3 PORTB.B0 : normal ?

merci

easynixie clock a 16f628a : chiffres non corrects ?
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1064
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#10 Message par paulfjujo » ven. 25 mai 2018 08:52

bonjour ,

Mikro C utilise les 2 syntaxes.
.Fx ou .Bx
mais autant ne pas les melanger pour
la comprenette.

j'ai un doute sur les tests
if (auxdigit & 1) digit=1;
ne serait ce pas &&


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Bing [Bot] et 1 invité