www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik atmega32 timer1 externer Takt funktioniert nicht.


Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Ich hatte die Frage ürsprünglich hier 
->Beitrag "Re: TLC5940 Effizient ansteuern" im späteren 
Verlauf gestellt, aber ich mach mal einen eigenen Thread auf deswegen - 
hängt ja nicht direkt zusammen


Ich erzeuge mit dem Timer0 einen schnelles Rechteck-Signal.
Timer1 soll dessen Pulse zählen (OC0 ist mit T1 verbunden).
Dies soll timer1 erledigen.

Timer 0 funktioniert. bracuht hier eigentlich nicht betrachtet werden.
das eigentliche Problem ist also, warum timer1 nicht zählt.

Hier der Code:
...

  // timer 1  (16bit)
  DDRB &= ~(1<<PIN1); // T1 pin as clock input for 16bit timer
  TCCR1A = (1<<WGM11) | (0<<WGM10); // Fast PWM with ICR1 as top
  TCCR1B = (1<<WGM13) | (1<<WGM12)  //
         | (1<<CS12) | (1<<CS11) | (1<<CS10); // external clock (T1) on rising egde
  TIMSK  |= (1<<TOIE1); // enable overflow interupt
  ICR1   = 4096;


  // timer 0
  DDRB |= (1<<PB3);
  TCCR0 = (1<<WGM01) | (0<<WGM00)   // CTC
        | (0<<COM01) | (1<<COM00)   // Toggle on Compare Match
        | (0<<CS02) | (1<<CS01) | (1<<CS00);  // prescaler 64 for test
  OCR0 = 0; // f(OCR) = F_CPU/2/Prescaler

...

ISR( TIMER1_OVF_vect )
{
  LED_TOGGLE(STAT_LED_DEBUG_1);
  tlc5940_blank();
}


Laut datasheet müsste er doch in dem modus den Overflow auslösen, wenn
der Counter TOP (ICR1) erreicht ist.

den FPWM-mode wollt ich nehmen, damit ich die die Compares noch frei
habe.

Hat jemand einen Hinweis?
und ja, ich hab die Brücke zwischen PB3 und PB1 wirklich eingebaut ;)
Die LED in der Timer1-ISR geht auch ;)

Danke im Voraus,
Vlad

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Laut datasheet müsste er doch in dem modus den Overflow auslösen, wenn
>der Counter TOP (ICR1) erreicht ist.

Nein. Ausgelöst wird ein IC-Interrupt (wenn freigegeben).

MfG Spess

Autor: Vlad Tepesch (vlad_tepesch)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Nein. Ausgelöst wird ein IC-Interrupt (wenn freigegeben).

Sowie ich das Datasheet (siehe Anhang) verstehe, wird der OVF-Int bei 
erreichen von TOP ausgelöst. TOP ist da definiert als ICR1.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das Umändern auf Compare-Int ändert auch nix.

Der Mega stürzt auch nicht ab.
Wenn ich ihn in der Mainloop was zu tun gebe, wird das auch gemacht.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Sowie ich das Datasheet (siehe Anhang) verstehe, wird der OVF-Int bei
>erreichen von TOP ausgelöst. TOP ist da definiert als ICR1.

Wenn Top durch ein Register bestimmt wird, wird nicht der 
Overflow-Interrupt, sondern der dem Register zugehörige Interrupt 
ausgelöst.
Bin ich auch schon darauf hereingefallen.

MfG Spess

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Wenn Top durch ein Register bestimmt wird, wird nicht der
> Overflow-Interrupt, sondern der dem Register zugehörige Interrupt
> ausgelöst.

Hmm. Ich finde schon dass das Datasheet recht eindeutig ist:

> The Timer/Counter Overflow Flag (TOV1) is set each time
> the counter reaches TOP. In addition the OC1A or ICF1
> Flag is set at the same timer clock cycle as TOV1 is set
> when either OCR1A or ICR1 is used for defining the TOP value.
> If one of the interrupts are enabled, the interrupt handler
> routine can be used for updating the TOP and compare values.



um ganz sicher zu gehen, habe ich grad mal den inputPin PB1 getestet.
Manuell geht er.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Hmm. Ich finde schon dass das Datasheet recht eindeutig ist:

Hast Recht. Meine Aussage trifft auf die CTC-Modes zu. Bei den PWM-Modes 
wird auch das TOV-Flag gesetzt.

MfG Spess

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm, ich habs jetzt auch mal in anderen Modi Probiert. er scheint den 
externen Takt einfach nicht zu bekommen.

Gibts irgend was, was man noch beachten sollte?

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, also am IC liegts definitiv auch nicht.

