mikrocontroller.net

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


Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OliverK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
;Port toggeln
  in temp, PINC  <<<<<<<<<<<< ???
  com temp
  out PORTC, temp

Autor: crazy horse (Gast)
Datum:

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

Autor: kamil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: kamil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke an alle

Autor: kamil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi stefan,
hast du es schon probiert?
geht es ?
grüsse

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OliverK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.