- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 4 von 4

Thema: Tiny12: Timer0 (Anfänger)

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253

    Tiny12: Timer0 (Anfänger)

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Leute!

    Ich habe gestern mit einem kleinen (bestimmt sehr aufwändigen Lauflicht) angefangen, Asm zu programmieren. Ich habe natürlich das RN-WiKi geradezu aufgesogen, was Assembler angeht. Ausserdem auch gängige anderen Seiten. Aber zurück zum Thema: Beim Lauflicht hab ich ne Verzögerung gebastelt, indem immer 1 Byte hochgezählt wird, wenn es 255 ist, wird ein anderes Byte um 1 hochgezählt. Wenn dieses nun auch 255 ist, geht das Lauflicht weiter. Also quasi 255^2 Scheifendurchläufe. Sagen wir so: Es funktioniert..

    Nun wollte ich sowas mal mit dem Timer machen. Zuerst hab ich nur versucht, mit nem Prescaler von 1024 zu Werke zu gehen. Allerdings schien mir das zu schnell, also lasse ich pro OVerflow nen Byte hochzählen und bei dessen "Overflow" das Lauflicht (was in diesem Fall nen Binärzähler ist) weiterlaufen zu lassen. Allerdings will das Teil nicht. Was passiert ist dass alle LEDs an den Ports so halb leuchten, PWM-mäßig. Allerdings ist kein "Takt" zu erkennen, wenn ich die Schaltung im Dunkeln schnell hin-und herschwenke... Zumindest bei 2 LEDs (den 8ern und den 16ern) sollte dies allerdings der Fall sein. Hab ich den Timer überhaupt richtig eingestellt? Hier mein Code:

    Code:
    #include "tn12def.inc"
    
    .org 0x000
    rjmp _main 
    .org OVF0addr			 ;Vektor für Timer0 Overflow
    rjmp _timer0    		  ;Interrupt Handler anspringen
    
    
    _definitions:
    
    ldi R25, 255			    ;Threshold für Verzögerung
    ldi R16, 31				
    out DDRB, R16			 ;PortB as Output
    ldi R16, 7
    out TCCR0, R16			;Timer0 on, Prescaler 1024
    ldi R21, 21			     ;R21 mit 21 initialisieren
    sei					;Interrupts enablen
    
    _main:
    out PortB, R21			  ;R21 anzeigen
    rjmp _main
    
    _timer0:
    inc R20				     ;R20 um 1 hoch
    cp R20, R25			  ;Wenn Zähler = 255...
    brne  _main			  ;...dann springe zu _main
    inc R21				     ;anderfalls R21 incremetieren
    rjmp _main

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

    willkommen bei Assembler

    So wie ich es sehe hast Du eine Kleinigkeit noch vergessen, Du mußt den Interrupt im TIMSK noch einschalten
    Code:
    ldi R16,(1<<TOIE0)
    out TIMSK,R16
    Schau ml im Dattenblatt nach TIMSK

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

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    Hallo Goblin,

    du hast noch etwas übersehen.
    Dein Programm wird die Port und Timerdefinitionen nie ausführen, da du am Anfang zu _main und nicht zu _definitions springst.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    10.10.2004
    Ort
    Niedersachsen
    Beiträge
    60
    Hi!
    Die Int-Routine darf nur mit reti beendet werden.
    Wirf mal den Simulator an, da lernst Du viel.

    Gruß, olfi

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress