problem: led blinken (über timer interrupt)

Gast #54987
Lesenswert?

Hallo!

uC: ATmega8
Entwicklungsumgebung AVRStudio

folgendes problem mit nachfolgendem Code:
Nach reset wird auf PortC 0b?1111111 ausgegeben.
Wenn der Timer Interrupt kommt, wird PortC eingelesen, invertiert und
wieder auf PortC ausgegeben. (sollte dann etwa auf 0V ausgegeben
werden). An den Ports liegt allerdings 2,5V (Vcc/2) an.

wenn ich direkt auf den PortC 0x00 ausgebe, erhalte ich das gewünschte
Ergebnis.

danke für eure hilfe

stefan
----------------------------------------------------------------------
.include "m8def.inc"


.def temp = r16

.equ AUS = 0x00
.equ EIN = 0xff
.equ TIMERSET = 0x00

.org 0x000
  rjmp RESET
    reti;     rjmp EXT_INT0        ; IRQ0 Handler
    reti;     rjmp EXT_INT1        ; IRQ1 Handler
    reti;     rjmp TIM2_COMP
    reti;     rjmp TIM2_OVF
    reti;     rjmp TIM1_CAPT       ; Timer1 Capture Handler
    rjmp TIM1_Compare_A           ; Timer1 CompareA Handler
    reti;     rjmp TIM1_COMPB      ; Timer1 CompareB Handler
    reti;     rjmp TIM1_OVF        ; Timer1 Overflow Handler
    reti;     rjmp TIM0_OVF        ; Timer0 Overflow Handler
    reti;     rjmp SPI_STC         ; SPI Transfer Complete Handler
    reti;     rjmp USART_RXC       ; USART RX Complete Handler
    reti;     rjmp USART_DRE       ; UDR Empty Handler
    reti;     rjmp USART_TXC       ; USART TX Complete Handler
    reti;     rjmp ADC             ; ADC Conversion Complete Interrupt
Handler
    reti;     rjmp EE_RDY          ; EEPROM Ready Handler
    reti;     rjmp ANA_COMP        ; Analog Comparator Handler
    reti;     rjmp TWSI            ; Two-wire Serial Interface Handler
    reti;     rjmp SPM_RDY         ; Store Program Memory Ready
Handler

RESET:
  ;set stack
  ldi temp, LOW(RAMEND)
        out SPL, temp
        ldi temp, HIGH(RAMEND)
        out SPH, temp

  ;set port
  ldi temp, 0xff
  out DDRC, temp
  ldi temp, EIN
  out PORTC, temp

  ;set timer
  ldi temp, (1<<CS11) | (1<<CS10)
  out TCCR1B, temp
  ldi temp, 1<<OCF1A
  out TIFR, temp
  ldi temp, 1<<OCIE1A
  out TIMSK, temp

  ldi temp, 0x09
  out OCR1AL, temp
  ldi temp, 0x3D
  out OCR1AH, temp

  sei

  ldi temp, 0x00
  out TCNT1L, temp
  out TCNT1H, temp
work:
  rjmp work

TIM1_Compare_A:
  ;Werte sichern
  push temp
  in temp, SREG
  push temp
  ;Port toggeln
  in temp, PINC
  com temp
  out PORTC, temp
  ;Timer zurücksetzten
  ldi temp, 0x00
  out TCNT1L, temp
  out TCNT1H, temp
  ;Werte zurückspielen
  pop temp
  out SREG, temp
  pop temp
  reti
Gast #54990
Lesenswert?

hi,
ich vermute,
das die timer frequenz so hoch ist,
das du dann einen PWM ausgang gebastelt hast und nun eben bei 50% an
und 50% aus eben genau die hälfte der spannung.
sezt mal den die timerfrequenz kleiner.
grüsse
Gast #54994
Lesenswert?

hi kamil!

joop es funzt.

einerseits der tipp mit dem pwm war nicht schlecht (falsches
teilerverhältnis 64 statt 1024);andererseits die schreiboperation high
vor low byte dürfte auch das seinige beigetragen haben.

was ich nicht nachvollziehen kann ist, dass ich den wert nicht über
PINC einlesen kann, da dies ja in der atmel doku eigentlich beschrieben
wird.

lg
Gast #54995
Lesenswert?

@stefan

Ähh? Das mit PINC war ein, in übernächtigter Duseligkeit geborenen,
Schnellschuß von mir. Wie machst Du es denn jetzt??? Ich habe auch noch
mal nachgeschaut. PINC sollte eigentlich gehen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren