Atmega32 und Timer1 und ein lausiges Problem

Gast #3534182
Lesenswert?

Guten Tag!

Darf ich was fragen? Ich komme bei einem Problemchen einfach nicht 
weiter.
Pollin-Evaluation-Board, Atmega32, Fusebits korrekt gesetzt, 16MHz-Quarz 
und folgender Mini-Code:

1
#define F_CPU 16000000UL
2
#include <util/delay.h>
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5

6

7
ISR(TIMER1_COMPA_vect)       
8

9
 {
10
   PORTD^=(1<<PD5);             // LED schalten mit XOR
11
   
12
 }
13

14
int main(void)
15

16
{
17
  
18
  DDRD |= (1<<PD5);            // Pin 5 an PORTD auf Ausgang
19

20
  
21
  TCCR1B |= (1<<WGM12) | (1<<CS12);    //CTC und Vorteiler auf 256
22
  TIMSK |= (1<<OCIE1A);                 
23
  OCR1A = 31249;                          // 1s bei 16MHz
24
  sei();                                 
25

26
    while(1)
27
    {
28
        // x-beliebige Routine 
29
    }
30
}


Kein Signal an PD5 ! Kontrolliert auch am Oszilloskop.


Wenn ich den Vorteiler auf 1024 setze kommt dasselbe in Grün raus:
1
#define F_CPU 16000000UL
2
#include <util/delay.h>
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5

6

7
ISR(TIMER1_COMPA_vect)       
8

9
 {
10
   PORTD^=(1<<PD5);             // LED schalten mit XOR
11
   
12
 }
13

14
int main(void)
15

16
{
17
  
18
  DDRD |= (1<<PD5);            // Pin 5 an PORTD auf Ausgang
19

20
  
21
  TCCR1B |= (1<<WGM12) | (1<<CS10)|(1<<CS12);    //VT auf 1024
22
  TIMSK |= (1<<OCIE1A);                 
23
  OCR1A = 7812;                          // 1s bei 16MHz
24
  sei();                                 
25

26
    while(1)
27
    {
28
        // x-beliebige Routine 
29
    }
30
}


Welchen brutalen Anfängerfehler mache ich da? Komme einfach nicht 
dahinter.
Ich mag nicht mit _delay_ms blinken! ;-)

Gruss

Gerd
Gast #3534200
Lesenswert?

Hallo Gerd,

schau dir mal folgende Tabelle im Datenblatt auf Seite 108 an:

Table 45. Compare Output Mode, Fast PWM(1)

COM1A1/COM1B1 COM1A0/COM1B0 Description
1
0 0 Normal port operation, OC1A/OC1B disconnected.
2
0 1 WGM13:0 = 15: Toggle OC1A on Compare Match, OC1B disconnected (normal port operation).
3
    For all other WGM13:0 settings, normal port operation, OC1A/OC1B disconnected.
4
1 0 Clear OC1A/OC1B on compare match, set OC1A/OC1B at BOTTOM,(non-inverting mode)
5
1 1 Set OC1A/OC1B on compare match, clear OC1A/OC1B at BOTTOM,(inverting code)

gruß Mat
#3534204
Lesenswert?

Blende22 schrieb:

> Welchen brutalen Anfängerfehler mache ich da? Komme einfach nicht
> dahinter.
Keiner. Zumindest nicht in der Software. Beide Programme laufen 
einwandfrei. Mit den OCA-Bits lässt sich der Ausgang allerdings auch 
direkt vom Timer schalten. Geht aber auch mit deiner Variante.

Hardware?
Richtiges Hex-File?
Fuses doch nicht richtig eingestellt?
Woodoo-Zauber?

mfg.
#3534277
Lesenswert?

Mat schrieb:
> mein nicht im Main sondern in der Whileschleife im Main.

Ist völlig wurscht.
Ein C-Compiler kann auch eine leere Endlosschleife nicht einfach 
wegoptimieren. Woher kommt nur immer der Mythos, dass ein C Compiler so 
etwas machen würde?

Eine Endlossschleife ist eine Endlosschleife.
Und die bleibt auch drinnen. Egal wie aggressiv ein Compiler optimiert.
Gast #3534328
Lesenswert?

Also der Code Funktioniert bei mir ohne Probleme. Hab beide Code 
Beispiele auf einem Atmega32A ausprobiert und mit nem Oszi die Zeiten 
gemessen (siehe Bilder).

Kann mir das entweder nur durch einen Hardware defekt denken oder durch 
falsche Fusebits.
Meine Fusebits sind: Low Byte 0xEF und High Byte C9
Angehängte Dateien:
Gast #3534442
Lesenswert?

>Kontrolliere mal den Schaltplan von
>deinem Board ob da nicht noch etwas anderes dranhängt.

Alles leer. Es sind nur der MAX232 und Der Mega32 drauf. Beim Max232 
sind die Jumper für RXD und TXD nicht gesetzt. Es hängen nur 2 LEDs 
(PD5, PD6) und 3 Taster (PD2, PD3, PD4) dran am Controller. Letztere 
sind high-active.
Sehr kryptisch. Doch Voodoo? ;-)

Das funktioniert selbstverständlich:

         PORTD^=(1<<PD5);
  _delay_ms (1000);

Wie heisst es im "Terminator 1" ? Ich brauch mal Urlaub.

Greets
Gerd
#3534485
Lesenswert?

Blende22 schrieb:
>>Kontrolliere mal den Schaltplan von
>>deinem Board ob da nicht noch etwas anderes dranhängt.
>
> Alles leer. Es sind nur der MAX232 und Der Mega32 drauf. Beim Max232
> sind die Jumper für RXD und TXD nicht gesetzt. Es hängen nur 2 LEDs
> (PD5, PD6) und 3 Taster (PD2, PD3, PD4) dran am Controller. Letztere
> sind high-active.
> Sehr kryptisch. Doch Voodoo? ;-)
>
> Das funktioniert selbstverständlich:
>
>          PORTD^=(1<<PD5);
>   _delay_ms (1000);
>

Mit so einem Minimalcode kannst du natürlich Glück haben, daß es trotz 
falsch ausgewähltem Controller funktioniert. Denn die Portadressen sind 
meistens gleich. Mit den Interrupts bekommst du aber auf jeden Fall 
Probleme.

Viel mehr bleibt da nämlich nicht. Die Hardware scheint ja OK zu sein.

mfg.

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