Forum: Mikrocontroller und Digitale Elektronik ISR beim Atmega88


von Allrik (Gast)


Lesenswert?

Hallo,

ich Arbeite seid einiger Zeit mit Atmegas und AVR Studio. Als Controller 
dient mir ein Atmeag88 der an einem PC verbunden ist, ein 14,7456MHz 
Quarz ist ebenfalls angeschlossen. Die Kommunikation untereinander 
Funktioniert auch schon.
Jetzt zu meinem Problem. Ich wollte den timer0 initialisieren und mir 
erst einmal nur auf der Konsole etwas ausgeben lassen. Suche schon seid 
ein paar Tagen nach einer Lösung im Netz, hier auf der Seite und in dem 
Forum, bekomme es jedoch nicht hin.
Hier ist mein Code evt habt Ihr ja eine Idee was ich falsch mache.

1
#include <avr/io.h>
2
#include <avr/pgmspace.h>
3
#include <avr/interrupt.h>
4
#include <avr/wdt.h>
5
6
#include "uart.h"
7
8
ISR ( TIMER0_COMPA_vect ) { 
9
    printf("TIMER0_COMPA_vect\n");
10
}
11
12
void timerInit( void ) {
13
14
    // Globale Interrupts aktivieren
15
    sei();
16
17
    TCCR0A = ( 1<<WGM00 );  //Waveform Generation Mode
18
    TCCR0A = ( 1<<CS02 ) | ( 1<<CS00 ); // Prescalor 256
19
    
20
    OCR0A  = 230;   // 14.745.600 / 256 / 230 = 250 Hz
21
22
    // Compare Interrupt aktivieren
23
    TIMSK0 |= ( 1<<OCIE0A );
24
25
    // Set Timer
26
    TCNT0 = 0x00;
27
}
28
29
int main ( void ) {   
30
    uartInit( MY_UBRR, 0 );
31
32
    timerInit( );
33
34
    for( ;; ){
35
        printf("do nothing\n");
36
        _delay_ms(500);
37
        
38
    }
39
    return 0;
40
}

Habe schon einige Möglichkeiten und Varianten ausprobiert und komme 
einfach nicht weiter.

Grüße Allrik

von Kasperle (Gast)


Lesenswert?

Dein
  // Globale Interrupts aktivieren
    sei();
gehört in die main nach
 timerInit( );

Gruß

von Kasperle (Gast)


Lesenswert?

Deine
uartInit( MY_UBRR, 0 );

finde ich auch nicht.

von holger (Gast)


Lesenswert?

>    TCCR0A = ( 1<<WGM00 );  //Waveform Generation Mode
>    TCCR0A = ( 1<<CS02 ) | ( 1<<CS00 ); // Prescalor 256

    TCCR0A = ( 1<<WGM00 );  //Waveform Generation Mode
    TCCR0A |= ( 1<<CS02 ) | ( 1<<CS00 ); // Prescalor 256

von holger (Gast)


Lesenswert?

>    TCCR0A = ( 1<<WGM00 );  //Waveform Generation Mode
>    TCCR0A |= ( 1<<CS02 ) | ( 1<<CS00 ); // Prescalor 256

Ach Quatsch ;)

CS02 und CS00 liegen nicht in TCCR0A!

von Allrik (Gast)


Lesenswert?

Hallo,

danke für eure Antworten

@Kasperle
habe die uart nicht gepostet weil sie Funktioniert hat ;)

@holger
Stimmt. Danke hat sehr geholfen

Ansonsten habe ich von TCCR0A auf TCCR0B gewechselt. Nun funktioniert 
es. Dankeschön
1
void timerInit( void ) {
2
3
    TCCR0B = ( 1<<WGM00 ); //Waveform Generation Mode
4
    TCCR0B = ( 1<<CS02 ) | ( 1<<CS00 ); // Prescalor - 256
5
    
6
    OCR0B  = 230;   // 14.745.600 / 256 / 230 = 250 Hz
7
8
    // Compare Interrupt aktivieren
9
    TIMSK0 |= ( 1<<OCIE0B );
10
11
    // Set Timer
12
    TCNT0 = 0x00;
13
}

So geht es. Jetzt muss ich nur noch testen wie schnell die Frequenz 
wirklich ist.

Gruß und Danke Allrik

von holger (Gast)


Lesenswert?

>    TCCR0B = ( 1<<WGM00 ); //Waveform Generation Mode

WGM00 steht aber nicht in TCCR0B ;)

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.