www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega 8 Sekundentimer in C


Autor: Bambie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abend zusammen,
ich habe mal wieder mein Experimentierboard rausgekrammt und wollte 
einen kleinen Timer entwickeln. Zuerst aber nur einen Sekundentimer, der 
eine LED blinken lassen soll. Blinken tut die LED auch, leider geht sie 
schon nach einer Minute um knapp 3 Sekunden falsch. Das ganze ist auf 
einen Steckbrett aufgebaut. Als Taktgeber dient ein 8MHZ-Quarz, der mit 
2 22pf Kondensatoren gegen GND geschaltet ist. Als Stromquelle dient ein 
USBasp-Nachbau. Ich hoffe ihr könnt mit ein weniger weiterhelfen, mit 
der Suche und über Google habe ich leider nichts gefunden :(

MFG Bambie
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <inttypes.h>
#include <util/delay.h>
#include <stdlib.h>

//volatile unsigned int  sekunden = 0;
//volatile unsigned int  minuten = 0;
//volatile unsigned long  stunden = 0;
static unsigned int sekunden = 0;

// Starten des Timers, nachdem er in der Hauptschleife konfiguriert wurde
uint8_t timer_start(void)
  {
    TIMSK = (1<<OCIE1A);   //Interrupt bei Compare Match
    sei();            //Interrputs aktivieren
    return 0;
  }
  
uint8_t timer_stop(void)
{
    TIMSK = (0<<OCIE1A);   //Interrupt bei Compare Match ausschalten
    return 0;
  }
  
ISR(TIMER1_COMPA_vect){
  sekunden++;
  PORTB ^= ( 1 << PB0 );
  }
  
int timer (void)
  {
  if(sekunden == 60)
    {
    minuten++;
    sekunden = 0;
    }
  if(minuten == 60)
    {
    stunden++;
    minuten = 0;
    }
  return 0;
  }

int main (void)
  {
  // Power-LED Einschalten
  DDRB = 0x01;
  PORTB = 1;

  //LED Einstellungen
  DDRC = 0xFF;
  PORTC = 0xFF;
  _delay_ms(1000);
  PORTC = 0x00;
  
  //16Bit-Timer für Zeitzählung
  TCCR1B |= (1 << WGM12);                //CTC Modus
  TCCR1B |= (1 << CS12) | (0 << CS11) | (0 << CS10);   //Prescaler 256
  OCR1A = 34286;                      //Compare Wert setzen
  timer_start();
  
  while(1) {
  }
  return 0;
}

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bambi,

das past schon.

Du zählst bis 34287 (0-34286) der Timer läuft mit 8000000/256.

Deine Zeit = 34287 * 256/8000000 = 1.0971 Sekunden.

Lass ihn mal bis 31250 zählen, also

OCR1A = 31249;

Dann ist nur noch die Quarzgenauigkeit zu messen.

Gruß avr

Autor: Bambie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahh, ok, jetzt ist es genau. Man sollte vielleicht selber nachrechnen... 
Hatte das Tool rnAVR benutzt. Dann kann ja ja jetzt weiter basteln :) 
Ich danke dir für deine schnelle Antwort.

MFG Bambie

Autor: Sebastian Neuhuber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cool kan microcontroller zwar nich in c programieren aber C#
und ich finde es interesant das die sprachen sich so aehneln

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.