mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer Interrupt am Tiny13


Autor: Christoph Baumgartner (elgigo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mahlzeit!

Ich suche seit fast ner Woche im Net, hab auch einiges gefunden.
Leider funzt nichts wirklich der Interrupt wird nie ausgelöst :-(
Ich wollte mir eigentlich nen 10ms Impuls ausprogrammieren, aber ich 
bekomms einfach nicht hin.

Hab den Code jetzt etwas vereinfacht und wollte nur ne Led ansteuern.
Ich ersuche einen von euch Wissenden kurz mal drüber zu schauen und mir 
zu sagen wo der Fehler liegt.
Danke!!

$regfile = "ATTiny13.dat"
$crystal = 1000000 '1MHz




Tccr0 = &H0D                                                'This will replace Config Timer1 = Timer , Prescale = 4096


On Timer0 Timer_int
Enable Timer0

Config Pinb.0 = Output                                      'LED
Led1 Alias Portb.0
Dim Count As Iram Byte
Dim Imp As Iram Bit

Enable Interrupts

Do
  If Imp = 1 Then
    Count = Count + 1
      If Count = 255 Then
         Toggle Led1
          Count = 0
      End If
  End If
Loop

End

Isr
Timer_int:
   Imp = 1
Return


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Tccr0 = &H0D                                                'This will replace 
Config Timer1 = Timer , Prescale = 4096


Laut Datenblatt gibt es beim Tiny13 kein Tccr0 Register. Wohl gibt es 
aber ein TCCR0A und ein TCCR0B Register.

Ich weiss jetzt nicht, auf welches Register zugegriffen wird, wenn du in 
BASCOM einfach nur TCCR0 schreibst. Aber es wird wohl
* enteder überhaupt nichts mit TCCR0A oder TCCR0B zu tun haben
* oder aber das falsche sein

ABer selbst wenn es das richtige ist, solltest du überprüfen, was du mit 
der Zuweisung von 0x0D anrichtest

Autor: Christoph Baumgartner (elgigo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort!

Hab den Code jetzt auf die Zeilen geändert die man beim Googeln immer 
findet, ist aber noch das selbe, der Interrupt wird niemals ausgelöst

$regfile = "ATTiny13.dat"
$crystal = 1000000                                          '1MHz

Config Timer0 = Timer , Prescale = 64


On Timer0 Timer_int
Enable Timer0

Config Pinb.0 = Output                                      'LED
Led1 Alias Portb.0
Dim Count As Iram Byte
Dim Imp As Iram Bit

Enable Interrupts

Do
  If Imp = 1 Then
    Count = Count + 1
      If Count = 255 Then
         Toggle Led1
          Count = 0
      End If
  End If
Loop

End


Timer_int:
   Imp = 1
Return


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph Baumgartner schrieb:
> Danke für die schnelle Antwort!
>
> Hab den Code jetzt auf die Zeilen geändert die man beim Googeln immer
> findet, ist aber noch das selbe, der Interrupt wird niemals ausgelöst

Woher weißt du das?
PS: Deine LED wird ungefähr alle 4 Sekunden getoggelt.

Edit. Korrektur.
Deine Led wird viel schneller getoggelt, da du Imp nie wieder auf 0 
zurücksetzt.

Schalte doch einfach mal dein Led im Timer_int wahlweise ein oder aus, 
dann weißt du ob der Interrupt ausgelöst wird. Je komplizierter du 
deinen Nachweis für den Aufruf gestaltest (das ganze HäckMäck mit Imp 
und Counter), desto größer wird die Gefahr, dass du dir genau in diesem 
HäckMäck zusätzliche Fehler einhandelst.

Autor: Christoph Baumgartner (elgigo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah ja stimmt! Imp wird nicht zurück gesetzt.

Das is aber nicht so schlimm da es gar nicht gesetzt wird!
Genau das is ja mein Problem.....

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein paar kleine Hinweise:
$crystal = 1000000

geht nicht, denn der R/C Oszillator läuft mit 9.6MHz und der Teiler ist 
8 im Lieferzustand = 1200000.

Wobei das hier wurscht sein sollte, denn es wird kein Wait und auch kein 
UART verwandt, wofür der Compiler die Frequenz genau wissen muss. Ist 
also von mir nur der Vollständigkeit halber erwähnt.

Die Variablen als IRam zu definieren ist recht sinnfrei, solange Du die 
PUSH/POP Orgie in der Interrupt Routine hast, die 26 Register auf den 
Stack schiebt und wieder runterholt. Wenn's schnell gehen soll, dann 
NOSAVE verwenden und Register selbst sichern.

Unter einer aktuellen Bascom Version läuft Dein Code, auch im AVR Studio 
getestet.

Solltest Du eine gaaaanz alte Bascom Version besitzen, so musst Du auch 
noch:
Start Timer0

schreiben, damit der startet.

Das hier:
Tccr0 = &H0D

hätte versucht den Timer0 in einen Modus zu versetzen, den es nicht 
gibt. Genausowenig gibt es einen Prescaler von 4096 dafür.

TCCR0 kann ersatzweise für TCCR0B verwendet werden.

Wenn Du den Timer über Register konfigurieren willst, dann würde der 
Timer0 mit Prescaler 64 starten mit:
TCCR0 = 3

Oder leserlicher:
TCCR0 = Bits(CS01, CS00)

Autor: Christoph Baumgartner (elgigo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also,

entweder liegt es an der Demo oder ich bin zu doof. In der Simulation 
geht nix und auf dem Tiny auch nix.
mir fällt nix mehr ein...

danke trotzdem....

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie alt ist die Demo ? Version ?

Pack doch mal die erzeugten Files, sollten 8 Stück inklusive der .bas 
sein, in ein Zip und stell sie hier rein. Heut' kann ich sie evtl. noch 
anschauen, morgen bin ich verreist.

Autor: Christoph Baumgartner (elgigo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen!

Bin gestern leider nicht mehr online gekommen weil sich mein Laptop 
geschrottet hat. Poste das File aber trotzdem, vll findets ja jemand 
anders raus

Danke!
MFG

Autor: Christoph Baumgartner (elgigo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat niemand eine Idee?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann mich nur wiederholen

[quote]
Schalte doch einfach mal dein Led im Timer_int wahlweise ein oder aus,
dann weißt du ob der Interrupt ausgelöst wird. Je komplizierter du
deinen Nachweis für den Aufruf gestaltest (das ganze HäckMäck mit Imp
und Counter), desto größer wird die Gefahr, dass du dir genau in diesem
HäckMäck zusätzliche Fehler einhandelst.
[/quote]

Du hast dir schon wieder einen Fehler in der Hauptschleife eingehandelt!
Wenn du eine Funktionalität testen willst, dann mach den Code so einfach 
wie möglich. Je weniger Spielraum du dir für Fehler lässt, umso besser. 
Je umfangreicher der Code, desto mehr Möglichkeiten für Fehler.

So einfach ist das.

-> Du willst wissen, ob die Timer_int aufgerufen wird.
Dann mach dir den verdammten Nachweis dafür auch in die Timer_int 
hinein. Und zwar direkt und nicht über 25 Ecken.


PS: Ich weiß nicht, ob die Timer_int überhaupt aufgerufen wird. Ich hab 
weder einen Tiny13 noch BASCOM hier. Aber das erste was ich täte ist: in 
der Timer_int irgendetwas ein/ausschalten um zu sehen, ob die überhaupt 
aufgerufen wird.

Autor: Wolfgang Heinemann (frickelkram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das Programm ist ja übersichtlich ;-) Auf jeden Fall mal die LED aus der 
IRQ-Routine ansteuern, das erhellt ungemein ...

Der ATTiny13 hat einen umfangreicheren Timer als die anderen, kleinen 
Atmel Prozessoren. Es gibt zusätzliche Steuerbits um den Modus fest zu 
legen. Ich habe mich schon einige Zeit mit dem Teil herum geschlagen, 
weil der Timer nicht das gemacht hat was ich wollte. Hier ein Auszug aus 
einem meiner Programme. Damit läuft der Timer im Interrrupt.

/* timer0 */
ISR (TIM0_COMPA_vect)
{
  PORTB ^= (1<<SPEAKER); 
}

.. snip ..

int main(void)
{

.. snip ..

  /* Init timers */
  /* phase correct PWM until TOP */
  /* timer generating square wave with 1kHz */
  TCCR0B |= T0div8;
  TCNT0 = 0;
  OCR0A = FRQADJ;
  TIFR0 = 0;
  TCCR0A |= (1<<COM0A0)|(1<<WGM01);

  
   /* switch on the IRQ handling */
   TIMSK0 |= (1<<OCIE0A);
   sei();

.. snip() ..

}

Wichtig: Im Datasheet die Steuerbits genau nachlesen.

Andere Lösungen:
http://www.bitartist.org/2008/07/timer-interrupt-o...
http://www.franzis.de/elo-das-magazin/mikrocontrol...
http://www.bitartist.org/2008/07/ctc-mode-on-tiny13.html

Autor: Wolfgang Heinemann (frickelkram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, noch was ...
Wie sieht die verwendete "ATTiny13.dat" aus? Ich habe mal eine verwendet 
die in Wirklichkeit für den ATTiny12 geschrieben war und im Bereich der 
Timer nicht 100%ig richtig war ...
Prüfe mal die Register Definitionen für die Timer Register gegen die 
Angaben im Datasheet.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

> PS: Ich weiß nicht, ob die Timer_int überhaupt aufgerufen wird. Ich hab
> weder einen Tiny13 noch BASCOM hier. Aber das erste was ich täte ist: in
> der Timer_int irgendetwas ein/ausschalten um zu sehen, ob die überhaupt
> aufgerufen wird.

Ich hab mir jetzt BASCOM geholt und installiert.
Die Timer_int wird laut Simulation aufgerufen.

Allerdings dauerte es rund 230 ms bis Count den Wert 6 erreicht hat. 
Hochgerechnet auf 255 (wenn die Led toggelt) würde es daher rund 9 
Sekunden dauern, bis sich der Zustand der LED ändert.

Autor: Christoph Baumgartner (elgigo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang Heinemann schrieb:
> Ach, noch was ...
> Wie sieht die verwendete "ATTiny13.dat" aus? Ich habe mal eine verwendet
> die in Wirklichkeit für den ATTiny12 geschrieben war und im Bereich der
> Timer nicht 100%ig richtig war ...
> Prüfe mal die Register Definitionen für die Timer Register gegen die
> Angaben im Datasheet.

Ich glaube du hast recht. Ich hab das nur das regfile auf m8def.dat 
geändert und in der Simu funzt es. Ist aber seltsam, hab mir die demo 
erst vor 2 Wochen geladen. Kann mal jemand sein File für den Tiny13 
posten bitte?

MFG
Christoph

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.