Hab den Code jetzt auf einen mega168 gebracht -> gleiches Problem

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest das hier:

> DDRB &= ~(1<<PIN1);

eigentlich nicht compilieren können. Wo kommt denn die Definition von 
PIN1 her ? Aus der iom32.h sicher nicht.

Kann ja sein, daß dies hier aus der Forumformatierung resultiert, aber 
das sieht aus, als ob ein Kommentar // dazwischen ist, damit ist der 
Zähler ohne Takt:

  TCCR1B = (1<<WGM13) | (1<<WGM12)  //
         | (1<<CS12) | (1<<CS11) | (1<<CS10);

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MWS schrieb:
> Kann ja sein, daß dies hier aus der Forumformatierung resultiert, aber
> das sieht aus, als ob ein Kommentar // dazwischen ist, damit ist der
> Zähler ohne Takt:

Ein // macht nur den Rest der Zeile zum Kommentar, und hat keinerlei 
Einfluss auf die Folgezeile.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ein // macht nur den Rest der Zeile zum Kommentar, und hat keinerlei
> Einfluss auf die Folgezeile.

Ok, danke. In C wird ja mit ; abgeschlossen.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier funktioniert genauso wie es soll, d.h. die Theorie um FPWM Mode 
14 ist schon ok. ICR1 ist kleiner, da nur 'ne geringe Frequenz an T1 zur 
Verfügung stand, das Toggle hätt' sonst zu lange gedauert.
$regfile = "m32def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 32

DDRB.PB1 = 0                                                                              ' T1 als Eingang
DDRB.PB0 = 1                                                                              ' PB0 als Ausgang
TCCR1A = Bits(PWM11)                                                                      ' PWM11 = WGM11
TCCR1B = Bits(CTC11 , CTC10 , CS12 , CS11 , CS10)                                         ' CTC10 = WGM12, CTC11 = WGM13
Set TIMSK.TOIE1
ICR1 = 16

On OVF1 OVF1_ISR
Enable Interrupts

Do
Loop

OVF1_ISR:
  Toggle PORTB.PB0
Return

End

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MWS schrieb:
> eigentlich nicht compilieren können. Wo kommt denn die Definition von
> PIN1 her ? Aus der iom32.h sicher nicht.

das kommt aus der "avr/portpins.h", wie alle anderen Pin-Definitionen 
auch
/* Port Input Pins (generic) */
#define    PIN7         7
#define    PIN6         6
#define    PIN5         5
#define    PIN4         4
#define    PIN3         3
#define    PIN2         2
#define    PIN1         1
#define    PIN0         0

Ich finde die bezeichnungen PB1 ziemlich dämlich, da man das dann auch 
noch ändern muss, wenn man den Port ändert.
die PXn sind sowieso immer von 0-m numeriert. Ich denke das ist auch 
eine Sache, wo man sich drauf verlassen kann, dass das so bleibt.
Die machen eigentlich bloß Sinn, damit es ein Compile-Error gibt, wenn 
man einen Pin ansprechen will, den die MCU gar nicht hat.



MWS schrieb:
> Das hier funktioniert genauso wie es soll, d.h. die Theorie um FPWM Mode
> 14 ist schon ok.

Hmm, ich werde immer ratloser.

Autor: MWS (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> Ich finde die bezeichnungen PB1 ziemlich dämlich, da man das dann auch
> noch ändern muss, wenn man den Port ändert.
Damit war ich nicht vertraut.

> Hmm, ich werde immer ratloser.
Anbei mein Hex-File.

Du hast schon SEI() im Main geschrieben ?

Wenn ja, häng' Dein Hex-File an, möglichst mit wenig umgebenden Code.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vlad Tepesch schrieb:
> wie alle anderen Pin-Definitionen
> auch

oh, doch nicht, da stehen nur generische definitionen drin

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MWS schrieb:
> Du hast schon SEI() im Main geschrieben ?

 *kopf gegen die Wand schlag*
was bin ich dämlich.

Beim Eingrenzen meines ersten Problems, warum es nicht funktioniert, hab 
ich die Minimalvariante zum Testen an den Anfang meiner main gehangen - 
und damit natürlich auch vor das sei().

Danke, ich geh jetzt erst mal in die Ecke mich schämen.

PS:
Ich schiebs jetzt einfach mal auf die unmenschlichen Temperaturen.

Autor: Paul Baumann (paul_baumann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmen im Spind, die so zärtlich und so liebevoll sind:
SEI nicht traurig Susann, es fängt alles erst an....

;-)
MfG Paul

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich schiebs jetzt einfach mal auf die unmenschlichen Temperaturen.

Ok, alles klar ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.