logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega88][asm] - Timer1 i OCR1A źle odmierza czas

grysek 25 Lis 2009 22:10 1846 3
REKLAMA
  • #1 7309190
    grysek
    Poziom 19  
    Witam,

    Napisałem taki oto programik który ma za zadanie zmieniac stan diody co około jedną sekunde (odrazu dodam że nie chodziło mi o odmierzenie dokładnej sekundy tylko o opóźnienie). Wyliczyłem że przy preskalerze 256 timer1 musi zliczyć do 31250 żeby odczekał sekunde (taktowanie 8Mhz). Ustawiłem też bit WGM12 dzięki czemu Zawartość licznika TCNT1 bedzie kasowana po osiągnięciu wartości 31250 i zmianie stanu wyprowadzenia OCR1A na przeciwny. I wszystko wygląda ok ale po włączeniu okazuje się że dioda pulsuje tak szybko że wygląda jakby świeciła ciągle. Co jest nie tak?

    Proszę o pomoc bo siedze już nad tym dosyć długo ;/
    .include "m88def.inc"
    .list
    
    .def acc = r16
    
    .equ LED =  3
    
    .cseg
    .org 0
    rjmp init_proc
    
    
    init_proc:
    ldi 		acc, low(RAMEND) 
    out			SPL, acc
    ldi 		acc, high(RAMEND)
    out 		SPH, acc
    ldi 		acc, 0xFF
    out			DDRB, acc
    ldi 		acc, (1 << COM1A0)
    sts			TCCR1A, acc
    ldi			acc, (1 << OCIE1A)
    sts			TIMSK1, acc
    ldi 		acc, (1 << CS12) | (1 << WGM12)
    sts			TCCR1B, acc
    ldi			acc, low(31250)
    sts			OCR1AL, acc
    ldi			acc, high(31250)
    sts			OCR1AH, acc
    sei
    
    
    tu:
    rjmp	tu
  • REKLAMA
  • Pomocny post
    #2 7309416
    ZbeeGin
    Poziom 39  
    A po co włączasz przerwania skoro nie napisałeś procedur ich obsługi? I dlaczego najpierw ładujesz część młodszą do OCR a potem starszą, a nie na odwrót jak to zalecają? I dlaczego dziwisz się, że kod potem nie działa?
  • REKLAMA
  • #3 7309633
    grysek
    Poziom 19  
    Masz rację poprawiłem tak jak mówisz i działa :D dzieki serdeczne
REKLAMA