AVR-GCC-Tutorial hilfe zu Bsp.

Gast #2472533
Lesenswert?

Hallo!

Ich Arbeite mich gerade durch das Tutorial GCC mit AVR-Studio 5.

Folgendes Programm will nicht laufen aber warum?
Sollte doch auf einem ATiny13 gehen oder nicht?

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

int main(void)
{
  // Timer 0 konfigurieren
  TCCR0 = (1<<CS01); // Prescaler 8

  // Overflow Interrupt erlauben
  TIMSK |= (1<<TOIE0);

  // Global Interrupts aktivieren
  sei();

  while(1)
  {
    /* Sonstige Aktionen */
  }
}

/*
Der Overflow Interrupt Handler
wird aufgerufen, wenn TCNT0 von
255 auf 0 wechselt (256 Schritte),
d.h. ca. alle 2 ms
*/
#ifndef TIMER0_OVF_vect
// Für ältere WinAVR Versionen z.B. WinAVR-20071221
#define TIMER0_OVF_vect TIMER0_OVF0_vect
#endif

ISR (TIMER0_OVF_vect)
{
  /* Interrupt Aktion alle
  (1000000/8)/256 Hz = 488,28125 Hz
  bzw.
  1/488,28125 s = 2,048 ms
  */
}
Gast #2472550
Lesenswert?

Für mich macht das Programm "nach außen" nix. Wenn in der ISR wenigstens 
eine LED getoggelt würde... 2ms ISR Frequenz mit einem Softwarezähler in 
der ISR 256x verlängern, dann käme man auf 524ms. Das gäbe schon ein 
anständiges Blinken.
1
// in main.c 
2
  DDRB |= (1<<PB1); // LED an PB1 (nicht mit Pinout Attiny13 abgeklärt!)
3

4
ISR (TIMER0_OVF_vect)
5
{
6
  static uint8_t softwarezaehler = 0; // Überlauf 255=>0 ist eingeplant
7
  if ( !softwarezaehler++ )
8
    PORTB ^= (1<<PB1); // LED an PB1 (nicht mit Pinout Attiny13 abgeklärt!)
9
}

Die 1000000 Hz (1 MHz) sind IMHO auch keine normale Taktrate des 
Attiny13. Ich meine im Datenblatt stehen andere Werte 1.2 MHz oder 9.9 
MHz. Schau mal nach.
Gast #2472596
Lesenswert?

@Krapao
Danke für den hinweis aber leider scheint die ganze sache etwas mit der 
Interrupt Einsprungadresse zutun.

>ISR (TIMER0_OVF_vect)   <-- Fehlt da nicht etwas?
{
  ....
}

Woher weiss der Compiler eigentlich in welcher ISR Reinspringen soll?
Ich meine man müsste das doch angeben wie z.b. in Assembler:

org 0x0003
    rjmp ISR_T0  ;Timer0

Wie macht man sowas in C?
#2472603
Lesenswert?

Klaus schrieb:


> Woher weiss der Compiler eigentlich in welcher ISR Reinspringen soll?

Weil du es ihm sagst

ISR (TIMER0_OVF_vect)

Das ist die ISR, die zum Overflow des Timer 0 gehört (TIMER0_OVF_vect)

Kriegst du beim Compilieren eine Warnung? Dann stimmt der Name der ISR 
nicht. Leider ist das Namensschema der ISR nicht ganz durchgängig. D.h. 
ob dieser Interrupt tatsächlich TIMER0_OVF_vect heißt oder leicht 
anders, müsste man ausprobieren oder in der zum Prozessor gehörenden 
ioXXX.h nachsehen.
Gast #2472612
Lesenswert?

> Danke für den hinweis aber leider scheint die ganze sache etwas mit der
> Interrupt Einsprungadresse zutun.

Ich komme mit deiner Problembeschreibung nicht zurecht. "die ganze 
Sache" verstehe ich nicht. Kann das Programm nicht übersetzt werden? 
Läuft das Programm nicht? Wie stellst du fest, dass das laut Sourcecode 
überhaupt nichts tuende Programm nichts tut bzw. war erwartest du das es 
tut?

Mit der folgenden Zeile machst du doch dem Compiler die notwendige 
Angabe:
>ISR (TIMER0_OVF_vect)   <-- Fehlt da nicht etwas?

Der Compiler macht aufgrund des ISR zwei Sachen:
1. Es wird eine ISR Funktion angelegt
2. Die Adresse der ISR Funktion wird in die Interruptvektortabelle 
eingetragen
Die Position in der Interruptvektortabelle wird mit dem Makro 
TIMER0_OVF_vect angeben. Wie das Makro definiert ist, kannst du durch 
io.h => iotn13.h herausfinden. Beim älteren WiNAVR heisst der Vektor 
übrigens TIM0_OVF_vect

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren