Forum: Mikrocontroller und Digitale Elektronik Programmieren einer Uhr


von 7-Segment-Anfänger (Gast)


Lesenswert?

Hallo,

will mit einem µC (An2131) eine Uhr programmieren und am 7 Segment 
ausgeben.

Sie soll fürn Anfang nur von 0-9 sekunden anzeigen.

Problem: Zählt nicht. es wird nur die 0 ausgegeben. Sicher weil sie als 
Startwert gilt und somit nichts mit dem Timer zu tun hat. Meine 
vermutung ist das der Timer nicht richtig läuft.
Den Startwert habe ich auf 64536 gesetzt damit der Counter nur noch 1ms 
läuft bis zum interrupt. ( Ein Takt vom Timer dauert 1µS--> 1000µs = 
1ms, 65536-1000 = 64536 :) )

Ich hoffe ihr könnt mir helfen..

Danke im Vorhinein

Hier mein Code dazu:

#define ALLOCATE_EXTERN
#include "ezusb.h"
#include "EZregs.h"

#define ZERO 0x18
#define ONE 0x7B
#define TWO 0x2C
#define THREE 0x29
#define FOUR 0x4B
#define FIVE 0x89
#define SIX 0x88
#define SEVEN 0x3B
#define EIGHT 0x08
#define NINE 0x09
#define DOT 0xF7
int milli=0,sek=0; //Globale Variable

void main (void)
{
    EA=1; // Timer Aktivieren
    ET0=1;   //Timer0 Aktivieren
  TMOD=0x01; //Modus von Timer 0 auf 16 BIT einstellen
    TR0=1; //Timer0 Einschalten

  TH0=0xFC; // 16 Bit Modus (2 Byte) Höheres Byte
        TL0=0x18; // Unteres Byte


  PORTCCFG=0x00;
  PORTBCFG=0x00;

  OEC=0xFF;
  OEB=0x03;
while(1)
{
  OUTB=0x03; // für common Anode müssen immer auf HIGH sein
    switch(sek)
  {
    case 0: OUTC=ZERO;
            break;

   case 1: OUTC=ONE;
           break;
   case 2: OUTC=TWO;
            break;
   case 3: OUTC=THREE;
            break;
   case 4: OUTC=FOUR;
            break;
   case 5: OUTC=FIVE;
            break;
   case 6: OUTC=SIX;
            break;
   case 7: OUTC=SEVEN;
            break;
   case 8: OUTC=EIGHT;
            break;
   case 9: OUTC=NINE;
            break;
  }

 }
}
void einemillisekunde (void) interrupt 2
{
  milli=milli+1;

  if(milli==1000)
  {
    milli=0;
  sek=1;
  }

}

von Christian F. (cmf) Benutzerseite


Lesenswert?

Den genauen Fehler kann ich nicht entdecken, aber auf jeden Fall soltest 
du in der Interrupt Funktion sek++ schreiben.

von 7-Segment-Anfänger (Gast)


Lesenswert?

Hallo,


Danke für den guten Hinweis, leider war das auch nicht der Fehler :(

von Christian F. (cmf) Benutzerseite


Lesenswert?

Ich kenne mich mit diesem IC zwar nicht so aus, aber bist du dir sicher, 
dass es
1
interrupt 2
heißt?

von spess53 (Gast)


Lesenswert?

Hi

Muss man bei dem Teil Interrupts explizit erlauben oder geht das 
automatisch?

MfG Spess

von Matthias L. (Gast)


Lesenswert?

du solltest vor das milli und das sec mal ein volatile schreiben

von Christian F. (cmf) Benutzerseite


Lesenswert?

Vielleicht findet sich auch hier die Lösung. Da geht es auch um so ein 
Teil:

Beitrag "AN2131 Interrupts in C verwenden"

@spess53:

In dem obigen Thread aktiviert man die Interrupts mit
1
EA=1

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.