mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mal wieder eine Stoppuhr (Mega32)


Autor: Robert Knipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

Habe mich mal an einer Stoppuhr auf nem Mega32 versucht. Das Ding läuft 
aber nicht. Ich habe mir den Code dafür hier im Forum zusammengesucht. 
Die Ausgabe soll auf vier 7-Segment anzeigen erfolgen (VQE24). Angezeigt 
wird zwar am Anfang etwas nur tut sich bei betätigen des Start/Stop- 
oder Reset-Knopfes nix. Ich kann einfach nicht nachvollziehen warum es 
nicht läuft. Hoffe hier kann mir jemand helfen.

Noch eine Kleinigkeit: Die Uhr soll 1/100sek genauigkeit haben. Was 
nehme ich da am besten für einen Takt und welchen Prescaler?


Hier der Code:
//Stoppuhr

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <inttypes.h>



volatile unsigned char running;
volatile unsigned char zahl[10]; //Array in denen die Portausgaben für die Zahlen 0-9 gespeichert ist
volatile unsigned char sek[4];   //Zeiger auf zahl
volatile unsigned char i;        //Zählvariable für sek


//Timer und Interrupt Initialisierung
int interrupt_init(void)
{
  TCNT0 = 0x00;  //Timer0 mit 0 initialisieren (00000000)
  TIMSK = 0x01;  //Timer0 Overflow Interrupt aktivieren (00000001)
  
  MCUCR = 0x03;  //Rising Edge Interrupt an INT0 aktivieren (00000011)
  MCUCSR = 0x40; //Rising Edge Interrupt an INT2 aktivieren (01000000)
  GICR = 0x60;   //Interrupt auf INT0 und INT2 aktivieren (01100000)
  
  return 0;
}
//-----------------------------------


//Konstanten und Portkonfiguration
int const_init(void)
{
  zahl[0] = 0x00; //Die Werte für Zahl müssen noch
  zahl[1] = 0x01; //entsprechend den Pins der 
  zahl[2] = 0x02; //7-Segment-Anzeigen angepasst werden
  zahl[3] = 0x03;
  zahl[4] = 0x04;
  zahl[5] = 0x05;
  zahl[6] = 0x06;
  zahl[7] = 0x07;
  zahl[8] = 0x08;
  zahl[9] = 0x09;
  
  DDRA = 0xFF; //alle Pins Ausgang (11111111)
  DDRB = 0xD0; //Pin 2 (INT2) Eingang, Rest Ausgang (11011111)
  DDRC = 0xFF; //alle Pins Ausgang (11111111)
  DDRD = 0xD0; //Pin 2 (INT0) Eingang, Rest Ausgang (11011111)
  
  //alle Ports zeigen 0 an
  PORTA = zahl[0]; //Port für 10er Sekunden
  PORTB = zahl[0]; //Port für Sekunden
  PORTC = zahl[0]; //Port für 1/10 Sekunden
  PORTD = zahl[0]; //Port für 1/100 Sekunden
  
  return 0;
}
//-----------------------------------


//Hauptprogramm
int main(void)
{
  interrupt_init();
  const_init();
  
  sei();

  while(1) {
    PORTA = zahl[sek[0]];
    PORTB = zahl[sek[1]];
    PORTC = zahl[sek[2]];
    PORTD = zahl[sek[3]];
  }
}
//-----------------------------------


//ISR für Timer
ISR(TIMER0_OVF_vect)
{
  sek[0]++;
  
  for(i = 0; i < 4; i++)
  {
    if (sek[i] > 9)
    {
      sek[i]=0;
      sek[i+1]++;
    }
    if (sek[3] > 9)
    {
      sek[0] = 0;
      sek[1] = 0;
      sek[2] = 0;
      sek[3] = 0;
    }
  }
}
//-----------------------------------


//ISR für Start/Stop
ISR(INT0_vect)
{
  if(running == 0)
  {
    TCCR0 = 0x05; //Einstellung Prescaler (siehe S.80 im Datenblatt) (00000101)
    running = 1;  //Indikator für "läuft"
  }
  else
  {
    TCCR0 = 0x00; //Timer0 aus (00000000)
    running = 0;  //Indikator für "läuft nicht"
  }
}
//-----------------------------------


//ISR für Reset
ISR(INT2_vect)
{
  TCCR0 = 0x00; //Timer0 deaktivieren (00000000)
  
  //alle Anzeigen auf 0
  PORTA = zahl[0];
  PORTB = zahl[0];
  PORTC = zahl[0];
  PORTD = zahl[0];
}
//-----------------------------------

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-running ist zu beginn nicht initialisiert
-Sind die Taster auch richtig angeschlossen (betätigen zieht pin auf 
HIGH)?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.