Forum: Mikrocontroller und Digitale Elektronik Atmega32 und Timer1 und ein lausiges Problem


von Blende22 (Gast)


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

: Bearbeitet durch User
von Ingo (Gast)


Lesenswert?

Aus Bauch: Stehen die Prescalerbits nicht im TCCR0B???
Zumindest beim MegaXX8 is das so...



Ingo

von Ingo (Gast)


Lesenswert?

Sorry verlesen, is ja bei dir der Fall... Bitte löschen...

von Chris (Gast)


Lesenswert?

Liegt da nicht der JTAG? Den muss man über die Fuse abschalten.

von Mat (Gast)


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

von Thomas E. (thomase)


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.

: Bearbeitet durch User
von Mat (Gast)


Lesenswert?

hast du im Main einen Code drin oder ist die leer?
Wenn leer wird sie ev. wegoptimiert und der Kontroller startet neu?

lg

von Thomas E. (thomase)


Lesenswert?

Mat schrieb:
> hast du im Main einen Code drin oder ist die leer?
> Wenn leer wird sie ev. wegoptimiert und der Kontroller startet neu?
>
> lg
Unsinn.
Ist das hier jetzt ein Ratespiel und der größte Blödsinn gilt?
Sein Programm ist zwar nicht optimal, aber es macht, was es soll. Nur 
nicht bei ihm. Also liegt der Fehler woanders.

mfg.

: Bearbeitet durch User
von Mat (Gast)


Lesenswert?

mein nicht im Main sondern in der Whileschleife im Main.

von Karl H. (kbuchegg)


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.

von Peter D. (peda)


Lesenswert?

Am Code liegts nicht, der sieht korrekt aus.

von Hafax (Gast)


Angehängte Dateien:

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

von Blende22 (Gast)


Lesenswert?

Danke für Eure Hinweise.
> Liegt da nicht der JTAG? Den muss man über die Fuse abschalten.
Dann setze ich mal hier an.
(Mit dem Mega8 hatte ich vorher auch keinen Erfolg)

>Fuses doch nicht richtig eingestellt?
Habe ich mit Bascom gesetzt. Das lief bisher immer ok.
>Hardware?
>Richtiges Hex-File?
Ja, klar.

von spess53 (Gast)


Lesenswert?

Hi

>> Liegt da nicht der JTAG? Den muss man über die Fuse abschalten.
>Dann setze ich mal hier an.

Sinnlos. JTAG liegt auf PortC. Kontrolliere mal den Schaltplan von 
deinem Board ob da nicht noch etwas anderes dranhängt.

MfG Spess

von Blende22 (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

>Das funktioniert selbstverständlich:

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

Nur um sicher zu sein: Damit blinkt die LED?

MfG Spess

von Thomas E. (thomase)


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.

: Bearbeitet durch User
von Blende22 (Gast)


Lesenswert?

> Nur um sicher zu sein: Damit blinkt die LED?

Im Einsekundentakt, ja und lt. Oszi ist der Quarz in Aktion.

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.