Forum: Mikrocontroller und Digitale Elektronik problem: led blinken (über timer interrupt)


von stefan (Gast)


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

von OliverK (Gast)


Lesenswert?

;Port toggeln
  in temp, PINC  <<<<<<<<<<<< ???
  com temp
  out PORTC, temp

von crazy horse (Gast)


Lesenswert?

immer wieder dasselbe, ohne jetzt weiter in das Programm eingestiegen zu
sein:
16bit-Schreiboperationen:
"consequently, the high byte must be accessed first..."

von kamil (Gast)


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

von kamil (Gast)


Lesenswert?

hi nochmal,
wenn ich nix falsch verstanden habe,
dann ist doch das TCCR1A und TCCR1B für die initialisierung der
timers.
versuchs mal mit TCCR1A=0x00;
TCCR1B=0x05; als feste werte.
grüsse

von stefan (Gast)


Lesenswert?

danke an alle

von kamil (Gast)


Lesenswert?

hi stefan,
hast du es schon probiert?
geht es ?
grüsse

von stefan (Gast)


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

von OliverK (Gast)


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.

von stefan (Gast)


Lesenswert?

Hi Oliver!

Habe nach deinem Posting natürlich auch PORTC ausprobiert und hat auch
funktioniert, aber ich mach es jetzt nach der Doku mit PINC.

lg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.