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 */ }
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.
@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?
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.
> 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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.