Nicht angemeldet. · Kennwort vergessen · Registrieren

muffdey
Mitglied seit 04/2012
12 Beiträge
Betreff: Julie 2013 2a: stoppuhr
Hallo zusammen.
Ich habe ein paar Fragen zu der Aufgabenstellung.

Bei der Funktion showtime(uint16_t ms) steht man solle unnötige Aufrufe vermeiden. Ich hätte diese Funktion in einer for-Schleife hochzählen lassen;d.h. sie wird pro Millisekunde einmal aufgerufen.  Kann/Soll man die Anzeige der aktuellen Zeit anders lösen?

Desweiteren weiß ich nicht genau wie ich mit der Funktion void timer_setup(uint16_t ms) umgehen soll (TIMER1_COMPA_vect), bzw was diese Funktion auslöst und wo sie in der Stoppuhr vorkommt.

Vielen Dank.

Grüße

Muffdey
muffdey
Mitglied seit 04/2012
12 Beiträge
So, hab mich jetzt mal an der Aufgabe versucht.
Aufgabenstellung:
Programmieren Sie eine Stoppuhr, die mit Hilfe eines AVR-Mikrocontrollers implementiert
ist. Die Stoppuhr hat zwei Taster. Der erste Taster startet und stoppt die Stoppuhr, der zweite
Taster setzt sie zurück.
Die Stoppuhr besitzt eine Flüssigkristallanzeige die über eine Bibliotheksfunktion angesteuert
wird. Die Anzeige hat eine Genauigkeit von 1 Millisekunde und kann bis zu 999,999
Sekunden anzeigen.
Des Weiteren steht eine Bibliothek zur einfacheren Konfiguration des Timers zur Verfügung.
Im Detail soll Ihr Programm wie folgt funktionieren:
– Initialisieren Sie die Hardware in der Funktion void init(void);. Es sollen keine
Annahmen über den initialen Zustand der Hardware-Register getroffen werden.
Das Display zeigt 0 an.
– Das Programm wartet im Schlafmodus auf Tastendruck oder Timer-Interrupt.
– Wird der Start-Stopp-Taster gedrückt, startet die Stoppuhr. Das Display wird jede
Millisekunde aktualisiert.
– Wird der Start-Stopp-Taster erneut gedrückt, stoppt die Stoppuhr. Bei einem weiteren
Druck startet sie wieder.
– Wird der Reset-Taster gedrückt, wird die Stoppuhr angehalten und in den Ausgangszustand
zurückgesetzt.
Display-Bibliothek:
– showtime( uint16_t ms); Zeigt auf der Anzeige ms Millisekunden an. Beim ersten Aufruf
wird das Display initialisiert. Da dies eine aufwändige Funktion ist, sollen unnötige
Aufrufe vermieden werden.
Timer-Bibliothek:
Die Funktionen der Timer-Bibliothek dürfen nicht von einem Interrupt aus aufgerufen werden!
– void timer_setup(uint16_t ms); Löst alle ms Millisekunden die Interruptquelle TIMER1_COMPA
aus. ISR-Vektor-Makro: TIMER1_COMPA_vect
– void timer_stop(void); Deaktiviert den Timer

Mein Code:
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <avr/sleep.h>
  4. #include <stdint.h>
  5.  
  6. //Funktionsdeklarationen, globale Variablen, etc,
  7. static void init(void);
  8. static showtime(uint16_t ms);
  9. static void timer_setup(uint16_t ms);
  10. static void timer_stop(void);
  11. volatile uint8_t taster;
  12. volatile uint8_t reset;
  13. volatile uint16_t zähler;
  14. volatile uint8_t start;
  15.  
  16.  
  17.  
  18. //Unterbrechungsbehandlungsfunktion
  19. ISR(INT0_vect){
  20.   taster=1;
  21.   start^=1;
  22. }
  23.  
  24. ISR(INT1_vect){
  25.   reset=1;
  26. }
  27.  
  28. ISR(TIMER1_COMPA_vect){
  29.   zähler++;
  30. }
  31. //Funktion main
  32. void main(void){
  33.  
  34.  
  35.  //Initialisierung und lokale Variablen
  36.   init();
  37.   taster=0;
  38.   reset=0;
  39.   zähler=0;
  40.   start=0;
  41.   showtime(0);
  42.  
  43.  //Hauptschleife
  44.     while(1){
  45.  
  46.     cli();
  47.  
  48.       //Ruhezustand - warten auf ein Ereginis
  49.       while(!taster){
  50.       sei();
  51.       sleep_enable();
  52.       sleep_cpu();
  53.       sleep_disable();
  54.       cli();
  55.     }
  56.     sei();
  57.  //Behandlung des Start-Stop-Tasters
  58.       while(taster && start && !reset){
  59.         timer_setup(1); //aktivierung des Timer-Interrupts mit Intervall von 1ms
  60.         showtime(zähler);
  61.         if(taster && !start && !reset){
  62.         timer_stop();
  63.         showtime(zähler) //eventuell überflüssig da aus vorheriger whileschleife schon gleicher wert angezeigt wird?
  64.         taster=0;
  65.         }
  66.  
  67.  //Behandlung des Reset-Tasters
  68.       if(reset==1){
  69.         timer_stop();
  70.         zähler=0;
  71.         showtime(0);
  72.         taster=0;
  73.         reset=0;
  74.       }
  75.     }
  76.  
  77.  }
  78.  
  79.       //Behandlung des Timers
  80.         // ???????
  81. //Ende main
  82. }
  83. //Initialisierungsfunktion
  84.  
  85.  void init(void){
  86.  
  87.    DDRD  $= ~((1<<2)|(1<<3));
  88.    PORTD |= ((1<<2)|(1<<3));
  89.  
  90.    GICR |= (1<<INT0);
  91.    GICR |= (1<<INT1);
  92.  
  93.    MCUCR |= ((1<<ISC01) |(1<<ISC11));
  94.    MCUCR $= ~((1<<ISC00) |(1<<ISC10));
  95.  }

Wäre sehr nett wenn jemand drüberschauen kann =)

Grüße

muffdey
Schließen Kleiner – Größer + Auf diesen Beitrag antworten:
Prüfcode: VeriCode Gib bitte das Wort aus dem Bild ins folgende Textfeld ein. (Nur die Buchstaben eingeben, Kleinschreibung ist in Ordnung.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Weitere Zeichen:
Gehe zu Forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen