Forum: Mikrocontroller und Digitale Elektronik AVR-GCC-Tutorial hilfe zu Bsp.


von Klaus (Gast)


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
  */
}

von Krapao (Gast)


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.

von Krapao (Gast)


Lesenswert?

s/9.9/9.6/

von Klaus (Gast)


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?

von Karl H. (kbuchegg)


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.

von Krapao (Gast)


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

von Klaus (Gast)


Lesenswert?

TIM0_OVF_vect  heisst die ISR für ATiny13 oooh man.

Vielen Dank für den hinweis Karl Heinz Buchegger!

Seit drei Stunden schlag ich mich schon rum damit! LOL

von Klaus (Gast)


Lesenswert?

Auch dir Vielnen Dank! @Krapao
Jetzt Funktioniert das Programm im Simulator.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.