mikrocontroller.net

Forum: Compiler & IDEs Interrupt kommt zu schnell


Autor: Icey (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe gerade erst angefangen mit Mikrocontroller-Programmierung. Ich 
möchte über den Timer0 eine LED zum blinken bringen, dazu habe ich 
folgendes Programm geschrieben.
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>

volatile char i=0;


ISR(TIMER0_COMP_vect)
{
  i++;
  PORTB ^= (1<<PB7);
}

int main(void)
{
  DDRB = 0xff;  //PortB als Ausgang
  DDRD = 0x00;  //PortD als Eingang
  TCCR0 = 0x0D;  //CTC-Modus Prescaler 1024
  OCR0 = 0x7F;  //Zählerwert eingestellt
  TIMSK = 0x01;  //Interrupt ermöglichen
  sei();
  
  
  PORTB = 0xff;  //LED´s aus
  
  while(1)
  {
    if(i>4)
    {
      i=0;
      PORTB ^= (1<<PB3);
    }
  }
}
Das ganze läuft mit einem ATmega8515 und einem 4MHz Quarz auf einem 
STK500. Leider läuft blinken die Lampen aber zu schnell, die 4.LED 
ungefähr 12mal in 10 Sekunden.

Irgendwie komm ich nicht so wirklich auf die Lösung warum der sowas mit 
mir macht :(

Ich benutzte WinAVR-20070525.

Ich hoffe Ihr könnt mir helfen.

Gruß,
Icey

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal rechnen: Alle 128*1024 Takte ein Interrupt, danach Software-Teiler 
10: 128*1024*10 = ca. 1,3Mio. Passt doch prima, wenn man mal annimmt, 
dass du vergessen hast, den Mega vom internen 1MHz Takt auf den Quarz 
umzustellen.

Bloss: Wenn er dann mal mit 4MHz läuft: Langsamer wird dadurch nicht 
blinken. Eher im Gegenteil. Wie ist denn deine Rechnung?

Autor: Icey (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Mist ich bin doof kopfaufdentischknall

Ich hab mich mit den Einheiten verwurstetelt, ich hab statt ns mit ms 
gerechnet, da kann ja nur das falsche rauskommen.

Danke für die schnelle Hilfe :)

Gruß,
Icey

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleiner Tip: Es ist lesbarer, wenn du statt
TCCR0 = 0x0D;
eher sowas schreibst:
TCCR0 = (1<<WGM01) | (1<<CS02) | (1<<CS00);

Autor: Bonzo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleiner Tip. Es ist noch lesbarer :

TCCR0 = 0x0D;  // WGM01 CS02 CS00

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bonzo wrote:
> Kleiner Tip. Es ist noch lesbarer :
>
> TCCR0 = 0x0D;  // WGM01 CS02 CS00

Ja, aber man muss immer das Comment anpassen. Bei meiner Variante 
kümmert sich dann der Compiler um das Ausrechen des korrekten 
Registerwerts... Das minimiert auch Fehlerquellen.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö. Da muß man ja doch wieder ins Datenblatt schauen und die Bits 
auseinanderklamüsern, um zu rauszubekommen, ob der Wert denn nun stimmt 
oder nicht.  Abgesehen davon ist Code, der sich selbst kommentiert, 
immer besser als unverständlicher Code, den man erst mit einem Kommentar 
erklären muß.

Am besten:

TCCR0 = _BV(WGM01) | _BV(CS02) | _BV(CS00);

Autor: Icey (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Danke für die Tipps. Kommentieren kann man nie genug ;)
Werd wohl ne Mischung aus beiden Varianten machen :)

Gruß,
Icey

der sich jetzt mal am UART versucht :D

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Werd wohl ne Mischung aus beiden Varianten machen :)

Sieht man öfter. Falscher Code und richtiger Kommentar daneben, oder 
umgekehrt. ;-)

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.