- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: ATtiny25 Timer0 läuft nicht

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    01.02.2008
    Beiträge
    12

    ATtiny25 Timer0 läuft nicht

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Guten Tag, ich bin neu hier im Forum und neu mit dem Attiny 25 und bitte um Hilfe (und nachsicht)
    Ich möchte den Timer 0 bentzen und wenn ich ihn mit
    ldi mp,0x05 ; teiler 1024
    out TCCR0B,mp
    und port b aus ausgang setze
    ;port b setzen
    ldi mp,0b11111111
    out DDRB,mp
    und dann mit
    loop:
    in mp,TCNT0
    cpi mp,0
    brnq loop
    abfrage, dann bleibt er in dieser Schleife hängen, im Simulator und wohl auch im Cpip läuft der Timer nicht los.
    Muss ich den Timer noch irgendwie anders initialisieren?
    Vielen Dank schon mal im Voraus

  2. #2
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    Muss ich den Timer noch irgendwie anders initialisieren?
    ja, in TIMSK das Bit OCIE0 (Timer/Counter0 Output Compare Match Interrupt Enable) oder TOIE0 (Timer/Counter0 Overflow Interrupt Enable)
    setzen.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    01.02.2008
    Beiträge
    12

    Timer läuft, das Problem lag woanders

    Sorry, der Timer läuft das Proplem lag in der Auswertung

    So blinkt schön vor sich hin

    .NOLIST
    .INCLUDE "c:/Atmel/tn25def.inc"
    .LIST
    .DEF mp = R16
    .DEF z1 = R17
    rjmp main
    main:
    ldi mp,0
    ldi z1,0

    ;timer starten
    ldi mp,0x05
    out TCCR0B,mp
    ;port b setzen
    ldi mp,0b11111111
    out DDRB,mp
    loop:
    in mp,TCNT0
    cpi mp,0
    brne loop
    loop2:
    in mp,TCNT0
    cpi mp,0
    breq loop2
    com z1
    out PORTB,z1
    rjmp loop

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    ja, in TIMSK das Bit OCIE0 (Timer/Counter0 Output Compare Match Interrupt Enable) oder TOIE0 (Timer/Counter0 Overflow Interrupt Enable)
    setzen.
    Warum ?
    Muß man immer ein Interrupt nutzen ?
    Und wenn Du sowas schreibst, solltest Du noch dabei schreiben, daß man noch die Interrupts erlauben soll, einen Vektor schreiben muß, außerdem noch den Stackpointer usw.
    Wie ich sehe willst Du PortB invertieren, mach das so:
    Code:
    loop:
       in mp,TIFR
       sbrs mp,TOV0
       rjmp loop
       ldi mp,(1<<TOV0)
       out TIFR,mp
       com z1
       out PORTB,z1
       rjmp loop
    Und zwar ohne Interrupt

    Schau im Dattenblatt, was TIFR und TOVO zu sagen haben und wenn Du das verstanden hast, kannst Du Dich mit der Interruptversion auseinander setzen.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    01.02.2008
    Beiträge
    12

    Vielen Dank

    Vielen Dank für die Hinweise, ich bin mit meinem erstenVersuch ganz zufrieden, letzlich ist es ja nicht sinnvoll, die Timer im Polling Modus nur mit Zählen zu beschäftigen, meine nächste lektion sind die Interrupts

    Herzlich
    Klaus

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    letzlich ist es ja nicht sinnvoll, die Timer im Polling Modus nur mit Zählen zu beschäftigen
    Sag das nicht, manchmal ist es sinnvoller zu warten, als den Interrupt zuzulassen

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    01.02.2008
    Beiträge
    12
    Hallo Sebastian, hier isnd meine Schularbeiten, war nicht leicht aber sehr interessant
    loop:
    in mp,TIFR ; holt interrupt Flag Register in mp
    sbrs mp,TOV0 ; prüft ob TOV0 gesetzt ist
    rjmp loop ; wenn ja überspringe den nächsten Befehl sonst loop
    ldi mp,(1<<TOV0) ; setze TOV0 in mp auf 1 was TOV0 klärt
    out TIFR,mp ; out in Interrupt flag reg
    com z1
    out PORTB,z1
    rjmp loop

    wenn ich das so nachrechne, komme ich mit dem Vorteiler 1024
    auf eine Blinkfrequenz von 0,38 Hertz
    Heißt das dass der Controller mit 1 Mhz die Befehle abarbeitet
    0,3814 X 256 X 1024 = 1Mhz
    Der Resonator hat 8 Mhz, geht es auch schneller als 1 Mhz?
    Danke
    Klaus

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo Klaus,

    ldi mp,(1<<TOV0) ; setze TOV0 in mp auf 1 was TOV0 klärt
    Ich weiß nicht...
    Hier wird TOV0 nicht 1 gesetzt, sondern durch schreiben einer 1 in TOVO (und Achtung, nur TOV0 sonst keinen anderen Bit) wird TOV0 gelöscht.

    Schau mal auf meiner HP rein Da habe ich das alles (hoffentlich) verständlich beschrieben

    Deine Rechnerei ist soweit richtig alle 262 mS wird PORTB umgeschaltet.

    Was den Takt angeht, ja Tiny 25 wird mit 8MHz getaktet aber standardmäßig ist auch CLKDIV8 Fuse gesetzt, wo der Takt natürlich auf 1MHz runtergesetzt wird.

    Arbeitest Du mit Studio?

    Schau Dir dann die Fuses an CLKDIV8 müsste programmiert sein(Achtung
    programmiert -> 0 unprogrammiert -> 1)
    So ist es in der Hardware und im Studio bis 4.13.571 war es auch so (programmiert kein Häckchen unprogrammiert Häckchen).

    In Studio 4.13.571 haben sie die Logik gedreht

    Alles was Du jetzt machst, machst Du auf eigene Verantwortung...

    Fuses mit Read auslesen,
    bei CLKDIV8 Häckchen machen, oder entfernen je nach Version(Sonst nichts ändern)
    Fuses mit write schreiben.

    Aber pass auf, je nachdem was Du sonst alles bei Fuses verstellst, kannst Dich ausperen und Dein µC läßt sich nicht mehr ansprechen.

    So, was jetzt noch interessant ist, Du kannst Den Clockprescaller (genauso wie bei Timer) zwischen 1-256 verstellen .
    \/
    Das ist sehr praktisch bei Batteriebetrieb und vor allem, wenn man den Powerdownsleepmodus nicht nutzen kann.
    Aber schau mal selbst im Dattenblatt nach Register CLKPR da wird alles erklärt.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    01.02.2008
    Beiträge
    12
    Hallo Sebastian,
    vielen Dank, das mit der Clockrate lasse ich ersteinmal, mit 1 Mhz ist gut rechnen.
    Ich war auf deiner HP und habe mich über die Beispiele gefreut. Habe das Interruptprogramm abgetippt und versucht die Register an den Tiny 25 anzupassen, leider ohne Erfolg, trotz intensiver Suche im Datenblatt
    Kannst du mir die entsprechen Register nennen
    .org OC2addr -- der 25 hat Timer 0 und 1, ich finde keinen Restevoektor hierfür (im Datenblatt S. 50)
    OCR2 könnte OCR0A sein es gibt auch OCR0B
    TCCR2 könnte TCCR0B sein (dort wir prescaler eingestellt
    OCIE2 könnte OCIE0A sein dazu gibt es im Datenblatt keinen Hinweis auf den dazugehörenden Interruptvektor
    Ich hoffe, du kannst nachvollziehen , wo ich hänge

    so ganz für dummies ist deine Seite ja nicht - wenn man nicht nur abtippt sondern auch mitdenken will
    Herzlich Klaus

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Ja,ja, die Vektoren, die machen die Assemblerprogramme leider nicht 100% kompatibel

    Es gibt aber eine einfache Abhilfe:
    Man macht sich im Falle von tn25 die tn25def.inc Datei auf, sie liegt unter Atmel/Assembler2/Appnotes und scrollt ganz zum Ende.
    Jetzt sieht man sowas:
    Code:
    ; ***** INTERRUPT VECTORS ************************************************
    .equ	INT0addr	= 0x0001	; External Interrupt 0
    .equ	PCI0addr	= 0x0002	; Pin change Interrupt Request 0
    .equ	OC1Aaddr	= 0x0003	; Timer/Counter1 Compare Match 1A
    .equ	OVF1addr	= 0x0004	; Timer/Counter1 Overflow
    .equ	OVF0addr	= 0x0005	; Timer/Counter0 Overflow
    .equ	ERDYaddr	= 0x0006	; EEPROM Ready
    .equ	ACIaddr	= 0x0007	; Analog comparator
    .equ	ADCCaddr	= 0x0008	; ADC Conversion ready
    .equ	OC1Baddr	= 0x0009	; Timer/Counter1 Compare Match B
    .equ	OC0Aaddr	= 0x000a	; Timer/Counter0 Compare Match A
    .equ	OC0Baddr	= 0x000b	; Timer/Counter0 Compare Match B
    .equ	WDTaddr	= 0x000c	; Watchdog Time-out
    .equ	USI_STARTaddr	= 0x000d	; USI START
    .equ	USI_OVFaddr	= 0x000e	; USI Overflow
    
    .equ	INT_VECTORS_SIZE	= 15	; size in words
    Was einem auffält, es gibt für Timer 0 direkt 2 Compare Match Kanäle, die auch mit 2 verschiedenen Pins verbunden werden können PB0 und PB1.
    Das ist aber für den Fall egal.
    Du suchst Dir einfach einen aus und nimmst entweder den OC0Aaddr oder den OC0Baddr Vektor.
    Dann aber anstatt von OCR2 OCR0A bzw. OCR0B und der Rest genauso

    Du kannst es auch im Simulator durchspielen...

    Tja, die Sache mit Dummies he,he
    Ich wollte was einfaches schreiben,was jeder versteht, mit anderen Tutorials haben manche Leute Probleme, und wenn man versucht irgendwas auf eine lockere Weise zu übermitteln wird das eher verstanden.

    Ob es mir gelungen ist weiß ich nicht so recht, dafür gibt es zu wenig Feedback, leider wollen immer weniger Leute was mit Assembler zu tun haben
    Es soll ja nicht heißen, daß man nur noch Assembler macht, ich programmiere öfter auch in C, aber so ein Crashkurs von sag ich mal 2 Wochen würde sehr vielen Leuten gut tun...

    Gruß Sebastian

    P.S.
    Wie ich sehe hast Du doch schon einiges selber rausgefunden
    Software is like s e x: its better when its free.
    Linus Torvald

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test